加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 22:16:45 所属栏目:百科 来源:网络整理
导读:我正在尝试从websphere mq队列中读取消息并将其转储到另一个队列中. 下面是我必须要做的代码 private void transferMessages(){ MQQueueManager sqmgr = connectToQueueManager(S_SERVER_NAME,S_QMGR_NAME,S_PORT_NUMBER,S_CHANNEL_NAME); MQQueueManager dq
我正在尝试从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的共享对话(SHARECNV)功能,其中来自一个应用程序的队列管理器的多个连接共享同一个套接字.此值是在建立连接时在客户端和队列管理器之间协商的.默认情况下,将通过套接字共享10个连接.

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

UPDATE
为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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读