IBM MQ Series Adapter Configuration

IBM MQ Series Adapter Configuration

Overview

IBM MQ Transport Adapter (hereafter MQ TA) is an add-in for FIXServer that allows clients to communicate with FIXServer over IBM MQSeries middleware. The document contains full instructions on how to install MQ TA for testing.

Starting FixEdge version 6.10.0 it is recommended to use IBM MQ Client library version 8.x.

The older and newer versions may lead to MQ adapters failures

MQ TA is responsible for:

  • Establishing and maintaining sessions with MQ Series Server to communicate with Clients.

  • Transmitting messages to its clients.

  • Delivering messages from clients.

  • Facilitating monitoring and administration.

Monitoring and Administration

Information about the configured TA's session parameters list and dynamic state is sent to the subscribed monitoring application when FIXEdge starts.

When the TA session dynamic state is changed FIXEdge sends the update to the subscribed monitoring application.

MQ TA provides the following monitoring information:

  • Status

  • Number of messages sent

  • Number of messages received

  • Time of the last successful message sending

  • Time of the last successful message receiving

  • List of clients

Integration Guide

Installation

IBM MQ Transport Adapter is present on the FIXEdge C++ package in the bin directory.

MQ Adapter requires IBM MQ client libraries installed in the host with FIXEdge, the libraries can be found on the official IBM MQ site.

Make sure that path to IBM MQ client libraries is added to the path environment variable.

Configuration

IBM MQ Transport Adapter can be configured using FIXICC or directly by editing the FIXEdge.properties file of the correspondent FIX Edge instance. All properties to be set up are described in the table below. You can also use the FIXEdge.properties file from the package as an example.

Make sure that configuration of the adapter correlates with the MQ Series Server parameters.

Property Name

Default Value

Description

TransportLayer.MQAdaptor.Description

MQ Transport Adapter DLL

Description of the transport adapter.

TransportLayer.MQAdaptor.DllName

bin/MQTAAddin.dll

Path to the transport adapter module. In case this parameter is not specified, the TransportLayer.MQAdaptor.AdapterId is applied to define the adapter's library by ID.

TransportLayer.MQAdaptor.AdapterId

 

This parameter is applicable since FIXEdge C++ 6.14.0 version.

The parameter to define the adapter's library by ID. In case this parameter is not specified or TransportLayer.MQAdaptor.DllName parameter is specified too, the TransportLayer.MQAdaptor.DllName is applied.

Required value: MQ

TransportLayer.MQAdaptor.TimeIntervalBeforeReconnect

1000

Time interval in milliseconds between reconnect attempts.

TransportLayer.MQAdaptor.StorageDirectory

FixEdge1/log

Required. Logging directory for storage of outgoing messages.

TransportLayer.MQAdaptor.BufferSizeForMessage

65536

Message buffer size. The max value is 4194304.

Starting from FIXEdge version 7.0.0 the maximum value is 104857600 (100M) and the actual beffure size is limited by the configuration of the related Queue Manager Queue and Channel.

TransportLayer.MQAdaptor.MQ_HOSTNAME

localhost

MS Series Server hostname.

TransportLayer.MQAdaptor.MQ_PORT

1414

MS Series Server port.

TransportLayer.MQAdaptor.MQ_MANAGER_NAME

TestMQ

MS Series manager name.

TransportLayer.MQAdaptor.MQ_CHANNEL_NAME

TestConnection

MS Series Channel name.

TransportLayer.MQAdaptor.MQ_CCSID

437

MS Series Server CCSID. The coded character set identifier to use with the WebSphere MQ queue.

TransportLayer.MQAdaptor.SslKeyRepository

/var/mqm/ssl/key

Path to SSL certificate storage file without extension (SCKR, MQSSLKEYR) e.g. /var/mqm/ssl/key or C:\\Program Files\\IBM\\WebSphere MQ\\ssl\\key.

TransportLayer.MQAdaptor.SslCipherSpecification

TRIPLE_DES_SHA_US

SSL CipherSpec name (SSLCIPH), required to use SSL, e.g. TRIPLE_DES_SHA_US.

TransportLayer.MQAdaptor.SslClientAuthentication

false

Remote peer authentication (SSLCAUTH).

TransportLayer.MQAdaptor.SslPeerName

CN=QMGR.*, OU=IBM, OU=WEBSPHERE

Remote peer DN filter (SSLPEER).

TransportLayer.MQAdaptor.WaitIntervalForGet

1000

Time interval in milliseconds to wait between polling messages on MQ Series Server.

TransportLayer.MQAdaptor.NumAttemptReconnect

10

The number of reconnect attempts to the MQ Series Server.

TransportLayer.MQAdaptor.SessionNumber

1

The number of sessions with MQ Series. Each session is a set of MQ Series queues.

TransportLayer.MQAdaptor.Session.<SessionNumber>.ClientID

MQClient

MQ session ID.

TransportLayer.MQAdapter.Session.<SessionNumber>.FIXVersion

FIX44

In every session, FIX messages use a particular version of the FIX protocol. Use this parameter to set the version of the FIX protocol for a given session.

Valid values: FIX40, FIX41, FIX42, FIX43, FIX44, FIX50, FIX50SP1, FIX50SP2, FIXLatest, custom dictionaries.

TransportLayer.MQAdaptor.Session.<SessionNumber>.SmartXMLProcessor

true

Enables mode of processing XML/FIXML messages:

  • For outgoing FIX XML messages (MsgType = n) adapter extracts XML data and then sends data to the MQ client.

  • For incoming XML/FIXML raw data IBM MQ TA wraps data into a FIX XML message (MsgType = n) and then routes the message to FIXEdge C++.

TransportLayer.MQAdaptor.Session.<SessionNumber>.ToClientQueue

MQClient_to

The name for the Queue dedicated for messages coming from clients to MQ via FIXEdge C++.

TransportLayer.MQAdaptor.Session.<SessionNumber>.FromClientQueue

MQClient_from

The name for the Queue dedicated for messages coming from MQ to clients via FIXEdge C++.

TransportLayer.MQAdaptor.Session.<SessionNumber>.ErrorQueue

MQClient_error

The name for the Queue dedicated for messages, which cannot be handled because of errors.

TransportLayer.MQAdaptor.Session.<SessionNumber>.SenderID

-

Optional. SenderCompID (Tag = 49) in the received message is set to the property value.

TransportLayer.MQAdaptor.Session.<SessionNumber>.TargetID

-

Optional. TargetCompID (Tag = 56) in the received message is set to the property value.

TransportLayer.MQAdaptor.Session.<SessionNumber>.MessageDataFormat

MQFMT_NONE

This parameter is applicable since FIXEdge C++ 6.15.1 version.

Optional. Defines the format of the message data to be sent to IBM MQ via the IBM MQ TA session. Ignored for incoming messages.

Valid values: MQFMT_NONE | MQFMT_STRING

TransportLayer.MQAdaptor.Session.<SessionNumber>.LogIncomingMessages

false

This parameter is applicable since FIXEdge C++ 6.15.1 version.

Optional. Defines whether incoming messages from IBM MQ that were correctly parsed and routed to BL will be stored in the MQ-<ClientID>-Incoming_<Timestamp>.out file.

The MQ-<ClientID>-Incoming_<Timestamp>.out file will be created in the TransportLayer.MQAdaptor.StorageDirectory directory regardless of the value of the LogIncomingMessages property.

Valid values: true | false

TransportLayer.MQAdaptor.Session.<SessionNumber>.FromClientDropMessageFilter

-

Optional. Defines a regular expression (perl syntax) to drop matched messages coming from MQ.

TransportLayer.MQAdaptor.Session.<SessionNumber>.SmartXMLProcessorFromClientMessageFilter

-

Optional. Defines a regular expression (perl syntax) to apply SmartXMLProcessor to matched messages coming from MQ. Overrides default filter: case insensitive "<\?xml version.*|<FIXML.*"

TransportLayer.MQAdaptor.Session.<SessionNumber>.SendForceCommitTimeMs

0

This parameter is applicable since FIXEdge C++ 6.16.1 version.

Optional. This property determines the maximum duration that can elapse before a transaction is forcibly committed to IBM MQ. It acts as a timer that starts after the start of the transaction. Once this timer exceeds the period defined by SendForceCommitTimeMs, if there are uncommitted messages, a commit operation is triggered.

Valid values:

  • Empty value: Indicates that this property is not set, and the default behavior (as if the value is 0) is in effect.

  • Integer Values (milliseconds):
    A whole number ranging from 0 to 60,000 inclusive. The value represents the duration in milliseconds for the force commit interval.

TransportLayer.MQAdaptor.Session.<SessionNumber>.ReceiveForceCommitTimeMs

0

This parameter is applicable since FIXEdge C++ 6.16.1 version.

Optional. This property determines the maximum duration that can elapse before a transaction is forcibly committed from IBM MQ. It acts as a timer that starts after the start of the transaction. Once this timer exceeds the period defined by ReceiveForceCommitTimeMs, if there are uncommitted messages, a commit operation is triggered.

Valid values:

  • Empty value: Indicates that this property is not set, and the default behavior (as if the value is 0) is in effect.

  • Integer Values (milliseconds):
    A whole number ranging from 0 to 60,000 inclusive. The value represents the duration in milliseconds for the force commit interval.

TransportLayer.MQAdaptor.Session.<SessionNumber>.UseAsyncPut

true

This parameter is applicable since FIXEdge C++ 7.1.0 version.

Optional. Controls ability of putting messages asynchronously, without explicit confirmation from the queue manager. Set this to false when the strict messages ordering is required. May impact messages putting throughput.

Configuration Sample

The following configuration describes the basic FIX to MQ conversion message flow.

FIX message from the SENDER session is converted to FIXML and pushed to the middleware via MQ.

All messages from MQ are converted from FIXML to FIX and send to the RECEIVER FIX session.

  1. Configure sessions in FIXEdge.properties

    FIXEdge.properties

    #------------------------------------------------------------ # FIX Layer Section #------------------------------------------------------------ FixLayer.FixEngine.Sessions = SENDER, RECEIVER FixLayer.FixEngine.Session.SENDER.Version = FIX44 FixLayer.FixEngine.Session.SENDER.StorageType = persistentMM FixLayer.FixEngine.Session.SENDER.Role = Acceptor FixLayer.FixEngine.Session.SENDER.SenderCompID = FIXEDGE FixLayer.FixEngine.Session.SENDER.TargetCompID = SENDER FixLayer.FixEngine.Session.SENDER.EncryptMethod = 0 FixLayer.FixEngine.Session.SENDER.InSeqNum = 0 FixLayer.FixEngine.Session.SENDER.OutSeqNum = 0 FixLayer.FixEngine.Session.SENDER.Description = FIX session for test mq sender FixLayer.FixEngine.Session.SENDER.StartTime = 08:00 FixLayer.FixEngine.Session.SENDER.TerminateTime = 23:59 FixLayer.FixEngine.Session.SENDER.RecreateOnLogout = true FixLayer.FixEngine.Session.SENDER.IntradayLogoutTolerance = true FixLayer.FixEngine.Session.SENDER.ForceSeqNumReset = false FixLayer.FixEngine.Session.SENDER.SocketPriority = EVEN FixLayer.FixEngine.Session.SENDER.HandleSeqNumAtLogon = false FixLayer.FixEngine.Session.RECEIVER.Version = FIX44 FixLayer.FixEngine.Session.RECEIVER.StorageType = persistentMM FixLayer.FixEngine.Session.RECEIVER.Role = Acceptor FixLayer.FixEngine.Session.RECEIVER.SenderCompID = FIXEDGE FixLayer.FixEngine.Session.RECEIVER.TargetCompID = RECEIVER FixLayer.FixEngine.Session.RECEIVER.EncryptMethod = 0 FixLayer.FixEngine.Session.RECEIVER.InSeqNum = 0 FixLayer.FixEngine.Session.RECEIVER.OutSeqNum = 0 FixLayer.FixEngine.Session.RECEIVER.Description = FIX session for test mq receiver FixLayer.FixEngine.Session.RECEIVER.StartTime = 08:00 FixLayer.FixEngine.Session.RECEIVER.TerminateTime = 23:59 FixLayer.FixEngine.Session.RECEIVER.RecreateOnLogout = true FixLayer.FixEngine.Session.RECEIVER.IntradayLogoutTolerance = true FixLayer.FixEngine.Session.RECEIVER.ForceSeqNumReset = false FixLayer.FixEngine.Session.RECEIVER.SocketPriority = EVEN FixLayer.FixEngine.Session.RECEIVER.HandleSeqNumAtLogon = false
  2. Configure IBM MQ Adapter

    FIXEdge.properties

    #------------------------------------------------------------ # Transport Layer Section #------------------------------------------------------------ #Comma separated list of identifiers of Transport Adapters should be loaded. TransportLayer.TransportAdapters = TransportLayer.MQAdaptor #------------------------------------------------------------------------- # MQ Adaptor configuration #------------------------------------------------------------------------- TransportLayer.MQAdaptor.Description = MQ Transport Adaptor DLL TransportLayer.MQAdaptor.Type = DLL TransportLayer.MQAdaptor.DllName = bin/MQTAAddin-MD-x64.dll TransportLayer.MQAdaptor.TimeIntervalBeforeReconnect = 1000 TransportLayer.MQAdaptor.BufferSizeForMessage = 65536 TransportLayer.MQAdaptor.MQ_HOSTNAME = ecsa00400539.epam.com TransportLayer.MQAdaptor.MQ_MANAGER_NAME = FIXEdge TransportLayer.MQAdaptor.MQ_PORT = 1414 TransportLayer.MQAdaptor.MQ_CCSID = 437 TransportLayer.MQAdaptor.MQ_CHANNEL_NAME = TestConnection TransportLayer.MQAdaptor.WaitIntervalForGet = 1000 TransportLayer.MQAdaptor.NumAttemptReconnect = 10 TransportLayer.MQAdaptor.StorageDirectory = FIXEdge1/log TransportLayer.MQAdaptor.UseTransactions = true TransportLayer.MQAdaptor.SessionNumber = 2 # MQ QA session TransportLayer.MQAdaptor.SessionNumber = 1 TransportLayer.MQAdaptor.Session.1.ClientID = MQHub1 TransportLayer.MQAdaptor.Session.1.ToClientQueue = MQClient_test TransportLayer.MQAdaptor.Session.1.FromClientQueue = TransportLayer.MQAdaptor.Session.1.ErrorQueue = MQClient_error TransportLayer.MQAdaptor.Session.1.SmartXMLProcessor = true TransportLayer.MQAdaptor.Session.1.SendTransactionSize = 300 TransportLayer.MQAdaptor.Session.1.ReceiveTransactionSize = 1 TransportLayer.MQAdaptor.SessionNumber = 2 TransportLayer.MQAdaptor.Session.2.ClientID = MQHub2 TransportLayer.MQAdaptor.Session.2.ToClientQueue = TransportLayer.MQAdaptor.Session.2.FromClientQueue = MQClient_test TransportLayer.MQAdaptor.Session.2.ErrorQueue = MQClient_error TransportLayer.MQAdaptor.Session.2.SmartXMLProcessor = true TransportLayer.MQAdaptor.Session.2.SendTransactionSize = 300 TransportLayer.MQAdaptor.Session.2.ReceiveTransactionSize = 1
  3. Configure BL 

    <?xml version="1.0" encoding="UTF-8"?> <FIXEdge> <BusinessLayer> <Rule Description="Convert ExecutionReport from FIX.4.4 to FIXML.4.4"> <Source Name="SENDER" /> <Action> <Convert SourceProtocol="FIX.4.4" TargetProtocol="FIXML.4.4"/> <Send Name="MQHub1"/> </Action> </Rule> <Rule Description="Route MQ messages back to receiver and convert from FIXML.4.4 to FIX.4.4"> <Source Name="MQHub2" /> <Action> <Convert SourceProtocol="FIXML.4.4" TargetProtocol="FIX.4.4"/> <Send Name="RECEIVER"/> </Action> </Rule> <DefaultRule> <Action> <DoNothing/> </Action> </DefaultRule> </BusinessLayer> </FIXEdge>
  4. Configure Queues Managers on the IBM WebSphere server.

Error queue

An error queue is a local queue to which error messages can be sent by the WebSphere MQ connector when a message operation fails. For target queues, the error queue acts as a backup option for the target queue when messages cannot be written to the target queue

As per the solution diagram above, there are the following reasons for messages sent to the error queue:

  1. FIXEdge can't send data to MQ (e.g. when there is no connection to the MQ server).

  2. FIXEdge can't receive data from the MQ server.

  3. Other various MQ errors (e.g. configuration issues, or message content issues).

FIXEdge can't produce data to MQ

The reason for getting messages to ErrorQueue is diverse, it is necessary to analyze the logs.

To process messages from the queue, it's recommended:

  • Use different Error Queues per session. It would be easier to troubleshoot issues if the session would have its own error queue.
    It can be configured with the FIXEdge property:

    TransportLayer.MQAdaptor.Session.1.ErrorQueue = MQClient_error_1 TransportLayer.MQAdaptor.Session.2.ErrorQueue = MQClient_error_2
  • Use the dmpmqmsg tool for moving messages from the error queue to the producer. All messages from the error queue should be replayed.

    dmpmqmsg -m MQClient -I MQClient_error -o MQClient_error_2 -s FIXEdge

    -m QueueManagerName.
    -I Input queue name.
    -o Output queue name.
    -s Message content, as all messages have senderCompId and TargetCompId can be used for filtering.

FIXEdge can't consume data from the MQ server and other various MQ errors

These cases are rare ones if there were no configuration changes. 

Issues not causing messages in the error queue

There are cases that do not lead to the messages in the Error queue.

E.g.: FIXEdge can't push the data to the FIX connection because the destination is down.

For troubleshooting, in this case, it's recommended to upgrade FIXEdge to version 6.9.0 with a Managed Queue feature.
It was designed for cases when messages should be pushed to the counterparty when they come back online and do not support recovery with resend requests.

Transactions in MQ

FIXEdge MQ Transport Adapter has a transaction mechanism. Before sending it to MQ the messages are persisted in the files.

A path to the files can be configured with a property:

FIXEdge.properties
TransportLayer.MQAdaptor.StorageDirectory = FIXEdge1/log

The file storages are needed for keeping undelivered messages that require resending after FIXEdge restart (e.g. in case of failure).

Each file represents an MQ Session and the name of the file contains the ID of the session, e.g.:

MQ Adapter property

Storage file

MQ Adapter property

Storage file

TransportLayer.MQAdaptor1.Session.1.ClientID = MQHub1

TransportLayer.MQAdaptor1.Session.1.ErrorQueue = errQ

MQ-MQHub1_2005211210150121.out

MQ-MQHub1-Errors_2005211210150131.out

TransportLayer.MQAdaptor1.Session.2.ClientID = MQHub2

TransportLayer.MQAdaptor1.Session.2.ErrorQueue = errQ

MQ-MQHub2_2005211210150801.out

MQ-MQHub2-Errors_2005211210150801.out

MQ Session logs have data and corresponding transaction flag:

Examples of the log from MQ_<ClientID>_xxx.out:

MQ-<ClientID>_xxx.out
<Record valid='Y' size='Ó ' data='8=FIX.4.4 9=3259 35=AE 49=FIXClient 56=FIXEdgeMQHub1 115=STRING 128=STRING 90=1 91=D 34=169 50=STRING 142=STRING 57=STRING...10=139'/> ... <Record valid='N' size='Ó ' data='8=FIX.4.4 9=3259 35=AE 49=FIXClient 56=FIXEdgeMQHub1 115=STRING 128=STRING 90=1 91=D 34=208 50=STRING 142=STRING 57=STRING...10=137'/>

Removing the storage files causes undelivered data will be deleted.

Start and Stop operations for IBM MQ TA

 

Available since FIXEdge 6.13.0 release.

FIXEdge C++ provides a Start operation for Disconnected IBM MQ TA sessions and a Stop operation for Connecting and Running IBM MQ TA sessions on request from the subscribed monitoring application.

Please refer to the Transport adaptor operations for FIXEdge C++ page for additional details about Start and Stop operations.

Start operation

Start operation can be applied to IBM MQ TA sessions in the Disconnected state.

FIXEdge starts a particular IBM MQ TA session on the request from the subscribed monitoring application and if the operation has been applied replies with a successful response.

In case when there is no session with the requested name FIXEdge logs an error and replies to the subscribed monitoring application with an error response below: 

Can't find session with id <session_name>

In case when Start operation cannot be applied FIXEdge replies to the subscribed monitoring application with an error response and logs an error below:

"Session '<session_name>': The session <session_name> can't be started: <description> Reason: Operation cannot be applied"

Stop operation

Stop operation can be applied to IBM MQ TA sessions in the Running and Connecting states.

FIXEdge stops a particular IBM MQ TA session on the request from the subscribed monitoring application and if the operation has been applied replies with a successful response.

In case when there is no session with the requested name FIXEdge logs an error and replies to the subscribed monitoring application with an error response below:

Can't find session with id <session_name>

In case when Stop operation cannot be applied FIXEdge replies to the subscribed monitoring application with an error response and logs an error below:

"Session '<session_name>': The session <session_name> can't be stopped: <description> Reason: Operation cannot be applied"

In case when IBM MQ TA session is in a Disconnected state and IBM MQ TA receives the message, this message is persisted in storage to be sent on the IBM MQ TA session start.

Troubleshooting

The message is not sent to the client with multiple MQ TA configuration

The message is not delivered to MQ.

The following error appears in FixEdge.log when you use one MQ .dll for several adapters:

FixEdge.log
ERROR [MQQueueWriter] <Thread_ID> Removed message doesn't equal to sent message! Storage: 'MQTA_ID' Message removed from storage

Root cause

To different threads use shared resources from a single library MQ TA.  For example, it may happen if several transport adapters are configured wrong.

Solution

A user should get rid of usage of one shared library by several threads. There are 2 ways: 

  1. Use a single MQ TA library with several sessions: 

    TransportLayer.TransportAdapters = TransportLayer.MQAdaptor TransportLayer.MQAdaptor.DllName = bin/MQTAAddin-MD-x64.dll #... TransportLayer.MQAdaptor.SessionNumber = 2 TransportLayer.MQAdaptor.Session.1.ClientID = MQTA_ID_1 TransportLayer.MQAdaptor.Session.1.ToClientQueue = MQClient_to_1 TransportLayer.MQAdaptor.Session.1.FromClientQueue = TransportLayer.MQAdaptor.Session.1.ErrorQueue = TransportLayer.MQAdaptor.Session.1.ReceiveTransactionSize=10 TransportLayer.MQAdaptor.Session.1.SendTransactionSize=10 TransportLayer.MQAdaptor.Session.2.ClientID = MQTA_ID_2 TransportLayer.MQAdaptor.Session.2.ToClientQueue = MQClient_to_2 TransportLayer.MQAdaptor.Session.2.FromClientQueue = TransportLayer.MQAdaptor.Session.2.ErrorQueue = TransportLayer.MQAdaptor.Session.2.ReceiveTransactionSize=10 TransportLayer.MQAdaptor.Session.2.SendTransactionSize=10
  2. Use several MQ TAs with their own library:

    TransportAdapters = TransportLayer.MQAdaptor, TransportLayer.MQAdaptor2 TransportLayer.MQAdaptor.DllName = bin/MQTAAddin-MD-x64.dll #... TransportLayer.MQAdaptor2.DllName = bin/MQTAAddin-MD-x64_2.dll #...

IBM MQ Error codes

The following error appears in FixEdge.log:

ERROR [MQQueuesReader] 1284 MQQueuesReader unable to create queue for client'trgQ'. Reason: Failed to set character set. Code:2538 ERROR [MQQueuesReader] 244 MQQueuesReader unable to create queue for client'srcQ'. Reason: Failed to set character set. Code:2538 ERROR [MQQueueWriter] 3368 MQTA failed to execute operation for client 'MQHub1': Failed to set character set. Code:2538

Solution

Please find the API Error codes on the official site.

Reason code 2085

FixEdge.log
2021-12-15 17:27:31,361 GMT   ERROR   [MQQueueWrite]  140457136101120  ImqQueue::open ended with reason code 2085

Description:

The user is referencing an unknown object. The parameters values on the client-side (FIXEdge) don't correspond to the parameters on the Server-side (MQ Server). 

Solution

Please check configuration values for properties:

MQ Adapter can't find all its dependencies

FIXEdge got the following ERROR records in the FixEdge.log during initialization that some libraries are not found on Windows:

FixEdge.log
<timestamp> Russia TZ 2 Standard Time ERROR [TransportLayer] <thread> Transport Adaptor 'MQAdaptor' has failed to initialize: Error loading DLL 'C:\B2BITS\FIXEdge\bin\MQTAAddin-MD-x64.dll'. Dependencies list: MSVCP140.dll => C:\Windows\SYSTEM32\MSVCP140.dll USER32.dll => C:\Windows\system32\USER32.dll V12-vc14-MD-x64.dll => C:\B2BITS\FIXEdge\bin\V12-vc14-MD-x64.dll VCRUNTIME140.dll => C:\Windows\SYSTEM32\VCRUNTIME140.dll api-ms-win-crt-filesystem-l1-1-0.dll => C:\Windows\SYSTEM32\api-ms-win-crt-filesystem-l1-1-0.dll api-ms-win-crt-heap-l1-1-0.dll => C:\Windows\SYSTEM32\api-ms-win-crt-heap-l1-1-0.dll api-ms-win-crt-runtime-l1-1-0.dll => C:\Windows\SYSTEM32\api-ms-win-crt-runtime-l1-1-0.dll api-ms-win-crt-stdio-l1-1-0.dll => C:\Windows\SYSTEM32\api-ms-win-crt-stdio-l1-1-0.dll api-ms-win-crt-utility-l1-1-0.dll => C:\Windows\SYSTEM32\api-ms-win-crt-utility-l1-1-0.dll imqb23vn.dll => not found imqc23vn.dll => not found

Solution

  1. Make sure that IBM MQ Client is installed on the host with FIXEdge.

  2. Make sure that the environment variable PATH contains the path to the IBM MQ Client bin folder.

  3. Make sure MQTAAddin-xx.dll MQTAAddin-xx.so library exists in FIXEdge/bin folder.

The message is not processed due to an incorrect rule found

The message was received from the client, but is not processed and forwarded by FIXEdge. The following error appears in FixEdge.log:

ERROR [BL_RoutingTable] 17680 Incorrect rule found: FIX version 'FIX44' of source protocol doesn't correspond to target protocol FIXML.4.4.

Root cause

Incorrect protocol version(s) was specified for conversion in BL_Config.xml:

<Rule Description="Convert ExecutionReport from FIX44 to FIXML.4.4"> <Source Name="SENDER" /> <Action> <Convert SourceProtocol="FIX44" TargetProtocol="FIXML.4.4"/> <Send Name="MQHub1"/> </Action> </Rule>

Solution:

Check for possible protocol versions for conversion in Convert. Make changes in BL_Config.xml to set up the correct ones:

<Convert SourceProtocol="FIX.4.4" TargetProtocol="FIXML.4.4"/>

WebSphere MQ Setup Guide

Getting MQ Soft

If you need to set up your own MQ server, you can download software from IBM Site.

Websphere MQ Configuration

Steps to configure access to Websphere MQ (running on Windows) from the remote host are described below. This configuration is performed on the MQ Server host.

  1. Create User:

    1. Create a non-domain user e.g. mquser in 'mqm' group.

    2. Change its domain to a local hostname e.g. EVUAKYISD0223.

    3. Grant this user permission to log in remotely.

    4. Grant this user Administrative permissions.

  2. Start MQ:

    1. Start all MQ services ('IBM MQSeries' and 'IBM Websphere MQ (Installation N)') under the user created in the previous step.
      In order to change the user for service, it is needed to go to Services. Select service and open its properties, go to the 'Log On' tab, select 'This user', and specify user credentials.

  3. Configure Manager and Queues:

    1. Start MQExplorer.

    2. Add new Queue Manager (e.g. TestMQ):

    3. Add Server-connection channel to created Queue Manager (e.g. TestConnection):



    4. Set channel MCA with a user from step 1.1 (mquser):



  4. Add queues, (e.g. MQClient_error, MQClient_from, MQClient_to):

Check connection to Queue Manager from a remote host

Check connection using MQ Explorer

In order to use the described approach, you need to install IBM WebSphere MQ Explorer in the client box.

In order to check the connection to Queue Manager from the remote (client) host:

  1. Open MQExplorer on a remote host.

  2. Add Remote Queue Manager performing the following steps:


    1. Specify the Queue Manager name.

    2. Specify the host and Server-connection channel.

    3. Click Finish

QM should be accessible via remote MQ Explorer.

Check connection using FE

In order to check the connection to Queue Manager from the remote (client) host using FE:

  1. Configure FE using the following sample properties:

    FIXEdge.properties

    TransportLayer.TransportAdapters = TransportLayer.MQAdaptor #------------------------------------------------------------------------- # MQ Adaptor Settings #------------------------------------------------------------------------- TransportLayer.MQAdaptor.Description = MQ Transport Adaptor DLL TransportLayer.MQAdaptor.TimeIntervalBeforeReconnect = 1000 TransportLayer.MQAdaptor.DllName = bin/MQTAAddin-MD-x64.dll TransportLayer.MQAdaptor.StorageDirectory = FixEdge1/log TransportLayer.MQAdaptor.NumAttemptReconnect = -1 TransportLayer.MQAdaptor.WaitIntervalForGet = 10000 TransportLayer.MQAdaptor.BufferSizeForMessage = 65536 TransportLayer.MQAdaptor.MQ_HOSTNAME = EVUAKYISD0223.kyiv.epam.com TransportLayer.MQAdaptor.MQ_MANAGER_NAME = TestMQ TransportLayer.MQAdaptor.MQ_PORT = 1414 TransportLayer.MQAdaptor.MQ_CCSID = 437 TransportLayer.MQAdaptor.MQ_CHANNEL_NAME = TestConnection TransportLayer.MQAdaptor.SessionNumber = 1 TransportLayer.MQAdaptor.Session.1.ClientID = MQClient TransportLayer.MQAdaptor.Session.1.FromClientQueue = MQClient_from TransportLayer.MQAdaptor.Session.1.ToClientQueue = MQClient_to TransportLayer.MQAdaptor.Session.1.ErrorQueue = MQClient_error TransportLayer.MQAdaptor.Session.1.SmartXMLProcessor = false
  2. Check if Queues are accessible:

    FixEdge.log

    [DEBUG] 20120718-11:41:33.609 [2840] [MQEngine] - Was created queue 'MQClient_from' [DEBUG] 20120718-11:41:33.609 [2840] [MQQueuesReader_Debug] - createClientQueue() finished [DEBUG] 20120718-11:41:33.609 [2840] [MQQueuesReader_Debug] - ClientQueue created. [DEBUG] 20120718-11:41:33.609 [2840] [MQQueuesReader_Debug] - MQQueuesReader::readFromQueuesAndPassToTL(). [DEBUG] 20120718-11:41:33.609 [2840] [MQQueuesReader_Debug] - fromClientQueue->getFirst(). [DEBUG] 20120718-11:41:38.039 [12692] [MQEngine] - Was created queue 'MQClient_to' [DEBUG] 20120718-11:41:38.251 [12692] [MQEngine] - Was created queue 'MQClient_error' [DEBUG] 20120718-11:41:38.251 [12692] [MQQueueWriter] - Queues were created for client 'MQClient' [NOTE] 20120718-11:41:38.251 [12692] [MQQueueWriter] - Restore messages for out queue 'MQClient'. [NOTE] 20120718-11:41:38.251 [12692] [MQQueueWriter] - Create storage for the: MQClient [DEBUG] 20120718-11:41:38.251 [12692] [MQQueueWriter] - Load storage. [DEBUG] 20120718-11:41:38.251 [12692] [MQQueueWriter] - Persistance storage use file: D:\Program Files\B2Bits\FIX Edge\v.5.4.1.40091\FixEdge1\log\MQ-MQClient_07180941382511.out [NOTE] 20120718-11:41:38.251 [12692] [MQQueueWriter] - Restore messages for error queue 'MQClient'. [NOTE] 20120718-11:41:38.251 [12692] [MQQueueWriter] - Create storage for the: MQClient-Errors [DEBUG] 20120718-11:41:38.251 [12692] [MQQueueWriter] - Load storage. [DEBUG] 20120718-11:41:38.252 [12692] [MQQueueWriter] - Persistance storage use file: D:\Program Files\B2Bits\FIX Edge\v.5.4.1.40091\FixEdge1\log\MQ-MQClient -Errors_07180941382511.out [DEBUG] 20120718-11:41:43.678 [2840] [MQQueueRead] - Was performed get operation on queue 'MQClient_from' with reason code :2033 [DEBUG] 20120718-11:41:43.678 [2840] [MQQueueRead] - MQQueueRead::getFirst failed to get message '' [DEBUG] 20120718-11:41:43.678 [2840] [MQQueuesReader_Debug] - MQQueuesReader::readFromQueuesAndPassToTL(). [DEBUG] 20120718-11:41:43.678 [2840] [MQQueuesReader_Debug] - fromClientQueue->getFirst().
  3. Route message to MQ and check FE logs:

    FixEdge.log

    [DEBUG] 20120718-11:48:16.389 [7968] [FL_MsgTrace] - New message FIX was received from session with ID 'TROIKALSE'. Message: '8=FIX.4.49=16535=D49=LSE56=TROIKA34=250=3073757=ECL_TURQ97=Y52=20120718-09:48:16.38811=900010081=1003000321=255=TESTA54=160=20000809-18:20:3238=400040=244=3059=010=224'. [DEBUG] 20120718-11:48:16.389 [7968] [BL_Layer] - Process incoming message. [DEBUG] 20120718-11:48:16.389 [7968] [BL_RoutingTable] - There are no suitable rules were found for message with Source ID 'LSE', executing DefaultRule. [DEBUG] 20120718-11:48:16.389 [7968] [CC_Layer] - BL has processed a message. Number of client IDs for delivery :0. Number or FIX sessions for delivery :0.. Number or sources identifiers for delivery :1. Source IDs: 1. 'MQClient' [DEBUG] 20120718-11:48:16.389 [7968] [TransportLayer] - Sending message '8=FIX.4.49=16535=D49=LSE56=TROIKA34=250=3073757=ECL_TURQ97=Y52=20120718-09:48:16.38811=900010081=1003000321=255=TESTA54=160=20000809-18:20:3238=400040=244=3059=010=224' to client MQClient [DEBUG] 20120718-11:48:16.389 [7968] [MQQueueWriter] - Was put message to messageQueue. Message = (ToClientQueue, MQClient, 8=FIX.4.49=16535=D49=LSE56=TROIKA34=250=3073757=ECL_TURQ97=Y52=20120718-09:48:16.38811=900010081=1003000321=255=TESTA54=160=20000809-18:20:3238=400040=244=3059=010=224) [DEBUG] 20120718-11:48:16.389 [7968] [MQQueueWriter] - Store into the Persistance storage. [DEBUG] 20120718-11:48:16.389 [12228] [MQQueueWriter] - Was get message from MessageQueue. Message: ( toClientQueue,MQClient, 8=FIX.4.49=16535=D49=LSE56=TROIKA34=250=3073757=ECL_TURQ97=Y52=20120718-09:48:16.38811=900010081=1003000321=255=TESTA54=160=20000809-18:20:3238=400040=244=3059=010=224) [DEBUG] 20120718-11:48:16.460 [12228] [MQQueueWrite] - Was performed put operation on queue 'MQClient_to' with reason code :0. Message = '8=FIX.4.49=16535=D49=LSE56=TROIKA34=250=3073757=ECL_TURQ97=Y52=20120718-09:48:16.38811=900010081=1003000321=255=TESTA54=160=20000809-18:20:3238=400040=244=3059=010=224' [DEBUG] 20120718-11:48:16.460 [12228] [MQQueueWrite] - message was successfully sent to to queue 'MQClient_to' with reason code :0 [DEBUG] 20120718-11:48:16.460 [12228] [MQQueueWriter] - message was put to ToClient queue.Client 'MQClient'. MEssage '8=FIX.4.49=16535=D49=LSE56=TROIKA34=250=3073757=ECL_TURQ97=Y52=20120718-09:48:16.38811=900010081=1003000321=255=TESTA54=160=20000809-18:20:3238=400040=244=3059=010=224'

Configuring SSL in IBM MQ Server

This instruction assumes that non-SSL configuration works OK

1. On the IBM MQ server start the IBM Key Management tool.

2. Create a new Key Database File:

  • Key database type: CMS.

  • File name: key.kdb.

  • Location: use the same location as specified in the "SSL Key Repository" parameter of your Queue Manager (for example, if SSL Key Repository is "C:\Program Files (x86)\IBM\WebSphere MQ\Qmgrs\FIXEdge\ssl\key", then set Location: C:\Program Files (x86)\IBM\WebSphere MQ\Qmgrs\FIXEdge\ssl\).

3. Create a Password and set the "Stash password to a file" checkbox.

4. Click on the "New Self-Signed..." button to create a self-signed certificate.

  • Key Label: set it as "ibmwebspheremq<QM_name>", here QM_name - name of your Queue Manager in lower case.

  • Common Name: set any.

  • Organization: set any.

  • Organization Unit: set any.