【发布时间】:2017-10-31 20:11:25
【问题描述】:
我正在尝试在 C#/.Net 应用程序中实现 MQ 发布/订阅。
-
我已按照本教程中的说明进行操作:
https://tekslate.com/publish-subscribe-in-websphere-mq-series/
- a) 队列管理器:QM
- b) TCP 监听器正在运行,端口:1420
- c) 主题名称:NEWS.SPORTS.CRICKET
- d) 订阅名称也为:NEWS.SPORTS.CRICKET
- e) 主题字符串:NEW/SPORTS/CRICKET
- f) 目的地队列:SportsQ
我成功地能够在 MQ Explorer 中进行“测试发布”。 我在订阅中看到“消息计数 = 1”。 我在 SportsQ 中看到“队列深度 = 1”
我能够连接到 QM,我能够访问主题...但是当我执行“topic.Get(message”) 时它只是挂起
问:为什么 MQ "Get()" 挂了??????
代码:
using IBM.WMQ;
using System;
using System.Collections;
namespace HelloSubscribe
{
class Program
{
static void Main(string[] args)
{
string qmName = "QM";
string hostName = "localhost";
string strPort = "1420";
string channelName = "SYSTEM.DEF.SVRCONN";
string transport = MQC.TRANSPORT_MQSERIES_CLIENT;
Hashtable connectionProperties = new Hashtable();
connectionProperties.Add(MQC.HOST_NAME_PROPERTY, hostName);
connectionProperties.Add(MQC.PORT_PROPERTY, strPort);
connectionProperties.Add(MQC.CHANNEL_PROPERTY, channelName);
MQQueueManager mqQueueManager = new MQQueueManager(qmName, connectionProperties);
string topicObject = null;
string topicString = "NEWS/SPORTS/CRICKET";
string subscriptionName = "NEWS.SPORTS.CRICKET";
string topicName = "NEWS.SPORTS.CRICKET";
int openOptionsForGet = MQC.MQSO_CREATE | MQC.MQSO_FAIL_IF_QUIESCING | MQC.MQSO_DURABLE | MQC.MQSO_RESUME;
MQTopic destForGet = mqQueueManager.AccessTopic(topicString, null, openOptionsForGet, null, subscriptionName);
MQMessage messageForGet = new MQMessage();
MQGetMessageOptions gmo = new MQGetMessageOptions();
gmo.Options |= MQC.MQGMO_WAIT | MQC.MQGMO_FAIL_IF_QUIESCING;
gmo.WaitInterval = 1000; // wait 60 seconds
destForGet.Get(messageForGet, gmo);
string msg = messageForGet.ReadLine();
destForGet.Close();
mqQueueManager.Disconnect();
mqQueueManager.Close();
}
}
}
我正在运行 WebSphere MQ 7.5,使用已安装的 amqdnet.dll 版本和 Visual Studio 2015。
【问题讨论】:
-
您使用什么标准来确定消息的结尾?您有一个 readline,所以您是否在发送的消息末尾添加了一个返回? readline 方法将阻塞,直到收到返回。
-
我刚刚在 MQ 资源管理器中进行了“测试发布”并输入了一些文本。根据我阅读和编写点对点消息的经验,ReadLine() 应该是合适的。问题是我从来没有走到那一步——它挂在“Get()”中。
-
是的,是的,是的!!!! Get 也将阻塞,直到消息结束。您没有发布 Get 方法,所以我不知道 Get 如何确定结束。
-
尝试一些更简单的方法来确保所有库都正确安装。在以下网页上尝试代码:c-sharpcorner.com/article/….
-
看起来我在 2015 年帮助过有类似问题的人:social.msdn.microsoft.com/Forums/windowsdesktop/en-US/…