当我使用多线程连接到 IBM MQ QueueManager 时,它不会将所有请求连接到 MQ。很少有连接,也很少有失败。如果我使用线程数为 1,则所有请求都会连接。当我将线程数增加到 2 或 3 时,很少会成功,也很少会失败。
失败,
2009 MQRC_CONNECTION_BROKEN
我在 C# 中使用以下代码。
public void InwardAMLRequestSendProcess()
{
try
{
string Error = string.Empty;
string ErrorCode = string.Empty;
DAL_InwardAMLProcess objDAL_AMLDetails = new DAL_InwardAMLProcess();
List<AMLRequestDetails> lstAMLRequestDetails = new List<AMLRequestDetails>();
lstAMLRequestDetails = objDAL_AMLDetails.GetInwardPendingAMLRequestDetailsiCustomer(ref ErrorCode, ref Error);
if (lstAMLRequestDetails.Count > 0)
{
string ThreadCount = "";
Common.GetParamvalue("InwardAMLMultiThreadingCountCust", ref ThreadCount);
int iThreadCount = 0;
try
{
iThreadCount = Convert.ToInt32(ThreadCount);
}
catch { iThreadCount = 3; }
ProcessQueue<AMLRequestDetails> queue = new ProcessQueue<AMLRequestDetails>(lstAMLRequestDetails, ProcessInwardAMLRequestSendProcess, iThreadCount);
queue.Start();
queue.Dispose();
}
}
catch (Exception ex)
{
Common.WriteFTSLog("Exception occured during Inward AML Posting Process: " + ex.Message.ToString() + ex.StackTrace);
Common.handleErrorLogInService(ex);
}
}
public string PutMessageOnQueue_Inward(string message, string strMessageID)
{
string writeQueueName = Common.WRITE_MESSAGE_QUEUENAME_INWARD;
try
{
Hashtable properties = new Hashtable();
properties.Add(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_MANAGED);
properties.Add(MQC.HOST_NAME_PROPERTY, Common.FTS_MQ_HostName);
properties.Add(MQC.CHANNEL_PROPERTY, Common.QUEUE_CHANNEL);
properties.Add(MQC.PORT_PROPERTY, Common.FTS_MQ_Port);
properties.Add(MQC.USER_ID_PROPERTY, Common.FTS_MQ_UserId);
properties.Add(MQC.PASSWORD_PROPERTY, Common.FTS_MQ_Password);
properties.Add(MQC.USE_MQCSP_AUTHENTICATION_PROPERTY, true);
using (var objMQQueueManager = new MQQueueManager(Common.QUEUEMANAGER_NAME, properties))
{
using (var objMQQueue = objMQQueueManager.AccessQueue(writeQueueName, MQC.MQOO_OUTPUT + MQC.MQOO_FAIL_IF_QUIESCING))
{
var objPutMQMessage = new MQMessage
{
//UTF-8 character encoding
CharacterSet = 1208,
Format = MQC.MQFMT_STRING,
MessageType = MQC.MQMT_DATAGRAM,
Report = MQC.MQRO_NONE,
};
objPutMQMessage.WriteString(message);
objMQQueue.Put(objPutMQMessage);
objMQQueueManager.Commit();
objMQQueue.Close();
objMQQueueManager.Disconnect();
}
}
}
catch (MQException mqEx)
{
message = null;
}
catch (Exception ex)
{
message = null;
}
return message;
}
哪段代码调用方法 PutMessageOnQueue_Inward?因为我看不到。
您不能跨线程共享 MQ 连接和/或队列句柄。每个线程必须有自己到队列管理器的连接。
由于您没有将 MQPMO 'options' 参数设置为 MQPMO_SYNCPOINT,那么这行代码毫无意义:
objMQQueueManager.Commit();
你需要更好地处理异常情况。您的代码中有 6 个 MQ API 调用,哪个 MQ API 调用引发了 MQ 异常?
此外,您应该在finally 语句中执行close 和disconnect 方法调用。