C# 在for循环中启动多个线程无效
我试图从WebSphereMQ队列中读取消息并将其转储到另一个队列中 下面是我要做的代码C# 在for循环中启动多个线程无效,c#,multithreading,ibm-mq,mq,C#,Multithreading,Ibm Mq,Mq,我试图从WebSphereMQ队列中读取消息并将其转储到另一个队列中 下面是我要做的代码 private void transferMessages() { MQQueueManager sqmgr = connectToQueueManager(S_SERVER_NAME, S_QMGR_NAME, S_PORT_NUMBER, S_CHANNEL_NAME); MQQueueManager dqmgr = connectToQueueManager(D_SERVER_NAME
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();
}
有什么建议我遗漏了什么吗?这是因为MQ的
共享对话(SHARECNV)
功能,其中来自一个应用程序的多个到队列管理器的连接共享同一套接字。此值是客户端和队列管理器在建立连接时协商的值。默认情况下,通过套接字共享10个连接
您可以将应用程序中的线程数增加到11,然后可以看到第二个连接正在打开。有关SHARECNV的更多详细信息,请参阅
更新
为put和get分别运行6个线程时的通道状态。注意:我正在连接到同一队列管理器(仅用于测试)。SHARECNV设置为10
2 : dis chstatus(MY.SVRCONN)
AMQ8417: Display Channel Status details.
CHANNEL(MY.SVRCONN) CHLTYPE(SVRCONN)
CONNAME(127.0.0.1) CURRENT
STATUS(RUNNING) SUBSTATE(RECEIVE)
AMQ8417: Display Channel Status details.
CHANNEL(MY.SVRCONN) CHLTYPE(SVRCONN)
CONNAME(127.0.0.1) CURRENT
STATUS(RUNNING) SUBSTATE(RECEIVE)
每次运行5个线程时
3 : dis chstatus(MY.SVRCONN)
AMQ8417: Display Channel Status details.
CHANNEL(MY.SVRCONN) CHLTYPE(SVRCONN)
CONNAME(127.0.0.1) CURRENT
STATUS(RUNNING) SUBSTATE(RECEIVE)
链中的某些内容正在序列化connect调用。在您自己的connectToQueueManager或MQ API中。无论如何,你不应该使用线程(看看任务和线程池)。@Henk,我已经添加了自定义connectToQueueManager方法代码。它除了创建到队列管理器的连接之外,没有什么别的功能,方法是使用哈希表存储连接属性,并使用标准MQ API创建到MQ队列管理器的连接。。此外,根据您的建议,我将检查任务或线程池。。我将在找到解决我所面临问题的方法后进行更新。谢谢。如果您的应用程序连接同一组队列管理器,那么为什么不只连接和打开队列一次呢@Shashi,我想通过与队列管理器建立多个连接并打开队列的多个读写器,以更快的速度从队列中读取消息。在这里发布我的问题之前,我尝试将其更改为0和其他不同的值。运气不好。运行了测试程序并将结果作为更新发布。能否在启动程序之前和之后发布队列管理器连接?(DIS QMSTATUS CONNS)以及队列IPPROC和OPPROC?您是说上面的代码有效,我必须对MQ配置/队列管理器配置进行一些更改吗?PS:我运行了另一个程序,该程序成功地与队列管理器建立了多个连接。当我现在运行它时,它失败了。正在尝试使用其他队列管理器进行测试。谢谢。修改了您的代码以建立连接,删除了打开队列的代码。所以没有IPPROC/OPPROC的详细信息。启动程序之前和之后的连接数分别为22和32。请记住使用DISPLAY CONN命令,该命令将显示到队列管理器的连接数,即使它们通过一个通道共享(因此DISPLAY CHSTATUS将仅显示一个连接)。这将帮助您确定是否正在进行多个连接。
3 : dis chstatus(MY.SVRCONN)
AMQ8417: Display Channel Status details.
CHANNEL(MY.SVRCONN) CHLTYPE(SVRCONN)
CONNAME(127.0.0.1) CURRENT
STATUS(RUNNING) SUBSTATE(RECEIVE)