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 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) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |