Skip to main content
Skip table of contents

Routing Swiftlet

The Routing Swiftlet provides unlimited connectivity to other SwiftMQ routers with the transparent routing of point-to-point as well as publish/subscribe-based messages to remote destinations.

Federated Router Network

Each SwiftMQ router is a full-fledged JMS server with its own resources (queues, topics, durable subscribers, connection factories, and so on). The Routing Swiftlet is able to connect single SwiftMQ routers together. Due to dynamic routing which doesn't require any configuration (it's automatically), all resources of those connected routers become globally available. For example, a message can be sent to testqueue@router7 from a JMS client connected to router1, a message published to topic testtopic from a JMS client connected to router7 will be sent to a subscriber on testtopic which is connected to router88, and a JMS client is able to look up a connection factory, registered on router10, from a JMS client connected to router11.

For this construct of connected routers with globally available but locally managed resources, we have created the term FEDERATED ROUTER NETWORK. Each router is independent but they work together - federated. SwiftMQ includes federation support since its release 1.0 and it's very mature. In fact, there is no other JMS system in the world that implements it better than SwiftMQ, because it's SwiftMQ's core design.

There is no restriction on the number of routers you can connect nor in the form of the topology you like to build. You don't have to create a hub/spoke-like topology with the main router in the middle. You can also build a ring. No matter whether a router is directly or intermediate connected (via other routers) - it is reachable. If a connection gets lost and there is another route to the destination, the message travels that way. If no more route is available, the message stays at the last router and will be forwarded once a route becomes available again.

The following example illustrates a possible router network topology:

The Routing Swiftlet routes the messages destination-based, by finding the shortest way. To balance a load or to increase the message throughput, round-robin scheduling can be selected. In this case, the messages are distributed to all routes of a destination evenly:

For maximum reliability and guaranteed delivery, 2-phase-commit (XA) is used to transfer messages in configurable transaction sizes (bulk) from one router to the other, fast. Recovery of in-doubt XA transactions (prepared but not committed) is automatically done during the connect phase by our transaction manager.

Routing Connections

A routing connection can be established if one router provides a listener and the other a connector. There is no limit on the number of listeners and connectors. You can define any number of listeners on different ports and any number of connectors.

Listeners

A listener listens on a specific port and can be bound to a particular interface on multi homes machines. It defines a socket factory (default PlainSocketFactory) to use for sockets, created from this listener. Further attributes are a password (which is exchanged with challenge/response) and a host access list which is checked against the hostname of incoming socket connections. One can also use TLS by specifying the JSSESocketFactory instead of the PlainSocketFactory.

The following snippet defines a listener on port 4100 with the default PlainSocketFactory and another one listening on port 443 with the JSSESocketFactory and a password:

Example:

XML
<listeners>
    <listener name="plainsocket" port="4100">
        <host-access-list/>
    </listener>
    <listener name="tlsocket" port="443"
              socketfactory-class="com.swiftmq.net.JSSESocketFactory"
              password="secret">
        <host-access-list/>
    </listener>
</listeners>

Connectors

A connector is responsible to establish a routing connection. It points to a listener on a remote router and must be of the same configuration concerning socket factory and password. A connector can be enabled and disabled. It is enabled by default. A disabled connector is inactive.

If a connection cannot be established by a connector or is lost, it retries in intervals, specified in attribute retry-time, to connect. The default retry-time is 60000 (1 minute). Retry is only performed if the connector is enabled.

The following snippet defines a connector, pointing to a routing listener on host chb.acme.com on port 17884. It uses the JSSESocketFactory and password let_me_in. The retry-time is 2 minutes:

Example:

XML
<connectors>
    <connector name="acme" 
               hostname="chb.acme.com"
               port="17884"
               socketfactory-class="com.swiftmq.net.JSSESocketFactory"
               password="let_me_in"
               retry-time="120000"/>
</connectors>

Scheduling a Connector Job via the Scheduler Swiftlet

The Routing Swiftlet registers a job Routing Connector in the job group Routing at the Scheduler Swiftlet.

This job takes the name of the routing connector as a parameter. It enables the connector at the job start and disables it at the job stop. Therefore, a connector should be configured as being disabled if it should be used in a job:

Example:

XML
<connectors>
    <connector name="acme"
               enabled="false"
               hostname="chb.acme.com"
               port="17884"
               socketfactory-class="com.swiftmq.net.JSSESocketFactory"
               password="let_me_in"
               retry-time="120000"/>
</connectors>

The Routing Connector should have a specified maximum runtime in its schedule, otherwise, it will not be disabled. If the connector will be enabled during the job start and the connection cannot be established, the retry behavior will be executed as described in the section above. Retry ends at the job stop.

Adjusting Network Buffers

SwiftMQ manages its own network buffers on both sides of the wire. The length of the data sent to the network is determined by the underlying SMQP protocol handlers. Only complete requests are sent. Before a request is sent, it is written to a network buffer. The receiving side receives the data into a network buffer as well. These buffers are adjusted automatically. However, an adjustment may take time when transferring large messages, so it might be necessary to configure buffer/extend sizes that meet the requirements more specifically.

Network buffers are initially created with their initial size which is 128 KB by default. If the protocol handler detects that the buffer is full before it can flush it, it will extend the buffer and continues writing until the request is finished or the buffer fills up again which then leads to another extend. The default extend size is 64 KB.

The initial buffer size and the extend size can be specified for:

  • Router input/Listener

  • Router output/Listener

  • Router input/Connector

  • Router output/Connector

So it's possible to adjust network buffers for both sides by creating the appropriate routing listeners and connectors.

Reconnect

If a routing connection is established and one side disconnects, the other side (the other router) might not detect it. That's not a problem of SwiftMQ but of the TCP protocol. To detect these invalid connections, SwiftMQ uses a keepalive mechanism on routing connections which works as follows:

If a connector of one router connects to a listener of another router, both sides pass different stages (connect, authentication, recovery, etc) until they reach the final delivery stage in which the actual message exchange takes place. The keepalive mechanism is started at the beginning of the delivery stage. Previous stages are protected by timers which ensure that such a stage will not be stuck by waiting for a reply which will never happen due to a disconnect during that stage. If the timers are fired and the stage is in waiting mode, the connection will be disconnected.

The time after which such an "early" stage becomes invalid can be specified via attribute stage-valid-timeout. Default is 15 seconds. Another attribute reject-disconnect-delay specifies the time after which a rejected connection (e.g. router name already connected, authentication failed) is closed. Both attributes are dependent on each other. If a connector connects to a listener, it initializes a timer with the value of stage-valid-timeout. This ensures that the stages become invalid if no reply arrives. Say, the router name is already connected so the listener rejects the connection and sends a negative reply. The listener initializes a timer with the value of reject-disconnect-delay which leads to a physical close when the timer is fired.

The keepalive mechanism consists of keepalive messages which are sent from both sides of the connection in the interval specified in the attribute keepalive-interval of the routing listener. This value is passed over to the connector during the connect stage. Each side has a counter which is initialized with 5. If a keepalive message is received, the counter is incremented. If a keepalive message is sent, the counter is decremented. If the counter reaches 0, the connection is probably invalid and is closed physically.

A routing connection is valid before the keepalive counter reaches 0. However, it might be already disconnected at one end and that router tries to reconnect which, in turn, will be rejected, because a given router can only be connected once. The other router is able to reconnect after the routing connection has been closed due to the keepalive mechanism. Therefore, the maximum time a router has to wait until it is able to reconnect is 5 * <keepaliveinterval>. The attribute keepalive-interval of the routing listener can be set to a lower value to shorten this time.

Message Routing

Dynamic Routing

Routing between routers of a network requires information about the routes. These routes are exchanged dynamically between each router of the network during the connect phase. That means each router is able to send messages to each other since it knows every route there. If a router connects to another router, it has the direct route to this remote router and gets all routes from here to other routers. Therefore, a message can be routed to a router that is not directly connected but reachable by other intermediate routers.

The Routing Swiftlet stores a table with all dynamic routes called the "routing table", which is displayed in the Usage node of the Routing Swiftlet:

The routing table contains an entry for each known destination router. Each of these entries contains a table of dynamic routes, received by this router. A dynamic route consists of a list of intermediate routers (hops) that a message has to travel until it reaches its final destination.

Per default, always the shortest way is chosen by the Routing Swiftlet during messages transfer, that is the route with the minimum hop count. This is the default routing mode. Therefore the message is routable if at least 1 route to its destination is known because if a route fails, the next best route is chosen and the message travels another, probably longer way. Another routing mode is "round-robin" which has to be enabled separately. Within this model, messages are distributed over all known routes to their destination evenly. Round-robin is reasonable to spread a message load over multiple routing connections.

Static Routes

With the dynamic routing architecture, a remote queue can be addressed if a route is available. Otherwise, the queue is unknown. To enable clients to address remote queues before a dynamic route is announced, static routes can be created. These are router names. Static routes are not announced to other routers. Their only sense is to enable clients to address unknown routers.

How to avoid Route Flooding

The advantage of dynamic routing is its plug-and-play nature. No administrators interaction is required. A message is routed automatically to the destination inclusive failover. However, the disadvantage is the number of routes that need to be exchanged. Every router knows every route to every other router. So, the more routers the more routes are exchanged. Updated routes are exchanged whenever a routing connection somewhere in a router network connects or disconnects. To reduce this traffic, route filters can be defined.

The following example shows a typical star-like router network topology with 2 interconnected main routers, hq1 and hq2. Each main router has 3 interconnected satellite routers. There is an additional connection between sub3 and sub4:

If a message should be send from sub6 to a queue at sub1, it will by default use the shortest way (minimum hop count): sub6 -> hq2 -> hq1 -> sub1. However, there are many other routes as well, for example: sub6 -> hq2 -> sub5 -> sub4 -> sub3 -> hq1 -> sub2 -> sub1.

Many of these routes don't make sense and will never be used. It may also be required to restrict access between routers in a network. There are 2 ways to accomplish this: to define a hop limit at a router and/or to define route filters.

Hop Limit

There is an attribute called route-announce-hop-limit to limit the routes which are announced from a router to the value specified via this attribute. The router checks each route if the number of hops exceeds the attribute value and only forwards it if the hop count is less. The default value of route-announce-hop-limit is 3. A value of -1 disabled the hop limit.

In the above example, if we define for each satellite router sub1 to sub6 the route-announce-hop-limit=1 then we would have direct routes (via the direct connection) between them and their corresponding main router hq1 resp. hq2. However, since the main routers don't have a hop limit, there was an alternate route for each satellite via its main router. For example, sub6 could reach sub5 directly but also via hq2. sub6 could also reach sub1 via hq2 and hq1 because the main router doesn't have a hop limit. However, all nonsense routes like sub6 -> hq2 -> hq1 -> sub2 -> sub3 -> sub4 -> sub5 are eliminated by the hop limit.

If we define route-announce-hop-limit=1 for the main routers hq1 and hq2 as well then each satellite could only communicate with its direct neighbor satellite and its main router. Both main routers could communicate as well but not with the satellite of each other. sub6 could reach sub5 but not sub4 and not sub1. The only exception is that sub3 and sub4 can reach each other because they have a direct connection.

Please check the routing table (see picture on top of this page) of your routers while you define your hop limits. Routing connections have to be re-established to force the re-announcement of routes.

Route Filters

Route filters provide a way for semantic filtering of routes. They can be hop or destination-based and of the include or exclude type. In this context, a hop defines a router node to which other routers are connected and which announces routes to the outside. A destination is a single router. Possible filters are:

  • Announce only routes to a single destination outside (include by destination)

  • Announce only routes to a hop and all hop-connected routers (= a subnet) to outside (include by hop)

  • Don't announce routes to a single destination outside (exclude by destination)

  • Don't announce routes to a hop and all hop-connected routers (= a subnet) to outside (exclude by hop)

In the above example, let's define a filter at sub4 for router sub3 of type include by destination with the value sub4. This must be read "to router sub3 only announce routes to destination sub4". Since the only route which has a destination sub4 is the direct route this will filter all routes except the direct route. If we define a similar route at sub3 (for sub4, type include by destination, value sub3) then both routers can reach each other via their direct connection but not any other router via this direct connection.

If we would further add a filter at hq2 of type exclude by hop with value hq1 then sub4 to sub6won't be able to reach hq1, sub1 to sub3, except that sub3 and sub4 could communicate directly. So exclude by hop excludes a complete subnet, identified by a hop. All other routes are announced. If one would like to exclude all routes except those from a particular hop then include by hop must be used.

Please check the routing table (see picture on top of this page) of your routers while you define your route filters. Routing connections have to be re-established to force the re-announcement of routes.

Routing Protocol

Up to SwiftMQ release 9.4.1 messages on routing connections are exchanged with the 2-phase-commit protocol (XA). From SwiftMQ release 9.4.2 onwards there is a choice between XA and Non-XA message exchange. Both have their advantages and disadvantages as described in the next sections.

A transaction has a specific size of messages, configurable via the attribute inbound-transaction-size on both the listener and the connector. Therefore, it is possible to specify different transaction sizes for both directions. "inbound" means that this is the size a router accepts inbound. It is passed to the sending side during the connect phase.

The Routing Swiftlet tries to load up that size messages from the corresponding routing queue and sends it as a single transaction to the other router. The default transaction size is 20 messages. Determining the proper size is dependent on the message size and on the connection speed. Small messages and high-speed connections should have a higher transaction size, e.g. 500 messages, whereas large messages on a low-speed connection should have a lower transaction size, e.g. 1. The default size of 20 fits usual environments.

The transfer of new transactions takes place while previous transactions are in transit in both directions. There is another attribute inbound-window-size for both, listeners and connectors, to specify the maximum of open transactions. The sender side of the routing connection sends new transactions until the number of open transactions reaches this window size. Thereafter it waits until it has a window again (which means, one or more transactions are committed) and continues sending. The higher the window size, the more transactions can be handled asynchronously and the higher the throughput. However, the more open transactions, the longer takes recovery during the startup/reboot of the router. Therefore, the default value is 10 which is useful.

XA Protocol

The exchange of messages between routers takes place in form of XA transactions. An XA transaction is a transaction under the control of SwiftMQ's transaction manager, utilizing the 2-phase-commit protocol to move it from one router to the other.

If a router is shut down, it might have many open XA transactions, dependent on the number of active routing connections and the configured window sizes. Like JMS XA transactions, these are handled by the XA Resource Manager Swiftlet. It checks the XA log during startup and eventually displays a warning message like this:

Example:

CODE
+++ WARNING! 10 prepared transactions found!
+++          Routing XA transactions are automatically recovered.
+++          You may also use Explorer/CLI for commit or rollback.

These open (prepared) XA transactions are automatically recovered once the corresponding router connects again. If that will not be the case, e.g. due to changes in the router network topology, the SwiftMQ Explorer or CLI can be used to commit or roll back these open XA transactions manually. See the XA Resource Manager Swiftlet documentation for details.

The advantage of using XA transactions is that exactly-once delivery (no duplicates, no loss) is ensured by the XA protocol. Messages of prepared but not committed XA transactions are locked until they are committed or rolled back.

The disadvantage is the latency overhead. A single XA transaction requires 3 protocol messages exchanged between the source and destination router until the messages are available at the destination router. The overall throughput can be increased by increasing transaction concurrency via the attribute inbound-window-size attribute but this does not reduce the latency of a single transaction.

Non-XA Protocol (since 9.4.2)

Non-XA can be requested by a listener and/or connector. It will be used if both sides request it and if both sides are at release 9.4.2 or later.

A transaction is immediately committed at the receiving router and the sending router is asynchronously informed. If a routing connection is disconnected, the router dies or is shut down, and open transactions are rolled back. When the connection is re-established, these messages are marked as redelivered and duplicate message detection at the destination queues will check these messages on arrival if they are duplicates and may discard them.

The advantage of the non-XA transactions is the reduction of latency. A single transaction requires only a single protocol message.

The disadvantage is that duplicates may occur under certain scenarios:

  • Duplicate message detection relies on the JMS message-id. It does not work if the JMS message id was disabled which is possible to configure.

  • If a destination queue gets input from other sources while a routing connection is down, the JMS message-ids of the routing connection may be rolled out of the duplicate log in the meantime because it has a limited size.

  • If there are multiple routes over multiple hops to the destination, the rolled-back messages will travel these routes. Duplicate detection works only for the next hop so duplicates may not be detected.

Therefore, a scenario that will not generate possible duplicates is

  • All messages have a JMS message-id.

  • Destination queues do not get other input than from the routing connection.

  • There is no further route with more than 1 hop to the destination router.

Flow Control

Flow control is an important instrument to avoid overloading a router with messages. SwiftMQ generates flow control delays on every queue during the commit of a producer. The flow control delay is a computed estimate of how long it takes to consume queue messages with the current production and consumption rate. If the flow control is respected, an optimal throughput flow will be established which holds the messages of a queue just below the maximum cache size. Therefore, the throughput is maximum at the current consumption rate.

During routing, messages are produced to queues during inbound processing. On each commit, a flow control delay is returned. An attribute inbound-flow-control-enabled can be set to true or false. Setting to true, the flow control is respected and further commits are delayed, depending on the flow control delays. These delays are cascaded through the whole router network back to the producer client if each hop on the route has inbound-flow-control-enabled set to true. If it is set to false (default), flow control delays are not respected and commits are not delayed. So in the worst case, a router is flooded with messages.

Thread Pools

The Routing Swiftlet uses the following thread pools:

  • routing.connection.mgr

  • routing.exchanger

  • routing.scheduler

  • routing.service

  • routing.throttle

routing.connection.mgr

This thread pool is used by the routing connection manager. This is a single instance, performing several tasks during the connect and disconnect phase of a routing connection. The max threads setting has to be 1.

routing.exchanger

Used from the route exchanger to send, receive, and process routes from other routers. There is only a single route exchanger instance per SwiftMQ router so only 1 thread is required on demand. Therefore, the max threads setting has to be 1.

routing.scheduler

Used from routing schedulers. These are asynchronous running components, responsible to package messages into XA transactions and move them to a connection service stage, determined via dynamic routes. A scheduler exists for every routable destination router. It runs on demand and acquires threads from the routing.scheduler pool. The usage of this pool is low. Min/max of each 3 is quite enough for most use cases.

routing.service

This pool is used from the connection service stages. Dependent on the state of a connection and the protocol handling, a connection service has a specific stage running. The most frequented stage is the delivery stage which is activated after the whole protocol handshaking is done and the connection is activated for delivery. The delivery stage sends and received messages and does the whole XA handling, except XA commits if inbound flow control is enabled (see next point). The usage of this pool is high. The default setting for min/max of each 3 is enough to handle about 10 concurrent routing connections under high load.

routing.throttle

This pool is only used if inbound flow control is set to true. In that case, XA commits are dispatched to a throttle handler which throttles XA commits depending on the given flow control delays. That means threads are blocked during the delay. Because each delivery stage has an associated throttle handler and all handlers are served from this pool, a delay on one connection may block other non-delayed connections if the pool wents out of threads. Increasing the max threads should help here.

Configuration

The configuration of the Routing Swiftlet (Unlimited Connections) is defined within the element

XML
      <swiftlet name="sys$routing" .../>

of the router's configuration file.

Attributes of Element "swiftlet"

Definition

Attribute

Type

Mandatory

Description

reject-disconnect-delay

java.lang.Long

No

Time (ms) after which a rejected Connection is closed

stage-valid-timeout

java.lang.Long

No

Time (ms) after which a Protocol Stage in a wait State becomes invalid

roundrobin-enabled

java.lang.Boolean

No

Enables/Disables Round Robin Scheduling

inbound-flow-control-enabled

java.lang.Boolean

No

Enables/Disables Inbound Flow Control

crfactory-class

java.lang.String

No

Challenge/Response Factory Class

route-announce-hop-limit

java.lang.Integer

No

Maximum Hop Count for Route Announce (-1 = unlimited)

Values

Attribute

Values

reject-disconnect-delay

Min: 1000
Default: 5000

stage-valid-timeout

Min: 1000
Default: 15000

roundrobin-enabled

Default: false

inbound-flow-control-enabled

Default: false

crfactory-class

Default: com.swiftmq.auth.ChallengeResponseFactoryImpl

route-announce-hop-limit

Default: 3

Element List "static-routes", Parent Element: "swiftlet"

Static Route Definitions. This element list contains zero or more "static-route" elements with this template definition:

Definition

Attribute

Type

Mandatory

Description

name

java.lang.String

Yes

Name of this Static Route

Element List "filters", Parent Element: "swiftlet"

Route Filter Definitions. This element list contains zero or more "filter" elements with this template definition:

Definition

Attribute

Type

Mandatory

Description

name

java.lang.String

Yes

Name of this Route Filter

type

java.lang.String

Yes

Filter Type

Values

Attribute

Values

type

Choice: include_by_hop include_by_destination exclude_by_hop exclude_by_destination

Element List "routers", Parent Element: "filter"

Routers to filter. This element list contains zero or more "router" elements with this template definition:

Definition

Attribute

Type

Mandatory

Description

name

java.lang.String

Yes

Name of this Router to filter

Element List "listeners", Parent Element: "swiftlet"

Listener Definitions. This element list contains zero or more "listener" elements with this template definition:

Definition

Attribute

Type

Mandatory

Description

name

java.lang.String

Yes

Name of this Listener

bindaddress

java.lang.String

No

Listener Bind IP Address

port

java.lang.Integer

Yes

Listener Port

use-tcp-no-delay

java.lang.Boolean

Yes

Use Tcp No Delay

socketfactory-class

java.lang.String

No

Listener Socketfactory Class

password

java.lang.String

No

Password

keepalive-interval

java.lang.Long

No

Interval for sending Keep Alive Messages

inbound-transaction-size

java.lang.Integer

No

Number of Messages per Transaction

inbound-window-size

java.lang.Integer

No

Max. Number of open Transactions

router-input-buffer-size

java.lang.Integer

No

Router Network Input Buffer Size

router-input-extend-size

java.lang.Integer

No

Router Network Input Extend Size

router-output-buffer-size

java.lang.Integer

No

Router Network Output Buffer Size

router-output-extend-size

java.lang.Integer

No

Router Network Output Extend Size

use-compression

java.lang.Boolean

No

Uses Wirelevel Compression if enabled

use-xa

java.lang.Boolean

No

Uses 2 Phase Commit Protocol (XA) if enabled

Values

Attribute

Values

bindaddress

port

use-tcp-no-delay

Default: true

socketfactory-class

Default: com.swiftmq.net.PlainSocketFactory

password

keepalive-interval

Default: 60000

inbound-transaction-size

Default: 20

inbound-window-size

Default: 10

router-input-buffer-size

Min: 65536
Default: 131072

router-input-extend-size

Min: 65536
Default: 65536

router-output-buffer-size

Min: 65536
Default: 131072

router-output-extend-size

Min: 65536
Default: 65536

use-compression

Default: false

use-xa

Default: true

Element List "host-access-list", Parent Element: "listener"

Host Access List. This element list contains zero or more "host-access-entry" elements with this template definition:

Definition

Attribute

Type

Mandatory

Description

name

java.lang.String

Yes

Name of this Host Access Entry

Element List "connectors", Parent Element: "swiftlet"

Connector Definitions. This element list contains zero or more "connector" elements with this template definition:

Definition

Attribute

Type

Mandatory

Description

name

java.lang.String

Yes

Name of this Connector

hostname

java.lang.String

Yes

Remote Hostname

enabled

java.lang.Boolean

No

Enables/Disables this Connector

port

java.lang.Integer

Yes

Remote Port

use-tcp-no-delay

java.lang.Boolean

Yes

Use Tcp No Delay

socketfactory-class

java.lang.String

No

Connector Socketfactory Class

password

java.lang.String

No

Password

retry-time

java.lang.Long

No

Retry Time

inbound-transaction-size

java.lang.Integer

No

Number of Messages per Transaction

inbound-window-size

java.lang.Integer

No

Max. Number of open Transactions

router-input-buffer-size

java.lang.Integer

No

Router Network Input Buffer Size

router-input-extend-size

java.lang.Integer

No

Router Network Input Extend Size

router-output-buffer-size

java.lang.Integer

No

Router Network Output Buffer Size

router-output-extend-size

java.lang.Integer

No

Router Network Output Extend Size

use-compression

java.lang.Boolean

No

Uses Wirelevel Compression if enabled

use-xa

java.lang.Boolean

No

Uses 2 Phase Commit Protocol (XA) if enabled

Values

Attribute

Values

hostname

enabled

Default: true

port

use-tcp-no-delay

Default: true

socketfactory-class

Default: com.swiftmq.net.PlainSocketFactory

password

retry-time

Min: 1000
Default: 60000

inbound-transaction-size

Default: 20

inbound-window-size

Default: 10

router-input-buffer-size

Min: 65536
Default: 131072

router-input-extend-size

Min: 65536
Default: 65536

router-output-buffer-size

Min: 65536
Default: 131072

router-output-extend-size

Min: 65536
Default: 65536

use-compression

Default: false

use-xa

Default: true

Element "usage", Parent Element: "swiftlet"

Usage.

Element List "connections", Parent Element: "usage"

Active Routing Connections. This element list contains zero or more "usage" elements with this template definition:

Definition

Attribute

Type

Mandatory

Description

name

java.lang.String

Yes

Name of this Active Routing Connection

routername

java.lang.String

No

Name of the connected Router

connecttime

java.lang.String

No

Connect Time

protocol-version

java.lang.String

No

Protocol Version

uses-xa

java.lang.Boolean

No

Uses 2 Phase Commit Protocol (XA) if enabled

Values

Attribute

Values

routername

connecttime

protocol-version

uses-xa

Default: false

Element List "routing-table", Parent Element: "usage"

Routing Table. This element list contains zero or more "destination" elements with this template definition:

Definition

Attribute

Type

Mandatory

Description

name

java.lang.String

Yes

Name of this Destination

Element List "dynamic-routes", Parent Element: "destination"

Dynamic Routes. This element list contains zero or more "dynamic-route" elements with this template definition:

Definition

Attribute

Type

Mandatory

Description

name

java.lang.String

Yes

Name of this Dynamic Route

JavaScript errors detected

Please note, these errors can depend on your browser setup.

If this problem persists, please contact our support.