ndrxconfig.xml — Enduro/X ATMI Application Domain configuration
<?xml version="1.0" ?> <endurox> <appconfig> <sanity>SANITY_SECONDS</sanity> <checkpm>CHECKPM_STY</checkpm> <brrefresh>BRIDGE_REFRESH_TIME</brrefresh> <restart_min>MIN_RESTART_TIME</restart_min> <restart_step>RESTART_STEP</restart_step> <restart_max>MAX_RESTART_TIME</restart_max> <restart_to_check>NDRXD_RESTART_TO_CHECK</restart_to_check> <gather_pq_stats>NDRXD_GATHER_PQ_STATS</gather_pq_stats> <rqaddrttl>RQADDRTTL</rqaddrttl> <ddrreload>DDRRELOAD</ddrreload> </appconfig> <procgroups> <defaults name="PROCGROUP_NAME_DEF" grpno="PROCGROUP_GRPNO_DEF" noorder="PROCGROUP_NOORDER_DEF" singleton="PROCGROUP_SINGLETON_DEF" sg_nodes="PROCGROUP_SINGLETON_NODES_DEF" sg_nodes_verify="PROCGROUP_SINGLETON_NODES_VERIFY_DEF"/> ... <procgroup name="PROCGROUP_NAME" grpno="PROCGROUP_GRPNO" noorder="PROCGROUP_NOORDER" singleton="PROCGROUP_SINGLETON" sg_nodes="PROCGROUP_SINGLETON_NODES" sg_nodes_verify="PROCGROUP_SINGLETON_NODES_VERIFY"/> ... </procgroups> <defaults> <min>MIN_SERVERS_DEFAULT</min> <max>MAX_SERVERS_DEFAULT</max> <mindispatchthreads>MIN_DISPTHREADS_DEFAULT</mindispatchthreads> <maxdispatchthreads>MAX_DISPTHREADS_DEFAULT</maxdispatchthreads> <autokill>AUTOKILL_DEFAULT</autokill> <respawn>RESPAWN_DEFAULT</respawn> <env>ENV_OVERRIDE_DEFAULT</env> <start_max>MAX_STARTUP_TIME_DEFAULT</start_max> <pingtime>PING_EVERY_TIME_DEFAULT</pingtime> <ping_max>MAX_PING_TIME_DEFAULT</ping_max> <end_max>MAX_SERVER_SHUTDOWN_TIME_DEFAULT</end_max> <killtime>KILL_TIME_DEFAULT</killtime> <killseq>KILLSEQ_DEFAULT</killseq> <exportsvcs>EXPORT_SERVICES_DEFAULT</exportsvcs> <blacklistsvcs>BLACKLIST_SERVICES_DEFAULT</blacklistsvcs> <srvstartwait>NDRXD_SRV_START_WAIT_DEFAULT</srvstartwait> <srvstopwait>NDRXD_SRV_STOP_WAITT_DEFAULT</srvstopwait> <cctag>COMMON_CONFIG_TAG_DEFAULT</cctag> <protected>PROTECTED_SERVER_DEFAULT</protected> <reloadonchange>RELOAD_ON_CHANGE_DEFAULT</reloadonchange> <rssmax>RSSMAX_DEFAULT</rssmax> <vszmax>VSZMAX_DEFAULT</vszmax> <rqaddr>RQADDR_DEFAULT</rqaddr> <envs group="SVGRP_ENV_GROUP_NAME"> <env name="SVGRP_ENV_VARIABLE_NAME">SVGRP_ENV_VARIABLE_VALUE</env> <env name="SVGRP_ENV_VARIABLE_NAME_1" unset="SVGRP_ENV_UNSET" /> ... <env name="SVGRP_ENV_VARIABLE_NAME_N">SVGRP_ENV_VARIABLE_VALUE_N</env> </envs> ... <envs group="SVGRP_ENV_GROUP_NAME_N"> ... </envs> <procgrp>SRV_PROCGRP_DEFAULT</procgrp> <procgrp_lp>SRV_PROCGRP_LP_DEFAULT</procgrp_lp> </defaults> <servers> <server name="SERVER_BINARY_NAME"> <min>MIN_SERVERS_SRV</min> <max>MAX_SERVERS_SRV</max> <mindispatchthreads>MIN_DISPTHREADS_SERVER</mindispatchthreads> <maxdispatchthreads>MAX_DISPTHREADS_SERVER</maxdispatchthreads> <autokill>AUTOKILL_SRV</autokill> <respawn>RESPAWN_SRV</respawn> <env>ENV_OVERRIDE_SRV</env> <start_max>MAX_STARTUP_TIME_SRV</start_max> <pingtime>PING_EVERY_TIME_SRV</pingtime> <ping_max>MAX_PING_TIME_SRV</ping_max> <end_max>MAX_SERVER_SHUTDOWN_TIME_SRV</end_max> <killtime>KILL_TIME_SRV</killtime> <killseq>KILLSEQ</killseq> <sleep_after>SECONDS_TO_SLEEP_AFTER_SRV_START</sleep_after> <srvid>SERVER_ID</srvid> <sysopt>ATMI_SERVER_SYSTEM_OPTIONS</sysopt> <appopt>ATMI_SERVER_APPLICATION_OPTIONS</appopt> <exportsvcs>ATMI_SERVER_EXPORT_SERVICES</exportsvcs> <blacklistsvcs>ATMI_BLACKLIST_SERVICES</blacklistsvcs> <srvstartwait>NDRXD_SRV_START_WAIT</srvstartwait> <srvstopwait>NDRXD_SRV_STOP_WAIT</srvstopwait> <cctag>COMMON_CONFIG_TAG</cctag> <protected>PROTECTED_SERVER</protected> <reloadonchange>RELOAD_ON_CHANGE_SERVER</reloadonchange> <fullpath>ATMI_SERVER_FULL_PATH</fullpath> <cmdline>ATMI_SERVER_COMMAND_LINE</cmdline> <rssmax>ATMI_SERVER_RSSMAX</rssmax> <vszmax>ATMI_SERVER_VSZMAX</vszmax> <rqaddr>RQADDR</rqaddr> <envs> <usegroup>SVGRP_ENV_GROUP_NAME</usegroup> ... <usegroup>SVGRP_ENV_GROUP_NAME_N</usegroup> <env name="SVPROC_ENV_VARIABLE_NAME">SVPROC_ENV_VARIABLE_VALUE</env> <env name="SVPROC_ENV_VARIABLE_NAME_UNSET" unset="SVPROC_ENV_UNSET" /> ... <env name="SVPROC_ENV_VARIABLE_NAME_N">SVPROC_ENV_VARIABLE_VALUE_N</env> </envs> <procgrp>SRV_PROCGRP</procgrp> <procgrp_lp>SRV_PROCGRP_LP</procgrp_lp> </server> ... <server name="SERVER_BINARY_NAME_N"> ... </server> </servers> <clients> <envs group="CLTGRP_ENV_GROUP_NAME"> <env name="CLTGRP_ENV_VARIABLE_NAME">CLTGRP_ENV_VARIABLE_VALUE</env> <env name="CLTGRP_ENV_VARIABLE_NAME_UNSET" unset="CLTGRP_ENV_UNSET" /> ... <env name="CLTGRP_ENV_VARIABLE_NAME_N">CLTGRP_ENV_VARIABLE_VALUE_N</env> </envs> ... <envs group="CLTGRP_ENV_GROUP_NAME_N"> ... </envs> <client cmdline="CLT_COMMAND_LINE [${NDRX_CLTTAG} ${NDRX_CLTSUBSECT}]" log="CLT_LOG" stdout="CLT_STDOUT" stderr="CLT_STDERR" env="CLTGRP_ENV" cctag="CLT_CCTAG" wd="CLT_WD" klevel="CLT_KLEVEL" autostart="CLT_AUTOSTART" rssmax="CLT_RSSMAX" vszmax="CLT_VSZMAX" subsectfrom="CLT_SUBSECTFROM" subsectto="CLT_SUBSECTTO" procgrp="CLT_PROCGRP" > <envs> <usegroup>CLTGRP_ENV_GROUP_NAME</usegroup> ... <usegroup>CLTGRP_ENV_GROUP_NAME_N</usegroup> <env name="CLTPROC_ENV_VARIABLE_NAME">CLTPROC_ENV_VARIABLE_VALUE</env> <env name="CLTPROC_ENV_VARIABLE_NAME_UNSET" unset="CLTPROC_ENV_UNSET" /> ... <env name="CLPROC_ENV_VARIABLE_NAME_N">CLTPROC_ENV_VARIABLE_VALUE_N</env> </envs> <exec tag="CLT_TAG_EXEC" subsect="CLT_SUBSECT_EXEC" log="CLT_LOG_EXEC" stdout="CLT_STDOUT_EXEC" stderr="CLT_STDERR_EXEC" env="CLTGRP_ENV_EXEC" cctag="CLT_CCTAG_EXEC" wd="CLT_WD_EXEC" autostart="CLT_AUTOSTART_EXEC" klevel="CLT_KLEVEL_EXEC" rssmax="CLT_RSSMAX_EXEC" vszmax="CLT_VSZMAX_EXEC" subsectfrom="CLT_SUBSECTFROM_EXEC" subsectto="CLT_SUBSECTTO_EXEC" procgrp="CLT_PROCGRP_EXEC" /> <exec tag="CLT_TAG_EXEC2" subsect="CLT_SUBSECT2_EXEC2" .../> </client> <client cmdline="BINARY2" ...> <exec tag="CLT_EXE_TAG2" .../> </client> </clients> <services> <defaults prio="SVC_PRIO_DEF" routing="SVC_ROUTE_NAME_DEF" autotran="SVC_AUTOTRAN_DEF" trantime="SVC_TRANTIME_DEF"/> ... <service svcnm="SVC_SERVICE_NAME" prio="SVC_PRIO" routing="SVC_ROUTE_NAME" autotran="SVC_AUTOTRAN" trantime="SVC_TRANTIME"/> ... </services> <routing> <route routing="ROUTE_NAME"> <field>ROUTE_FIELD</field> <ranges>ROUTE_RANGES</ranges> <buftype>ROUTE_BUFFER</buftype> <fieldtype>ROUTE_FIELDTYPE</fieldtype> </route> ... </routing> </endurox>
ndrxconfig.xml holds the application domain configuration. It describes the ATMI servers that need to be started. Counts of the, how much to start. Also, it describes sanity times i.e. period after which system sanity checks should be made. Also, it describes time frames in which ATMI server should start or stop. Internal server ping can be configured here too.
Several parameters in the ndrxconfig.xml file are processed via substitution engine. Engine processes puts the environment variables or special functions in the place-holders. Placeholder is defined as ${ENV_VARIABLE} for environment variables and ${FUNC=[PARAMETER]} for functions. The value can be escaped with \${some_value}.
Functions are processed in case if statement in brackets contains equal sign =. As the sign is not allowed for environment variables, Enduro/X uses it to distinguish between env variable and function.
Following FUNC (functions) are defined:
dec Decrypt base64 string in PARAMETER and replace the placeholder with the value. To get encrypted value, it is possible to use exencrypt(8) tool.
Enduro/X supports data dependent routing. There are three components which are required for routing:
When all above is defined, the routing will be activated, when client (or servers code) would issue:
Also affects any other Enduro/X APIs which internally uses tpcall/tpacall. Such as tpenqueue(3), tpdequeue(3), tpbegin(3), etc. but it is not recommended to configure routing for Enduro/X system servers or services (or at least with out advice from Mavimax).
Routing criterions by it self operate with three data types: LONG, DOUBLE and STRING.
Syntax for ROUTE_RANGES is following: <min_value_1>-<max_value_1>:<group_code_1>,…, <min_value_N>-<max_value_N>:<group_code_N>. Additional syntax is supported, such as:
Ranges value are validated and processed as indicated by field typ. LONG is limited to:
^[+-]?([0-9])+$
DOUBLE type value shall be expressed as:
^[-+]?(([0-9]*[.]?[0-9]+([ed][-+]?[0-9]+)?))$
For DOUBLE decimal separator is .. Also to check that equality is checked with precision of 0.000001.
STRING values may contain any printable character including newline.
When processes is perform routing, first matched range is used to extract the group code. If range is not found or buffer type does not match with service for which routing is defined TPESYSTEM error is returned to caller. Range matching is performed form left to right order. Range include the range min/max values. When range is defined for STRING type, values are compared by strcmp() function.
Examples of valid routing configuration:
<?xml version="1.0" ?> <endurox> ... <services> <defaults routing="RT1"/> <service svcnm="DEBITSVC" /> <service svcnm="CREDIT" routing="RT2" /> <defaults routing="RT3" /> <service svcnm="TXHANDLER" /> </services> <routing> <route routing="RT1"> <field>T_LONG_FLD</field> <ranges>MIN-4:GRP1,100-200:GRP4,300:GRP6,1000-22100:GRP5,*:*</ranges> <buftype>UBF</buftype> </route> <route routing="RT2"> <field>T_STRING_FLD</field> <ranges> MIN-'AAA':GRP1 ,'AAB' - AAC:'GRP4' ,'HELLO\'' - HELLO5:* ,'Z' - MAX:GRP6 </ranges> <buftype>UBF</buftype> </route> <!-- cast value from string to double --> <route routing="RT3"> <field>T_STRING_FLD</field> <ranges> MIN - -1.1:GRP1 ,-1 - 44:'GRP4' ,'44.1' - 123.15:* ,*:* </ranges> <buftype>UBF</buftype> <fieldtype>DOUBLE</fieldtype> </route> <routing> ... </endurox> Note that *DDR* settings can be changed on they fly with *xadmin reload*, but changes are deferred to certain amount of time. See 'DDRRELOAD'.
Process command line arguments normally may contain spaces or tables in their values. As Enduro/X processes need to prepare arguments for exec, at the prepare phase clear distinguishing must be made between multiple arguments and argument values. Thus Enduro/X employs a parser to split CLI strings into arguments. Blocks with spaces or tabs inside must be quoted. The logic is similar to the way how shall perform quote processing.
The following rules apply:
Samples:
Example 1: CLI Value: someproc 'HELLO\' WORLD' X"some value \'"X Process would receive arguments: 1. someproc 2. HELLO' WORLD 3. Xsome value \'X Example 1: CLI Value: someproc HELLO \ 'SOMETHING Process would receive arguments: 1. someproc 2. HELLO 3. 4. SOMETHING
Above applies to CLT_COMMAND_LINE, ATMI_SERVER_SYSTEM_OPTIONS and ATMI_SERVER_APPLICATION_OPTIONS.
ndrxconfig.xml supports entity substitution, thus effectively, portions of XMLs may be included from other files.
For example having ndrxconfig.xml:
<?xml version="1.0" ?> <!DOCTYPE doc [ <!ENTITY defaults SYSTEM "ndrxconfig.xml.defaults"> ]> <endurox> <appconfig> <sanity>10</sanity> <brrefresh>6</brrefresh> <restart_min>1</restart_min> <restart_step>1</restart_step> <restart_max>5</restart_max> <restart_to_check>20</restart_to_check> </appconfig> &defaults; <servers> </servers> </endurox>
and
ndrxconfig.xml.defaults:
<defaults> <min>1</min> <max>2</max> </defaults>
would make final config for ndrxd(8) and cpmsrv(8) look like:
<?xml version="1.0" ?> <endurox> <appconfig> <sanity>10</sanity> <brrefresh>6</brrefresh> <restart_min>1</restart_min> <restart_step>1</restart_step> <restart_max>5</restart_max> <restart_to_check>20</restart_to_check> </appconfig> <defaults> <min>1</min> <max>2</max> </defaults> <servers> </servers> </endurox>
Sample configuration:
<?xml version="1.0" ?> <endurox> <appconfig> <sanity>10</sanity> <brrefresh>6</brrefresh> <restart_min>1</restart_min> <restart_step>1</restart_step> <restart_max>5</restart_max> <restart_to_check>20</restart_to_check> </appconfig> <defaults> <min>1</min> <max>2</max> <autokill>1</autokill> <start_max>2</start_max> <pingtime>1</pingtime> <ping_max>4</ping_max> <end_max>3</end_max> <killtime>1</killtime> <envs group="JAVAENV"> <env name="_JAVA_OPTIONS">-Xmx1g</env> </envs> </defaults> <servers> <server name="tpevsrv"> <srvid>14</srvid> <min>1</min> <max>1</max> <cctag>RM1</cctag> <env>${NDRX_HOME}/tpevsrv_env</env> <sysopt>-e /tmp/TPEVSRV -r</sysopt> </server> <server name="tpbridge"> <max>1</max> <srvid>100</srvid> <sysopt>-e /tmp/BRIDGE -r</sysopt> <appopt>-n2 -r -i 0.0.0.0 -p 4433 -tA</appopt> </server> <server name="jserver2"> <max>1</max> <srvid>200</srvid> <sysopt>-e /tmp/BRIDGE -r</sysopt> <envs> <usegroup>JAVAENV</usegroup> <env name="NDRX_RTGRP">GRP4</env> <env name="CLASSPATH">${CLASSPATH}:${NDRX_APPHOME}/libs/${NDRX_SVPROCNAME}.jar</env> <env name="CLASSPATH">${NDRX_APPHOME}/libs/somelib.jar</env> </envs> <cmdline>java</cmdline> </server> <server name="cpmsrv"> <cctag>RM2</cctag> <srvid>9999</srvid> <sysopt>-e /tmp/cpmsrv.log -r -- -k3 -i1</sysopt> </server> </servers> <clients> <client cmdline="testbinary -t ${NDRX_CLTTAG} -s ${NDRX_CLTSUBSECT}" autostart="Y" cctag="RM4"> <exec tag="TAG1" subsect="SUBSECTION1" log="${APP_LOG}/testbin1-1.log" cctag="RM5"/> <exec tag="TAG2" subsect="SUBSECTION2" log="${APP_LOG}/testbin1-2.log"/> </client> <client cmdline="testenv.sh" env="environment.override1" log="env1.log"> <exec tag="TESTENV" autostart="Y"/> </client> </clients> <services> <defaults trantime="600" /> <service svcnm="SERVICE1" prio="50" routing="RT1" autotran="Y" /> <defaults autotran="Y" /> <service svcnm="SERVICE2" prio="50" routing="RT2" trantime="600" /> </services> <routing> <route routing="RT1"> <field>T_LONG_FLD</field> <ranges>MIN-4:GRP1,100-300:GRP4,1000-22100:GRP5,*:*</ranges> <buftype>UBF</buftype> </route> <route routing="RT2"> <field>T_STRING_FLD</field> <ranges>MIN-AAA:GRP1,'AAB'-'AAD':'GRP4',*:*</ranges> <buftype>UBF</buftype> </route> </routing> </endurox>