WebSphere MQ将消息放在主题上

时间:2015-04-30 07:38:04

标签: c# .net ibm-mq mq

我创建了一个小应用程序来订阅来自明确主题的消息。在我的测试环境中,我只有试用版WebSphere MQ,而且我不知道如何将消息发送到我明确的主题。我可以将消息放入队列并获取它,但是当我想从明确的主题获取消息时,得到一条空消息。

更新
将问题更新从OP的另一个答案移到问题中。

我使用示例代码C:\Program Files\IBM\WebSphere MQ\Tools\dotnet\samples\cs\base\SimpleSubscribe

// mq properties
            properties = new Hashtable();
            properties.Add(MQC.HOST_NAME_PROPERTY, hostName);
            properties.Add(MQC.PORT_PROPERTY, port);
            properties.Add(MQC.CHANNEL_PROPERTY, channelName);
            #region pass
            properties.Add(MQC.USER_ID_PROPERTY, "LOGIN");
            properties.Add(MQC.PASSWORD_PROPERTY, "PASSWORD");
            #endregion
            properties.Add(MQC.MQCA_TOPIC_NAME, "News.Topic");

            if (sslKeyRepository != null)
            {
                properties.Add(MQC.SSL_CERT_STORE_PROPERTY, sslKeyRepository);
            }
            if (cipherSpec != null)
            {
                properties.Add(MQC.SSL_CIPHER_SPEC_PROPERTY, cipherSpec);
            }
            if (sslPeerName != null)
            {
                properties.Add(MQC.SSL_PEER_NAME_PROPERTY, sslPeerName);
            }
            if (keyResetCount != 0)
            {
                properties.Add(MQC.SSL_RESET_COUNT_PROPERTY, keyResetCount);
            }
            if (sslCertRevocationCheck != false)
            {
                MQEnvironment.SSLCertRevocationCheck = sslCertRevocationCheck;
            }

            if (transportMode == "managed")
                properties.Add(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_MANAGED);
            else if (transportMode == "unmanaged")
                properties.Add(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_CLIENT);

            // create connection
            Console.Write("Connecting to queue manager.. ");
            queueManager = new MQQueueManager(queueManagerName, properties);
            Console.WriteLine("done");

            // accessing topic
            Console.Write("Accessing topic " + topicName + ".. ");
            if (durability == "nondurable")
                topic = queueManager.AccessTopic(topicName, null, MQC.MQTOPIC_OPEN_AS_SUBSCRIPTION, MQC.MQSO_CREATE | MQC.MQSO_FAIL_IF_QUIESCING);
            else if (durability == "durable")
                topic = queueManager.AccessTopic(topicName, null, MQC.MQSO_CREATE | MQC.MQSO_FAIL_IF_QUIESCING | MQC.MQSO_DURABLE | MQC.MQSO_RESUME, null, "DurableSubscriptionName");
            Console.WriteLine("done");

            // creating a message object
            message = new MQMessage();
            message.WriteString(messageString);

            int time = 1;
            // getting messages continuously
            for (int i = 1; i <= numberOfMsgs; i++)
            {
                // creating a message object
                message = new MQMessage();

                try
                {
                    topic.Get(message);
                    Console.WriteLine("Message " + i + " got = " + message.ReadString(message.MessageLength));
                    message.ClearMessage();
                }
                catch (MQException mqe)
                {
                    if (mqe.ReasonCode == 2033)
                    {
                        ++time;
                        --i;
                        Console.WriteLine("No message available");
                        Thread.Sleep(1000);
                        //waiting for 10sec 
                        if (time > 10)
                        {
                            Console.WriteLine("Timeout : No message available");
                            break;
                        }
                        continue;
                    }
                    else
                    {
                        Console.WriteLine("MQException caught: {0} - {1}", mqe.ReasonCode, mqe.Message);
                    }
                }
            }

            // closing topic
            Console.Write("Closing topic.. ");
            topic.Close();
            Console.WriteLine("done");

            // disconnecting queue manager
            Console.Write("Disconnecting queue manager.. ");
            queueManager.Disconnect();
            Console.WriteLine("done");

2 个答案:

答案 0 :(得分:2)

发布/订阅方法与放置和从队列中获取不同。为了接收已发布到主题的消息,接收应用程序必须订阅该主题。

如果您先创建订阅,然后从中接收消息,那么当您使用该主题时,您的接收应用程序将获得该消息的副本。

我会重申Shashi的请求,发布您目前为止的代码,以便我们进一步提供帮助。

答案 1 :(得分:1)

虽然我没有看到代码的问题,除了下面的内容。这条线既不会帮助也不会伤害您的应用。该常量实际上用于MQ管理目的。你可以脱掉它。

 properties.Add(MQC.MQCA_TOPIC_NAME, "News.Topic");

使用以下方法创建订阅时,是否有关于指定主题的应用程序发布?

topic = queueManager.AccessTopic(topicName,...

如果没有人发布该主题,您的应用程序将不会收到任何出版物。您的应用程序应该抛出MQRC 2033 - MQRC_NO_MESSAGE_AVAILABLE异常而不返回空消息。你没有打那个例外吗?收到此异常后,应用程序将在控制台上打印“无消息可用”。你没有看到吗?