0001 Persistent Message Queues Overview
0002 ==================================
0003 :doctype: book
0004
0005 Persistent queues
0006 -----------------
0007 EnduroX system is built on kernel based real-time IPC queues. Which by definition are not persistent.
0008 When server is restarted, memory data is lost, thus the data in message queues are lost. In some of
0009 the application scenarios persistent messaging is required. Thus EnduroX offers standard ATMI calls
0010 such as 'tpenqueue()' and 'tpdequeue()'. System also supports automatic queues, where messages
0011 are automatically forwarded to configured services.
0012
0013 Messages are stored in file system. To ensure transactional operation, file move/rename is
0014 employed which by it self (in the terms of one file system) is transactional.
0015
0016 The queues are grouped into queue spaces. Queue space grouping element of multiple queue servers.
0017 Queue space basically is service name for backing 'tmqueue' server. Each queue server
0018 can stores it's data in specified file system folders. The 'tmqueue' server works in tandem with
0019 'tmsrv' to ensure the compatibility with global transaction processing.
0020
0021 How the persistent queues work?
0022 -------------------------------
0023 The persistent queues in EnduroX application server are provided by special ATMI server, named
0024 "tmqueue". To start using these queus, firstly you have to configure the 'tmqueue' and paired
0025 'tmsrv'.
0026
0027 The queue processing can be devided in following steps:
0028
0029 1. 'tmqueue' advertizes queue space services
0030 2. Caller invokes 'tpenqueue()' ATMI API call. This calls the 'tmqueue' server with passed in buffer
0031 data and other flags.
0032 3. 'tmqueue' server recieves the request, saves lookups the queue, and creates the linked list in
0033 memory where to store the message. In the same time message is written to disk in 'active' folder.
0034 Initially message is marked as locked, the message becomes dequeueable at the point when XA
0035 transaction is committed. At the commit point, the 'tmsrv' with loaded EnduroX queue driver,
0036 completes the message (moves it to 'committed' folder). At the smae point 'tmsrv' sends the notification
0037 to 'tmqueue' to unlock the message. NOTE: It is not possible to enqueue and dequeue same message
0038 in single transaction.
0039 4. When message is unlocked, it is available for 'tpdequeue()'. Where the application invokes this function
0040 and, it calls the 'tmqueue()' for the message. If message is found it again becomes locked, and command
0041 file is issued to disk for message file removal. Once the dequeue transaction is committed, the XA driver
0042 completes the operation, by removing the command file, message file and sending notification back
0043 to 'tmqueue', that command 'REMOVE' is completed. At this point 'tmqueue' server removes the message
0044 completely from memory.
0045 5. In case if queue is defined as 'automatic', the 'forward' threads from 'tmqueue' server
0046 begins sending the message to destination ATMI service. If service call fails, the call is
0047 retried configured number of times. If call succeeds and reply queue is sent, then message is submitted
0048 to reply queue. If message fails (number of attempts exceeded) and failure queue is defined,
0049 the forwarder thread will submit the message to failure queue. 'TPQCTL' flags in this scenario is
0050 preserved.
0051
0052 Schematically internals of the 'tmqueue' and API works can be displayed as follows:
0053
0054 image:tmqinternals.png[caption="Figure 1: ", title="tmqueue internals", alt="tmqueue"]
0055
0056
0057 How to use EnduroX persistent queues
0058 ------------------------------------
0059 This section gives some oversight how to use persistent queues. There are two type
0060 of usages possible. One is that process submits the message to the queue and another
0061 process manually dequeues the message, that is depicted here:
0062
0063 [dia, tpenqueue_tpdequeue.dia, tpenqueue_tpdequeue.png, x300]
0064 -------------------------------
0065 -------------------------------
0066
0067 And another use is that process does 'tpenqueue()' to automatic queue, and message is automatically
0068 forwarded to destination service. The schematics looks like this:
0069
0070 [dia, tpenqueue_auto.dia, tpenqueue_auto.png, x300]
0071 -------------------------------
0072 -------------------------------
0073
0074 For 'tpenqueue()' and 'tpdequeue()' passed in buffers must be allocated with 'tpalloc()'.
0075 For UBF, STRING and JSON buffers, the actual buffer length on enqueue doesn't matter, it is
0076 detected from data data inside. For array buffer, it does play a role. When doing
0077 'tpdequeue()', the the buffer type might be changed, if message have a different data
0078 type.
0079
0080
0081 'tmqueue' ATMI server configuration
0082 -----------------------------------
0083 To configure queue sub-system, you need to start at-least one instance of 'tmqueue' server and
0084 one instance of 'tmsrv'. They both must run in the same XA environment. For running just pure
0085 ATMI client, following entries to 'ndrxconfig.xml' shall be done (serverid and count (min/max)
0086 can be changed):
0087
0088 ---------------------------------------------------------------------
0089 ...
0090 <servers>
0091 <server name="tmsrv">
0092 <max>1</max>
0093 <srvid>1</srvid>
0094 <sysopt>-e /opt/app1/log/tmsrv.log -r -- -t1 -l/opt/app1/var/RM1</sysopt>
0095 </server>
0096 <server name="tmqueue">
0097 <max>1</max>
0098 <srvid>100</srvid>
0099 <sysopt>-e /opt/app1/log/tmqueue.log -r -- -m MYSPACE -q /opt/app1/conf/q.conf -s1</sysopt>
0100 </server>
0101 </servers>
0102 ...
0103 ---------------------------------------------------------------------
0104
0105 From above example it could be seen, that there are no setup for folder where to store
0106 the queue data. Queue folder is setup in in XA open string, thus it goes to
0107 'NDRX_XA_OPEN_STR' and 'NDRX_XA_CLOSE' environment variables.
0108
0109 For example if we are going to store the message data into '/opt/app1/var/MYSPACE' folder, then
0110 XA config looks like this:
0111
0112 ---------------------------------------------------------------------
0113 export NDRX_XA_RES_ID=1
0114 export NDRX_XA_OPEN_STR="/opt/app1/var/MYSPACE"
0115 export NDRX_XA_CLOSE_STR=$NDRX_XA_OPEN_STR
0116 # Static registration:
0117 export NDRX_XA_DRIVERLIB=libndrxxaqdisks.so
0118 export NDRX_XA_RMLIB=libndrxxaqdisk.so
0119 export NDRX_XA_LAZY_INIT=1
0120 ---------------------------------------------------------------------
0121
0122 In this sample, static registration XA driver (libndrxxaqdisks.so) will be use. Not if
0123 your application process wants to perform the enqueue in transactional mode, then it must be started
0124 with valid XA environment.
0125
0126 Queue configuration
0127 -------------------
0128 We will configure three queues here. The default queue (recommended), one manual queue
0129 and one automatic queue. From above 'ndrxconfig.xml' can be seen that queue configuration
0130 is given in '/opt/app1/conf/q.conf' file.
0131
0132
0133 ---------------------------------------------------------------------
0134 @,svcnm=-,autoq=n,tries=0,waitinit=0,waitretry=0,waitretryinc=0,waitretrymax=0,memonly=n
0135 MYQ1,svcnm=-,autoq=n,tries=0,waitinit=0,waitretry=0,waitretryinc=0,waitretrymax=0,memonly=n,mode=fifo
0136 MYQ2,svcnm=TESTSVC,autoq=y,tries=5,waitinit=1,waitretry=10,waitretryinc=5,waitretrymax=30,memonly=n,mode=lifo
0137 ---------------------------------------------------------------------
0138
0139 From above sample data, MYQ2 will send messages automatically to "TESTSVC" service, by initially waiting
0140 1 second in queue, if message fails, it it will send it again after 15 (10+5) seconds, if it fails again,
0141 it will send the message after 20 (10+5+5 as it is try 3) seconds, up till 30 sec max wait time between retries.
0142
0143 Queue 'MYQ1' is defined as manual, and valid only for 'tpdequeue()' call. For manual queues, service name (svcnm)
0144 and wait parameters are not actual.
0145
0146 Sample ATMI client for enqueue & dequeue
0147 ----------------------------------------
0148 This section contains C code for ATMI client which enqueues the message to Q and the
0149 dequeues it.
0150
0151 ---------------------------------------------------------------------
0152
0153 /*
0154 file: qclient.c
0155 */
0156
0157 #include <string.h>
0158 #include <stdio.h>
0159 #include <stdlib.h>
0160 #include <memory.h>
0161 #include <atmi.h>
0162
0163
0164 #define SUCCEED 0
0165 #define FAIL -1
0166
0167 int main(int argc, char** argv)
0168 {
0169
0170 int ret = SUCCEED;
0171 TPQCTL qc;
0172 int i;
0173
0174 /* Initial test... */
0175 for (i=0; i<15; i++)
0176 {
0177 char *buf = tpalloc("CARRAY", "", 1);
0178 char *testbuf_ref = tpalloc("CARRAY", "", 10);
0179 long len=10;
0180
0181 printf("loop %d ... ", i);
0182
0183 testbuf_ref[0]=0;
0184 testbuf_ref[1]=1;
0185 testbuf_ref[2]=2;
0186 testbuf_ref[3]=3;
0187 testbuf_ref[4]=4;
0188 testbuf_ref[5]=5;
0189 testbuf_ref[6]=6;
0190 testbuf_ref[7]=7;
0191 testbuf_ref[8]=8;
0192 testbuf_ref[9]=9;
0193
0194 /* alloc output buffer */
0195 if (NULL==buf)
0196 {
0197 fprintf(stderr, "tpalloc() failed %s\n",
0198 tpstrerror(tperrno));
0199 ret = FAIL;
0200 goto out;
0201 }
0202
0203 /* enqueue the data buffer */
0204 memset(&qc, 0, sizeof(qc));
0205 if (SUCCEED!=tpenqueue("MYSPACE", "MYQ1", &qc, testbuf_ref,
0206 len, TPNOTRAN))
0207 {
0208 fprintf(stderr, "tpenqueue() failed %s diag: %ld:%s\n",
0209 tpstrerror(tperrno), qc.diagnostic, qc.diagmsg);
0210 ret = FAIL;
0211 goto out;
0212 }
0213
0214 /* dequeue the data buffer + allocate the output buf. */
0215
0216 memset(&qc, 0, sizeof(qc));
0217
0218 len = 10;
0219 if (SUCCEED!=tpdequeue("MYSPACE", "MYQ1", &qc, &buf,
0220 &len, TPNOTRAN))
0221 {
0222 fprintf(stderr, "tpenqueue() failed %s diag: %ld:%s\n",
0223 tpstrerror(tperrno), qc.diagnostic, qc.diagmsg);
0224 ret = FAIL;
0225 goto out;
0226 }
0227
0228 /* compare - should be equal */
0229 if (0!=memcmp(testbuf_ref, buf, len))
0230 {
0231 fprintf(stderr, "Buffers not equal!\n");
0232 ret = FAIL;
0233 goto out;
0234
0235 }
0236
0237 printf("ok\n");
0238
0239 tpfree(buf);
0240 tpfree(testbuf_ref);
0241 }
0242
0243 if (SUCCEED!=tpterm())
0244 {
0245 fprintf(stderr,"tpterm failed with: %s\n", tpstrerror(tperrno));
0246 ret=FAIL;
0247 goto out;
0248 }
0249
0250 out:
0251 return ret;
0252 }
0253
0254
0255 ---------------------------------------------------------------------
0256
0257
0258 The code will be built with following command line (for Linux):
0259
0260 ---------------------------------------------------------------------
0261
0262 $ gcc qclient.c -o qcl -l atmiclt -l atmi -l ubf -l nstd -l rt -l dl -l m
0263
0264 ---------------------------------------------------------------------
0265
0266
0267 By assuming that runtime is started, we will try to run the tests:
0268
0269 ---------------------------------------------------------------------
0270
0271 $ xadmin start -y
0272 EnduroX v2.5.0 alpha, build May 16 2016 12:25:55
0273
0274 Enduro/X Middleware Platform for Distributed Transaction Processing
0275 Copyright (C) 2015, Mavimax, Ltd. All Rights Reserved.
0276
0277 This software is released under one of the following licenses:
0278 GPLv2 (or later) or Mavimax's license for commercial use.
0279
0280 EnduroX back-end (ndrxd) is not running
0281 ndrxd PID (from PID file): 25799
0282 ndrxd idle instance started.
0283 exec tprecover -k 0myWI5nu -i 1 -e /opt/app1/log/RECOVER -r -- -c10 :
0284 process id=25800 ... Started.
0285 exec tpevsrv -k 0myWI5nu -i 300 -e /opt/app1/log/TPEVSRV -r -N -s@TPEVPOST -- :
0286 process id=25801 ... Started.
0287 exec atmi.sv1 -k 0myWI5nu -i 1400 -e /opt/app1/log/ATMISV1 -r -- :
0288 process id=25802 ... Started.
0289 exec tmsrv -k 0myWI5nu -i 2000 -e /opt/app1/log/tmsrv.log -r -- -t1 -l/opt/app1/var/RM1 -- :
0290 process id=25803 ... Started.
0291 exec tmqueue -k 0myWI5nu -i 2010 -e /opt/app1/log/tmqueue.log -r -- -m MYSPACE -q /opt/app1/conf/q.conf -s1 -- :
0292 process id=25815 ... Started.
0293 exec cpmsrv -k 0myWI5nu -i 9999 -e /opt/app1/log/CPMSRV -r -- -i10 -k5 -- :
0294 process id=25847 ... Started.
0295 Startup finished. 6 processes started.
0296
0297 $ xadmin mqlc
0298 EnduroX v2.5.0 alpha, build May 16 2016 12:25:55
0299
0300 Enduro/X Middleware Platform for Distributed Transaction Processing
0301 Copyright (C) 2015, Mavimax, Ltd. All Rights Reserved.
0302
0303 This software is released under one of the following licenses:
0304 GPLv2 (or later) or Mavimax's license for commercial use.
0305
0306 ndrxd PID (from PID file): 25799
0307 Nd SRVID QSPACE QNAME FLAGS QDEF
0308 -- ----- --------- --------- ----- --------------------
0309 1 2010 MYSPACE @ @,svcnm=-,autoq=n,tries=0,waitinit=0,waitretry=0,waitretryinc=0,waitretrymax=0,mode=fifo
0310 1 2010 MYSPACE MYQ1 MYQ1,svcnm=-,autoq=n,tries=0,waitinit=0,waitretry=0,waitretryinc=0,waitretrymax=0,mode=fifo
0311 1 2010 MYSPACE MYQ2 MYQ2,svcnm=TESTSVC,autoq=y,tries=5,waitinit=1,waitretry=10,waitretryinc=5,waitretrymax=30,mode=lifo
0312
0313
0314 $ ./qcl
0315 loop 0 ... ok
0316 loop 1 ... ok
0317 loop 2 ... ok
0318 loop 3 ... ok
0319 loop 4 ... ok
0320 loop 5 ... ok
0321 loop 6 ... ok
0322 loop 7 ... ok
0323 loop 8 ... ok
0324 loop 9 ... ok
0325 loop 10 ... ok
0326 loop 11 ... ok
0327 loop 12 ... ok
0328 loop 13 ... ok
0329 loop 14 ... ok
0330
0331 ---------------------------------------------------------------------
0332
0333
0334 Managing the runtime
0335 --------------------
0336 This section contains overview of the 'xadmin' commands available for queue
0337 management.
0338
0339 From above test session, can be seen how to list the queues, defined in system, by
0340 issuing 'mqlc' (list configuration command). During the normal operations, system administrator might
0341 want to know, how many messages are present currently in queue and what are queue statistics. For this
0342 purpose 'mqlq' (list queues) command can be used.
0343
0344
0345 ---------------------------------------------------------------------
0346 $ xadmin mqlq
0347 EnduroX v2.5.0 alpha, build May 16 2016 12:25:55
0348
0349 Enduro/X Middleware Platform for Distributed Transaction Processing
0350 Copyright (C) 2015, Mavimax, Ltd. All Rights Reserved.
0351
0352 This software is released under one of the following licenses:
0353 GPLv2 (or later) or Mavimax's license for commercial use.
0354
0355 ndrxd PID (from PID file): 27208
0356 Nd SRVID QSPACE QNAME #QUEU #LOCK #ENQ #DEQ #SUCC #FAIL
0357 -- ----- --------- --------- ----- ----- ----- ----- ----- -----
0358 1 2010 MYSPACE MYQ1 0 0 15 15 0 0
0359 1 2010 MYSPACE @ 0 0 0 0 0 0
0360 1 2010 MYSPACE MYQ2 0 0 0 0 0 0
0361 ---------------------------------------------------------------------
0362
0363 The above listings shows, that from 'MYQ1' 15 messages was enqueued and 15 was dequeued.
0364 In some cases you might want to see the contents of the message in Q (if it is still there).
0365 You may use 'mqdm' (dump message) command. By modifying above example to not to remove messages
0366 from Q. We get following picture:
0367
0368 ---------------------------------------------------------------------
0369 $ xadmin mqlq
0370 Nd SRVID QSPACE QNAME #QUEU #LOCK #ENQ #DEQ #SUCC #FAIL
0371 -- ----- --------- --------- ----- ----- ----- ----- ----- -----
0372 1 2010 MYSPACE MYQ1 15 0 30 15 0 0
0373 1 2010 MYSPACE @ 0 0 0 0 0 0
0374 1 2010 MYSPACE MYQ2 0 0 0 0 0 0
0375 ---------------------------------------------------------------------
0376
0377 To see the messages in queue, use command 'xadmin mqlm' (list messages):
0378
0379 ---------------------------------------------------------------------
0380 NDRX> mqlm -s MYSPACE -q MYQ1
0381 ndrxd PID (from PID file): 27208
0382 Nd SRVID MSGID (STR/Base64 mod) TSTAMP (UTC) TRIES L
0383 -- ----- -------------------------------------------- ----------------- ----- -
0384 1 2010 UcnU2PgOTEqgG1RymbwFdwEA2gcAAAAAAAAAAAAAAAA= 16-05-18 11:55:13 0 N
0385 1 2010 +SFyfn64R9+t9UQKSw5eHwEA2gcAAAAAAAAAAAAAAAA= 16-05-18 11:55:13 0 N
0386 1 2010 94oZ3mwiQaKoEymTzoNiqQEA2gcAAAAAAAAAAAAAAAA= 16-05-18 11:55:13 0 N
0387 1 2010 lFX4KFvSSYy9k2Z3PxkKrQEA2gcAAAAAAAAAAAAAAAA= 16-05-18 11:55:13 0 N
0388 1 2010 9iGWWqBfSFCYwnq1bHgKLAEA2gcAAAAAAAAAAAAAAAA= 16-05-18 11:55:13 0 N
0389 1 2010 rPBQj4kaSEORMbsJxxKikwEA2gcAAAAAAAAAAAAAAAA= 16-05-18 11:55:13 0 N
0390 1 2010 avfiUp5RQr2FgbqwnuB17QEA2gcAAAAAAAAAAAAAAAA= 16-05-18 11:55:13 0 N
0391 1 2010 yTHuuY+cQkCjzKpHjEp1kwEA2gcAAAAAAAAAAAAAAAA= 16-05-18 11:55:13 0 N
0392 1 2010 B4yYdzo5TsGTDS37yY7uHgEA2gcAAAAAAAAAAAAAAAA= 16-05-18 11:55:13 0 N
0393 1 2010 giD1TtTxSjyGlneR0v0WrgEA2gcAAAAAAAAAAAAAAAA= 16-05-18 11:55:13 0 N
0394 1 2010 5T+ePpONSGSFGZ2wwRizOwEA2gcAAAAAAAAAAAAAAAA= 16-05-18 11:55:13 0 N
0395 1 2010 EvtBS42aQcqZxD3AfIwz5gEA2gcAAAAAAAAAAAAAAAA= 16-05-18 11:55:13 0 N
0396 1 2010 mgopJmchTv6YMS4VW68BCwEA2gcAAAAAAAAAAAAAAAA= 16-05-18 11:55:13 0 N
0397 1 2010 KU73LYkWQcCnTQu4OpKCBAEA2gcAAAAAAAAAAAAAAAA= 16-05-18 11:55:13 0 N
0398 1 2010 N4zPeDZ+QaydazuuPzI82QEA2gcAAAAAAAAAAAAAAAA= 16-05-18 11:55:13 0 N
0399 ---------------------------------------------------------------------
0400
0401 Lets say, we want to see what is in side of the first message, by using 'mqdm' (dump message) command:
0402
0403 ---------------------------------------------------------------------
0404 NDRX> mqdm -n 1 -i 2010 -m UcnU2PgOTEqgG1RymbwFdwEA2gcAAAAAAAAAAAAAAAA=
0405 ndrxd PID (from PID file): 27208
0406 *************** TPQCTL ***************
0407 EX_QFLAGS 0
0408 EX_QPRIORITY 0
0409 EX_QDIAGNOSTIC 0
0410 EX_QURCODE 0
0411 EX_QAPPKEY 0
0412 EX_QDELIVERY_QOS 0
0413 EX_QREPLY_QOS 0
0414 EX_CLTID
0415 EX_QREPLYQUEUE
0416 EX_QFAILUREQUEUE
0417 EX_QDIAGMSG
0418 EX_QMSGID Q\c9\d4\d8\f8\0eLJ\a0\1bTr\99\bc\05w\01\00\da\07\00\00\00\00\00\00\00\00\00\00\00\00
0419 EX_QCORRID
0420 *************** MESSAGE **************
0421 * Buffer type = CARRAY
0422 UBF :4:32427:000:20160518:145737003:d_mqdm.c:0154:Binary message contents
0423 0000 00 01 02 03 04 05 06 07 08 09 ..........
0424 NDRX>
0425
0426 ---------------------------------------------------------------------
0427 So above sample does the hex dump of the binary message we enqueued. Lets say
0428 we want to move this message to 'MYQ2' so that processes automatically (currently we do not have TESTSVC
0429 defined. so it will fail. But anyway lets try. To move message, we can use 'mqmv' (move) command.
0430 ---------------------------------------------------------------------
0431
0432 NDRX> mqmv -n 1 -i2010 -m UcnU2PgOTEqgG1RymbwFdwEA2gcAAAAAAAAAAAAAAAA= -s MYSPACE -q MYQ2
0433 ndrxd PID (from PID file): 27208
0434 Committed
0435 NDRX> mqlq
0436 ndrxd PID (from PID file): 27208
0437 Nd SRVID QSPACE QNAME #QUEU #LOCK #ENQ #DEQ #SUCC #FAIL
0438 -- ----- --------- --------- ----- ----- ----- ----- ----- -----
0439 1 2010 MYSPACE MYQ1 14 0 30 16 0 0
0440 1 2010 MYSPACE MYQ2 0 0 1 1 0 1
0441 1 2010 MYSPACE @ 0 0 0 0 0 0
0442 NDRX>
0443 ---------------------------------------------------------------------
0444
0445 So after a while, message did fail, it was dequeued and remove.
0446
0447 To remove message from q, it can be
0448 done by 'mqrm' command, for example:
0449
0450 ---------------------------------------------------------------------
0451 NDRX> mqrm -n 1 -i 2010 -m +SFyfn64R9+t9UQKSw5eHwEA2gcAAAAAAAAAAAAAAAA=
0452 ndrxd PID (from PID file): 27208
0453 Succeed
0454 NDRX> mqlq
0455 ndrxd PID (from PID file): 27208
0456 Nd SRVID QSPACE QNAME #QUEU #LOCK #ENQ #DEQ #SUCC #FAIL
0457 -- ----- --------- --------- ----- ----- ----- ----- ----- -----
0458 1 2010 MYSPACE MYQ1 13 0 30 17 0 0
0459 1 2010 MYSPACE MYQ2 0 0 1 1 0 1
0460 1 2010 MYSPACE @ 0 0 0 0 0 0
0461 ---------------------------------------------------------------------
0462
0463 So after removal only 13 messages have left in queue.
0464
0465
0466 Runtime queue reconfiguration
0467 -----------------------------
0468 If new queues needs to be defined or parameters of existing queues needs to be changed,
0469 you may use 'mqrc' (reload config) command. This sends request to all 'tmqueue' server to re-read
0470 the config.
0471
0472 Meanwhile you may define new queue during the runtime (without changing the config) or update existing one.
0473 Lets say we want to change 'MYQ2' to manual queue. You may do this in following way by using
0474 'mqch' (change) command:
0475
0476 ---------------------------------------------------------------------
0477
0478 NDRX> mqch -n 1 -i 2010 -qMYQ2,autoq=n
0479 ndrxd PID (from PID file): 27208
0480 Succeed
0481 NDRX> mqlc
0482 ndrxd PID (from PID file): 27208
0483 Nd SRVID QSPACE QNAME FLAGS QDEF
0484 -- ----- --------- --------- ----- --------------------
0485 1 2010 MYSPACE @ @,svcnm=-,autoq=n,tries=0,waitinit=0,waitretry=0,waitretryinc=0,waitretrymax=0,mode=fifo
0486 1 2010 MYSPACE MYQ1 MYQ1,svcnm=-,autoq=n,tries=0,waitinit=0,waitretry=0,waitretryinc=0,waitretrymax=0,mode=fifo
0487 1 2010 MYSPACE MYQ2 MYQ2,svcnm=TESTSVC,autoq=n,tries=5,waitinit=1,waitretry=10,waitretryinc=5,waitretrymax=30,mode=lifo
0488
0489 ---------------------------------------------------------------------
0490
0491
0492 Further study
0493 -------------
0494 For more use cases the 'atmitests/test028_tmq' can be analyzed. It contains test cases for supported
0495 EnduroX duarble queue functionality.
0496
0497
0498 :numbered!:
0499
0500 [bibliography]
0501 Additional documentation
0502 ------------------------
0503 This section lists additional related documents.
0504
0505 [bibliography]
0506 .Internet resources
0507 - [[[XADMIN-MANPAGE]]] man xadmin
0508 - [[[Q.CONF-MANPAGE]]] man q.conf
0509 - [[[TMQUEUE-MANPAGE]]] man tmqueue
0510
0511 [glossary]
0512 Glossary
0513 --------
0514 This section lists
0515
0516 [glossary]
0517 ATMI::
0518 Application Transaction Monitor Interface
0519
0520 UBF::
0521 Unified Buffer Format it is similar API as Tuxedo's FML
0522
0523
0524 ////////////////////////////////////////////////////////////////
0525 The index is normally left completely empty, it's contents being
0526 generated automatically by the DocBook toolchain.
0527 ////////////////////////////////////////////////////////////////