我試圖從websphere mq隊列讀取消息並將其轉儲到另一個隊列中。在for循環中啓動多個線程不起作用
下面是代碼我必須這樣做
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;
}
}
任何建議我失去了什麼?
鏈中的某些內容正在序列化連接調用。無論是在你自己的connectToQueueManager還是在MQ API中。反正你不應該使用線程(看看任務和線程池)。 –
@亨克,我已經添加了自定義的connectToQueueManager方法代碼。除了通過HashTable存儲連接屬性來創建與隊列管理器的連接,並且使用標準MQ API與MQ隊列管理器建立連接之外,它沒有什麼比這更簡單。另外,根據您的建議,我將檢查任務或ThreadPools ..我會更新,一旦我找到我面臨的問題的修復。謝謝。 –
如果您的應用程序連接了同一組隊列管理器,那麼爲什麼不連接並僅打開一次隊列! – Shashi