- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 C#/.Net 应用程序中实现 MQ 发布/订阅。
我已按照本教程中的说明进行操作:
https://tekslate.com/publish-subscribe-in-websphere-mq-series/
我成功地在 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。
最佳答案
MQ 管理订阅
您引用的教程设置了 MQ 管理订阅来将主题字符串订阅到特定的 MQ 队列,这样,发布到与订阅的主题字符串匹配的主题的任何消息都将被放入您在 MQ 上指定的队列管理订阅例如SportsQ
,要从队列中读取消息,您可以将其视为队列而不是主题,并使用 AccessQueue
访问它。方法举例:
string queueName = "SportsQ";
int openOptionsForGet = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_FAIL_IF_QUIESCING;
MQQueue destForGet = mqQueueManager.AccessQueue(queueName, openOptionsForGet, null, null, null);
<小时/>
托管持久订阅
您在提供的代码中演示的内容称为托管持久订阅,在后台 MQ 将创建一个前缀为 SYSTEM.MANAGED.DURABLE.<uniq 16 character HEX value>
的队列。并将其订阅到主题字符串。如果您断开连接,然后使用相同的“订阅名称”恢复,那么您将连接到同一个托管队列,并接收在未连接时发布的任何消息。
请注意,除了所谓的“保留发布”(其中 MQ 将为 future 订阅者保存最新发布)之外,您在订阅之前不会收到发布到主题字符串的任何消息,这就是为什么您看不到您想要的消息的原因。在创建托管持久订阅之前通过 MQ Explorer 发布。
根据您提供的内容,您应该能够向主题字符串发布新消息,您的应用程序就会收到它。
<小时/>非托管持久订阅
另一个选项是删除您创建的 MQ 管理订阅并更改您的程序以在您提供队列目标的情况下进行非托管订阅,例如:
string queueName = "SportsQ";
int QueueOpenOptionsForGet = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_FAIL_IF_QUIESCING;
int TopicOpenOptionsForGet = MQC.MQSO_CREATE | MQC.MQSO_FAIL_IF_QUIESCING | MQC.MQSO_DURABLE | MQC.MQSO_RESUME;
MQQueue destQueue = mqQueueManager.AccessQueue(queueName, QueueOpenOptionsForGet);
MQTopic destForGet = mqQueueManager.AccessTopic(destQueue, topicString, null, openOptionsForGet, null, subscriptionName);
这会导致创建一个 API 订阅,将主题字符串链接到您提供作为目标的队列。
就像 MQ 管理订阅一样,您可以将其视为要从中获取的队列,或者您可以恢复订阅。
<小时/>恢复非托管持久订阅而无需知道队列名称
您仍然需要调用以目标作为第一个参数的 AccessTopic 重载,但您传入 NULL 而不是 MQDestination,程序将恢复已创建的非托管订阅,而无需知道队列名称。我能够编译并测试以下内容是否有效:
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 topicString = "NEWS/SPORTS/CRICKET";
string subscriptionName = "NEWS.SPORTS.CRICKET";
int openOptionsForGet = MQC.MQSO_FAIL_IF_QUIESCING | MQC.MQSO_DURABLE | MQC.MQSO_RESUME;
MQTopic destForGet = mqQueueManager.AccessTopic(null, 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 = 60000; // wait 60 seconds
destForGet.Get(messageForGet, gmo);
string msg = messageForGet.ReadLine();
System.Console.WriteLine("Received message data : " + msg);
destForGet.Close();
mqQueueManager.Disconnect();
mqQueueManager.Close();
}
}
}
另请注意,您甚至不需要 topicString,它也可以为 null,subscriptionName 就是恢复它所需的全部内容:
MQTopic destForGet = mqQueueManager.AccessTopic(null, null, null, openOptionsForGet, null, subscriptionName);
<小时/>
其他一些注意事项,教程中的示例提供了混合大小写的队列名称,不建议这样做,因为在许多地方,如果您不小心,IBM MQ 会将内容折叠为大写。推荐的最佳实践是对 IBM MQ 对象名称(队列等)使用大写。
WaitInterval 以毫秒为单位,因此将其设置为 1000 将等待 1 秒而不是 60 秒。
关于c# - WebSphere MQ/C# 订阅 : topic GET hangs forever,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47043778/
根据槌documentation ,可以逐步训练主题模型: "-output-model [FILENAME] This option specifies a file to write a seri
下面我创建了一个完整的可重现示例来计算给定 DataFrame 的主题模型。 import numpy as np import pandas as pd data = pd.DataFrame({
在启动 Kafka 时出现以下错误。 KeeperErrorCode = NoNode for /brokers/topics/test-topic/partitions 任何帮助将不胜感激。 最佳答
我是这个范例的新手,所以请容忍我的愚蠢。我开始阅读这个主题是因为我正在构建一个物联网系统,该系统将使用消息队列来允许设备相互通信。 我目前正在使用 Azure 的服务总线,但是我相信我的问题通常适用于
我有三个 Kafka 经纪人( kafka_2.11-0.10.0.0 )每个经纪人的安全配置如下, listeners=PLAINTEXT://xxxx:9093,SASL_PLAINTEXT://
我使用apache-rocketmq发送消息,但出现异常。我尝试了csdn上的很多解决方案,但不起作用。现在我不知道如何处理它。 这是一个 Linux 服务器,运行 Rocketmq 4.2.0、ja
我收集了一些文档,其中大部分都是关于同一主题的,其余的基本上都是随机主题。我希望将文档分类为它们是关于“多数主题”还是这些随机“少数主题”之一。如果我在这个只有 2 个主题的语料库上使用主题建模算法会
我正在使用 gensim 包中的 LDA 算法来查找给定文本中的主题。 我被问到生成的主题将包含每个主题的不同词,例如,如果主题 A 中包含“猴子”一词,那么其他主题的列表中不应包含“猴子”一词。 到
我想使用 htaccess 更改我网站的 URL URL currently: example.com/index.php?p=my-topic-title I want to be like : e
我正在学习 Spring Boot 并制作了一个演示,但是当我发布一个添加对象的请求时,它不起作用! 错误信息是: { "timestamp": 1516897619316, "sta
背景 我们公司有由 Zookeeper 管理的 Apache Kafka。我们的 Spring Boot 应用程序之一需要检查所有可用主题的列表,并列出哪些主题启用了日志压缩 (cleanup.pol
在我的工作场所,我偶然发现了以下需要我解决的问题。尽管不是绝对需要,但首选解决方案。 有一个包含一组故事的数据库,每个故事都有一组与之关联的主题。主题存储在单独的表中,格式为 (storyid, to
我有一个由主题名称、描述组成的 Pandas 数据框 我正在尝试将其转换为主题名称、单词(出现在描述列中)及其频率 我已经试过了,但它只给了我描述的单词和频率,而不是主题名称级别。 import nl
我尝试使用以下命令删除现有主题(我使用 kafka 管理控制台检查过); #./kafka-topics.sh --zookeeper zookeeper.xx.com:2181/chroot --d
试图在一台机器上运行 Kafka 生产者,在另一台机器上运行消费者。 设置以下属性: 广告.host.name 广告端口 但是在控制台消费者上收到以下错误: bin/kafka-console-con
我正在使用 Gmail API,并尝试使用 Python 3.9 设置推送通知。当我尝试在 Gmail 收件箱上调用 watch() 时,出现错误,即使我已遵循针对类似问题给出的所有建议。错误如下:
我希望构建一个主题 map 来对内容进行分类。 例如,主题“艺术”可能有“艺术史”、“绘画”、“雕塑”等子类别。 我已经抓取了一些在线资源,但遇到了一个与我希望如何使用层次结构有关的问题。 我有很多内
我想在我的 Java 中编译 mallet(而不是使用命令行),所以我将 jar 包含在我的项目中,并引用了来自以下示例的代码:http://mallet.cs.umass.edu/topics-de
我正在尝试根据父级中的记录内容从kafka中的一个主题(父级)写入另一个主题(子级)。如果我从父主题消费,则示例记录为 {"date":{"string":"2017-03-20"},"time":{
我有一个 Kafka 生产者类,运行良好。生产者填充了 Kafka 主题。其代码如下: public class kafka_test { private final static String TO
我是一名优秀的程序员,十分优秀!