我创建了一个小应用程序来订阅来自明确主题的消息。在我的测试环境中,我只有试用版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");
答案 0 :(得分:2)
发布/订阅方法与放置和从队列中获取不同。为了接收已发布到主题的消息,接收应用程序必须订阅该主题。
如果您先创建订阅,然后从中接收消息,那么当您使用该主题时,您的接收应用程序将获得该消息的副本。
我会重申Shashi的请求,发布您目前为止的代码,以便我们进一步提供帮助。
答案 1 :(得分:1)
虽然我没有看到代码的问题,除了下面的内容。这条线既不会帮助也不会伤害您的应用。该常量实际上用于MQ管理目的。你可以脱掉它。
properties.Add(MQC.MQCA_TOPIC_NAME, "News.Topic");
使用以下方法创建订阅时,是否有关于指定主题的应用程序发布?
topic = queueManager.AccessTopic(topicName,...
如果没有人发布该主题,您的应用程序将不会收到任何出版物。您的应用程序应该抛出MQRC 2033 - MQRC_NO_MESSAGE_AVAILABLE
异常而不返回空消息。你没有打那个例外吗?收到此异常后,应用程序将在控制台上打印“无消息可用”。你没有看到吗?