简体   繁体   中英

MessageListener only reads one message if connection not restarted

I´m having a trouble reading the second message on IBM MQ (c# + IBM.XMS + ibmcom/mq:latest). Using the default queue "DEV.QUEUE.1", it only keeps listening to messages if the connection is stopped and started again(conn.Stop()/conn.Start()) after the first message arrives. If the messages are already at the queue when the listener runs, all the messages are consumed currectly.

I´m using Docker, this is the MQ version information:(have tried multiple old versions)

bash-4.4$ dspmqver
Name:        IBM MQ
Version:     9.2.2.0
Level:       p922-L210310.DE
BuildType:   IKAP - (Production)
Platform:    IBM MQ for Linux (x86-64 platform)  
Mode:        64-bit
O/S:         Linux 4.19.128-microsoft-standard   
O/S Details: Red Hat Enterprise Linux 8.3 (Ootpa)
InstName:    Installation1
InstDesc:    IBM MQ V9.2.2.0 (Unzipped)
Primary:     N/A
InstPath:    /opt/mqm
DataPath:    /mnt/mqm/data
MaxCmdLevel: 922
LicenseType: Developer

the code used:

using IBM.XMS;
... 
        public IConnection conn;
        static void Main(string[] args)
        {
            Program app = new Program();
            app.Setup();
            Console.ReadLine();

        }

        public void Setup()
        {
            XMSFactoryFactory xff = XMSFactoryFactory.GetInstance(XMSC.CT_WMQ);
            IConnectionFactory cf = xff.CreateConnectionFactory();
            cf.SetStringProperty(XMSC.WMQ_HOST_NAME, "localhost");
            cf.SetIntProperty(XMSC.WMQ_PORT, 1414);// 9443);
            cf.SetStringProperty(XMSC.WMQ_CHANNEL, "DEV.ADMIN.SVRCONN");
            cf.SetIntProperty(XMSC.WMQ_CONNECTION_MODE, XMSC.WMQ_CM_CLIENT);
            cf.SetStringProperty(XMSC.WMQ_QUEUE_MANAGER, "QM1");
            cf.SetIntProperty(XMSC.WMQ_BROKER_VERSION, XMSC.WMQ_BROKER_V1);
            cf.SetStringProperty(XMSC.USERID, "admin");
            cf.SetStringProperty(XMSC.PASSWORD, "passw0rd"); 

            conn = cf.CreateConnection();
            Console.WriteLine("connection created");
            ISession sess = conn.CreateSession(false, AcknowledgeMode.AutoAcknowledge);
            IDestination dest = sess.CreateQueue("DEV.QUEUE.1");
            IMessageConsumer consumer = sess.CreateConsumer(dest);
            MessageListener ml = new MessageListener(OnMessage);
            consumer.MessageListener = ml;
            conn.Start();
            Console.WriteLine("Consumer started"); 
        }

        private void OnMessage(IMessage msg)
        {
            ITextMessage textMsg = (ITextMessage)msg;
            Console.WriteLine("Got a message: " + textMsg.Text); 
            conn.Stop();  // MUST BE CHANGED - for some reason, new messages are not being updated, so connection needs to be restarted
            conn.Start();
        }

Thank you

Here is how I do it. You need to ask for the next message & when you are finished delete it from the MQ.

 public string ConnectMQ(string strQueueManagerName, string strQueueName, string strChannelInfo)
    {

        //

        QueueManagerName = strQueueManagerName;

        QueueName = strQueueName;

        ChannelInfo = strChannelInfo;

        //

        char[] separator = { '/' };

        string[] ChannelParams;

        ChannelParams = ChannelInfo.Split(separator);

        channelName = ChannelParams[0];
    
        transportType = ChannelParams[1];

        connectionName = ChannelParams[2];
     //   connectionName = "";

        String strReturn = "";

        try
        {

            queueManager = new MQQueueManager(QueueManagerName,

            channelName, connectionName);

            

            strReturn = "Connected Successfully";

        }



 public String BrowseMsg(String position,MQQueue queue)
    {
        String strReturn = "";

        try
        {

        
            queueMessage = new MQMessage();

            queueMessage.Format = MQC.MQFMT_STRING;

            queueGetMessageOptions = new MQGetMessageOptions();
            if (position.Equals("First"))
            {
                queueGetMessageOptions.Options = IBM.WMQ.MQC.MQGMO_BROWSE_FIRST;
            }

            if (position.Equals("Next"))
            {
                queueGetMessageOptions.Options = IBM.WMQ.MQC.MQGMO_BROWSE_NEXT;
                
            }

            if (position.Equals("Remove"))
            {
                queueGetMessageOptions.Options = IBM.WMQ.MQC.MQGMO_MSG_UNDER_CURSOR;
            }

            queue.Get(queueMessage, queueGetMessageOptions);

            strReturn = queueMessage.ReadString(queueMessage.MessageLength);

            queueMessage.MessageId = MQC.MQMI_NONE;
            queueMessage.CorrelationId = MQC.MQCI_NONE;
            // Optional, remove data from the message
            queueMessage.ClearMessage();

           

        }





 public void init()
    {

        try
        {

         
         

            QueueManagerName = ConfigurationManager.AppSettings["QueueManagerName"].ToString();
            QueueName = ConfigurationManager.AppSettings["QueueName"].ToString();
            ChannelInfo = ConfigurationManager.AppSettings["ChannelInfo"].ToString();

            String strConnectionSuccess = String.Empty;
            strConnectionSuccess = "false";
            String strMQResponse = String.Empty;
            XmlDocument xmlMQRequestResponse = new XmlDocument();

            strConnectionSuccess = ConnectMQ(QueueManagerName, QueueName, ChannelInfo);

          
           

            if (!strConnectionSuccess.Equals("Connected Successfully"))
            {
                return;
            }

          
            int count = 0;
            queue = queueManager.AccessQueue(QueueName, MQC.MQOO_INPUT_AS_Q_DEF + MQC.MQOO_BROWSE + MQC.MQOO_FAIL_IF_QUIESCING);

            if (strMQResponse.Equals("MQRC_GET_INHIBITED") || strMQResponse.Equals("Exception : MQRC_GET_INHIBITED"))
            {
               
                log4net.LogManager.GetLogger("RollingFileAppender").Debug(strMQResponse);
            }

            while (!strMQResponse.Equals("Exception : MQRC_NO_MSG_AVAILABLE") && !strMQResponse.Equals("MQRC_GET_INHIBITED") && !strMQResponse.Equals("Exception : MQRC_GET_INHIBITED")) 
           
            {

              

                if (count == 0)
                {
                    strMQResponse = BrowseMsg("First", queue);

                }
                else
                {
                    strMQResponse = BrowseMsg("Next", queue);
                }

                if (strMQResponse.Equals("Exception : MQRC_NO_MSG_AVAILABLE"))
                {
                    continue;
                }

                Boolean boosuccess = new Boolean();
               // if success then do something with the data here


             

                if (boosuccess.Equals(true))
                {
                    BrowseMsg("Remove", queue);
                }

                count++;

            }
          

        }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM