
下面是我必须要做的代码
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); } }} 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)总结
以上是内存溢出为你收集整理的c# – 在for循环中启动多个线程无效全部内容,希望文章能够帮你解决c# – 在for循环中启动多个线程无效所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)