Table of Contents
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.
Info |
---|
Starting FixEdge version 6.10.0 it it is recommended to use IBM MQ Client library version 8version 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
...
- 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 on 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.
...
IBM MQ Transport Adapter can be configured using FIXICC or directly by editing the FIXEdgethe FIXEdge.properties file properties file of the correspondent FIX Edge instance. All properties to be set up are described in the table below. You can also use FIXEdge.properties file 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 transportadapter transport adapter module. In case this parameter is not specified, the TransportLayerthe TransportLayer.MQAdaptor.AdapterId is applied to define the adapter's library by ID. | |||||
TransportLayer.MQAdaptor.AdapterId |
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|||||
Info | 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. Required. | |||||
TransportLayer.MQAdaptor.BufferSizeForMessage | 65536 | Message buffer size. Max The max value is 4194304. 0 means a default value 64 * 1024. | |||||
TransportLayer.MQAdaptor.MQ_HOSTNAME | localhost | MS Series Server host namehostname. | |||||
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 message messages on MQ Series Server. | |||||
TransportLayer.MQAdaptor.NumAttemptReconnect | 10 | Number The number of reconnect attempts to the MQ Series Server. | |||||
TransportLayer.MQAdaptor.SessionNumber | 1 | Number The number of sessions with MQ Series. Each session is a set of MQ Series queues. | |||||
TransportLayer.MQAdaptor.Session.1<SessionNumber>.ClientID | MQClient | MQ session ID. | |||||
TransportLayer.MQAdapter.Session. | 1<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. | Acceptable Valid values: | |||
TransportLayer.MQAdaptor.Session.1<SessionNumber>.SmartXMLProcessor | true | Enables mode of processing XML/FIXML messages:
| |||||
TransportLayer.MQAdaptor.Session.1<SessionNumber>.ToClientQueue | MQClient_to | The name for the Queue , dedicated for message messages coming from client clients to MQ via FIX EdgeFIXEdge C++. | |||||
TransportLayer.MQAdaptor.Session.1<SessionNumber>.FromClientQueue | MQClient_from | The name for the Queue , dedicated for message messages coming from MQ to client via FIX Edgeclients via FIXEdge C++. | |||||
TransportLayer.MQAdaptor.Session.1<SessionNumber>.ErrorQueue | MQClient_error | The name for the Queue dedicated for messagemessages, which cannot be handled because of errorerrors. | |||||
TransportLayer.MQAdaptor.Session.1<SessionNumber>.SenderID | - | Not requiredOptional. SenderCompID (Tag = 49) in the received message is set to the property value. | |||||
TransportLayer.MQAdaptor.Session.1<SessionNumber>.TargetID | - | Not requiredOptional. TargetCompID (Tag = 56) in the received message is set to the property value. | |||||
TransportLayer.MQAdaptor.Session.<SessionNumber>.MessageDataFormat | MQFMT_NONE |
Optional. The format of the message data to be sent to IBM MQ via the IBM MQ TA session. Ignored for acceptor sessions. Valid values: MQFMT_NONE, MQFMT_STRING. | |||||
TransportLayer.MQAdaptor.Session.<SessionNumber>.FromClientDropMessageFilter | - | Not requiredOptional. Defines a regular expression (perl syntax) to drop matched messages coming from MQ. | |||||
TransportLayer.MQAdaptor.Session. | 1<SessionNumber>.SmartXMLProcessorFromClientMessageFilter | - | Not requiredOptional. Defines a regular expression (perl syntax) to apply SmartXMLProcessor to matched messages coming from MQ. Overrides default filter: case insensitive "<\?xml version.*|<FIXML.*" |
Configuration Sample
...
The following configuration describes the basic FIX to MQ conversion message flow.
FIX message from SENDER session the SENDER session is converted to FIXML and pushed to the middleware via MQ.
All messages from MQ are be converted from FIXML to FIX and send it to RECEIVER FIX the RECEIVER FIX session.
Configure sessions in FIXEdge.properties
Code Block title 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
Configure IBM MQ Adapter
Code Block title 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
Configure BL
Code Block language xml <?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>
FullNote Info Please refer to the Convert page for the full list of possible versions to convert can be found in Convert.
- Configure Queues Managers on the IBM Websphere 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:
- FIXEdge can't produce send data to MQ . (e.g. due to when there is no connection to the MQ server).)
- FIXEdge can't consume receive data from the MQ server.
- Other various MQ errors . (Ee.g. due to configuration issues, or message content issues).
FIXEdge can't produce data to MQ
The reason for getting messages to ErrorQueue is diverse, for each it is necessary individual analysis of 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:Code Block language perl 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 on. So all All messages from the error queue should be replayed.
Code Block language perl 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 it 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.
...
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.
...
Each file represents an MQ Session and the name of the file contains the ID of the session E, e.g.:
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:
- Status of the undelivered transaction: Record Record valid='Y'.
- Status of the finished transaction. The message has been sent to MQ: Record Record valid='N'.
Examples of the log from MQ_<ClientID>_xxx.out:
Code Block | ||||
---|---|---|---|---|
| ||||
<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'/> |
Noteinfo |
---|
Removing the storage files causes undelivered data will be deleted. |
Start and Stop operations for IBM MQ TA
Noteinfo |
---|
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.
...
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 following error appears in FixEdge.log when you use one MQ .dll for severaladaptersseveral adapters:
Code Block | ||
---|---|---|
| ||
ERROR [MQQueueWriter] <Thread_ID> Removed message doesn't equal to sent message! Storage: 'MQTA_ID' Message removed from storage |
...
A user should get rid of usage of one shared a library by several threads. There are 2 ways:
Use a single MQ TA library with several sessions sessions:
Code Block language perl 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
Use several MQ TA TAs with their own library:
Code Block language perl TransportAdapters = TransportLayer.MQAdaptor, TransportLayer.MQAdaptor2 TransportLayer.MQAdaptor.DllName = bin/MQTAAddin-MD-x64.dll #... TransportLayer.MQAdaptor2.DllName = bin/MQTAAddin-MD-x64_2.dll #...
...
The following error appears in FixEdge.log:
Code Block | ||
---|---|---|
| ||
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 |
...
The user is referencing an unknown object. The parameters values on the client-side (FIXEdge) doesndon't correspond to the parameters on the Server-side (MQ Server).
Solution
Please check configuration values for properties:
...
- Make sure that IBM MQ Client is installed on the host with FIXEdge.
- Make sure that the environment variable PATH contains PATH contains the path to the IBM MQ Client bin folder.
- 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
Message The message was received from the client, but is not processed and forwarded by FIXEdge. The following error appears in FixEdge.log:
...
Check for possible protocol versions for conversion in Convert. Make changes in BL_Config.xml to set up the correct ones:
Code Block | ||
---|---|---|
| ||
<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.
- Create User:
- Create a non-domain user e.g. mquser in mquser in 'mqm' group.
- Change its domain to a local hostname e.g. EVUAKYISD0223 EVUAKYISD0223.
- Grant this user permissions permission to log in remotely.
- Grant this user Administrative permissions.
- Start MQ:
- Start all MQ services ('IBM MQSeries' and 'IBM Websphere MQ (Installation N)') under the user created on 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.
- Start all MQ services ('IBM MQSeries' and 'IBM Websphere MQ (Installation N)') under the user created on in the previous step.
- Configure Manager and Queues:
- Start MQExplorer.
- Add new Queue Manager (e.g. TestMQ TestMQ):
- Add Server-connection channel to created Queue Manager (e.g. TestConnection):
- Set channel MCA with a user from step 1.1 (mquser):
- Add queues, (e.g. MQClient_error, MQClient_from, MQClient_to):
Check connection to Queue Manager from a remote host
...
In order to use the described approach, you need to install IBM WebSphere MQ Explorer to in the client box.
In order to check the connection to Queue Manager from the remote (client) host:
- Open MQExplorer on a remote host.
- Add Remote Queue Manager performing the following steps:
-
Specify the Queue Manager name. Specify the host and Server-connection channel.
Click Finish
-
QM should be accessible via remote MQ Explorer.
...
Configure FE using the following sample properties:
Code Block title 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
Check if Queues are accessible:
Code Block title 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().
Route message to MQ and check FE logs:
Code Block title 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.
5. Close IBM Key Management using the menu Key Database File -> Close and then Key Database File -> Exit.
6. Go to SSL to the SSL Key Repository folder and make sure that only SYSTEM and your MQ user have full access to keyto the key.kdb, key.rdb and key.sth files. All other user users may have only "Read" permissions.
7. In Websphere MQ Explorer go to Channels.
8. Open the Properties of your channel and on the SSL tab select SSL Cipher Spec. For example, ECDHE_RSA_AES_128_GCM_SHA256.
- Select SSL Authentication = Optional if you don't plan to use SSL client authentication.
- Apply your changes
9. From the SSL Key Repository folder (see step 2) copy three files: key.kdb, key.rdb and key.sth files somewhere on FIXEdge's server (for example, FixEdge1/conf).
10. Configure FIXEdge.properties to use SSL connection with MQ:
- TransportLayer.MQAdaptor.SslKeyRepository = C:\\B2BITS\\FIXEdge\\FixEdge1\\conf\\key
- TransportLayer.MQAdaptor.SslCipherSpecification = ECDHE_RSA_AES_128_GCM_SHA256
- TransportLayer.MQAdaptor.SslClientAuthentication = false
- TransportLayer.MQAdaptor.SslPeerName =
Troubleshooting
Disabling IBM MQ security
MQ TA has not supported the authentication in IBM MQ Server.
It can lead to failure in MQ TA initialization with the error records in the log:
Info |
---|
"Failed to set the character set. Code: ...<some code>...": |
Make sure that QueueManager on the server - side is running and FIXEdge are is trying to set the right code character set.
If the following error message appears while accessing the remote MQ manager using MQExplorer:
Solution
The authentication should be disabled. You should perform the following steps:
Login Log in to the remote server where MQ Instance is running.
Open cmd.
Run the 'runmqsc'. Check if connected to the correct QM:
Execute 'ALTER QMGR CHLAUTH(DISABLED)':
Try to reestablish connection by clicking 'No' in the dialog:
And Finish in the dialog:
- If the error is still here, look at Channel authentication records and make sure that your account is not in the Block User List:
- Try again steps 5-6.
Also, you can find how to disable IBM MQ authentication on the official site.