【发布时间】:2015-09-30 02:25:47
【问题描述】:
我正在尝试从 websphere mq 队列中读取消息并将其转储到另一个队列中。
下面是我必须做的代码
private void transferMessages()
{
MQQueueManager sqmgr = connectToQueueManager(S_SERVER_NAME, S_QMGR_NAME, S_PORT_NUMBER, S_CHANNEL_NAME);
MQQueueManager dqmgr = connectToQueueManager(D_SERVER_NAME, D_QMGR_NAME, D_PORT_NUMBER, D_CHANNEL_NAME);
if (sqmgr != null && dqmgr != null)
{
MQQueue sq = openSourceQueueToGet(sqmgr, S_QUEUE_NAME);
MQQueue dq = openDestQueueToPut(dqmgr, D_QUEUE_NAME);
if (sq != null && dq != null)
{
setPutMessageOptions();
setGetMessageOptions();
processMessages(sqmgr, sq, dqmgr, dq);
}
}
}
我在 for 循环中调用上述方法并创建单独的线程,如下所示。
int NO_OF_THREADS = 5;
Thread[] ts = new Thread[NO_OF_THREADS];
for (int i = 0; i < NO_OF_THREADS; i++)
{
ts[i] = new Thread(() => transferMessages());
ts[i].Start();
}
如您所见,我正在 transferMessages 方法中与队列管理器建立新连接。由于某种原因不确定,该程序仅与 MQ 建立一个连接。
连接队列管理器的自定义方法如下..
private MQQueueManager connectToQueueManager(string MQServerName, string MQQueueManagerName, string MQPortNumber, string MQChannel)
{
try
{
mqErrorString = "";
MQQueueManager qmgr;
Hashtable mqProps = new Hashtable();
mqProps.Add(MQC.HOST_NAME_PROPERTY, MQServerName);
mqProps.Add(MQC.CHANNEL_PROPERTY, MQChannel);
mqProps.Add(MQC.PORT_PROPERTY, Convert.ToInt32(MQPortNumber));
mqProps.Add(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_CLIENT);
qmgr = new MQQueueManager(MQQueueManagerName, mqProps);
return qmgr;
}
catch (MQException mqex)
{
//catch and log MQException here
return null;
}
}
任何建议我错过了什么?
【问题讨论】:
-
链中的某些东西正在序列化连接调用。在您自己的 connectToQueueManager 或 MQ API 中。无论如何你都不应该使用线程(查看任务和线程池)。
-
@Henk,我添加了自定义 connectToQueueManager 方法代码。除了通过使用 HashTable 来存储连接属性并使用与标准 MQ API 建立与 MQ 队列管理器的连接来创建与队列管理器的连接之外,它没有任何其他功能。另外,根据您的建议,我我会检查任务或线程池。一旦我找到解决我面临的问题的方法,我会更新。谢谢。
-
如果您的应用程序连接同一组队列管理器,那么为什么不只连接和打开一次队列!
-
@Shashi,我想通过与队列管理器建立多个连接并打开队列的多个读写器,以更快的速度从队列中读取消息。
标签: c# multithreading ibm-mq mq