Back to home page

Enduro/X

 
 

    


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 ////////////////////////////////////////////////////////////////