C#.Net IBM MQ 多线程应用程序连接问题

问题描述 投票:0回答:1

当我使用多线程连接到 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;
        }
c# .net websphere ibm-mq
1个回答
0
投票

哪段代码调用方法 PutMessageOnQueue_Inward?因为我看不到。

您不能跨线程共享 MQ 连接和/或队列句柄。每个线程必须有自己到队列管理器的连接。

由于您没有将 MQPMO 'options' 参数设置为 MQPMO_SYNCPOINT,那么这行代码毫无意义:

objMQQueueManager.Commit();

你需要更好地处理异常情况。您的代码中有 6 个 MQ API 调用,哪个 MQ API 调用引发了 MQ 异常?

此外,您应该在finally 语句中执行close 和disconnect 方法调用。

© www.soinside.com 2019 - 2024. All rights reserved.