gpt4 book ai didi

c# - 在 for 循环中启动多个线程无效

转载 作者:行者123 更新时间:2023-11-30 12:43:31 28 4
gpt4 key购买 nike

我正在尝试从 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;
}
}

任何建议我错过了什么?

最佳答案

这是因为 MQ 的 Shared Conversation (SHARECNV) 特性,其中从一个应用程序到队列管理器的多个连接共享同一个套接字。该值是在建立连接时在客户端和队列管理器之间协商的。默认情况下,一个套接字将共享 10 个连接。

您可以将应用程序中的线程数增加到 11,然后您可以看到打开了第二个连接。关于 SHARECNV 的更多详细信息是 here .

更新分别为 put 和 get 运行 6 个线程时的 channel 状态。注意我正在连接到同一个队列管理器(仅用于测试目的)。 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)

关于c# - 在 for 循环中启动多个线程无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31355988/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com