gpt4 book ai didi

c# - queueBrowser.GetEnumerator() 没有收到任何消息 | IBM MQ XMS C# 客户端

转载 作者:行者123 更新时间:2023-11-30 15:56:20 26 4
gpt4 key购买 nike

我们使用 IBM MQ XMS C# 客户端版本 9.0(在 .NET 4.6.2 框架上)与 IBM MQ 一起工作。我只需要知道给定队列中的所有消息,而无需将它们从队列中移除。

我们还为队列设置了消费者。需要消费者和浏览器协同工作。浏览器不应删除消息,但仍需要获取所有消息。


所以我设置了如下所示的 QueueBrowser,但是 queueBrowser.GetEnumerator() 根本没有收到消息。

使用相同的代码,如果创建一个 MessageConsumer 并附加一个监听器,它将获取发布到队列中的消息。因此,仅使用 QueueBrowser 问题。

谁能指出为什么会这样。为什么 queueEnumerator.MoveNext() 总是返回 false,表示队列中没有消息。

       XMSFactoryFactory  xMSFactoryFactory = XMSFactoryFactory.GetInstance(XMSC.CT_WMQ);

// Create WMQ Connection Factory.
IConnectionFactory connectionFactory = xMSFactoryFactory.CreateConnectionFactory();

connectionFactory.SetStringProperty(XMSC.WMQ_HOST_NAME, "hostname");
connectionFactory.SetIntProperty(XMSC.WMQ_PORT, portNumber);
connectionFactory.SetStringProperty(XMSC.WMQ_CHANNEL, "channelName");
connectionFactory.SetIntProperty(XMSC.WMQ_CONNECTION_MODE, XMSC.WMQ_CM_CLIENT);
connectionFactory.SetStringProperty(XMSC.WMQ_QUEUE_MANAGER, "QueueManagerName");

// Create connection.
connectionWMQ = connectionFactory.CreateConnection();
connectionWMQ.ExceptionListener = new ExceptionListener(OnXMSException);

// Create session
ISession sessionWMQ = connectionWMQ.CreateSession(false, AcknowledgeMode.AutoAcknowledge);

IDestination destination = sessionWMQ.CreateQueue("QueueName");


IQueueBrowser queueBrowser = sessionWMQ.CreateBrowser(destination);

connectionWMQ.Start();

Thread thread = new Thread(KeepBrowsingMessaegs);
thread.Start();

--end of the method

private void KeepBrowsingMessaegs()
{
IEnumerator queueEnumerator = queueBrowser.GetEnumerator();
while (!cancellationTokenSource.IsCancellationRequested)
{

if (queueEnumerator.MoveNext())
{
ITextMessage textMessage = queueEnumerator.Current as ITextMessage;
if (textMessage != null)
{
System.Diagnostics.Trace.Write(textMessage);
}
}
}
}

最佳答案

OP 在评论中提到了以下内容:作为业务案例的一部分,我们有消费者正在运行以阅读消息,并希望设置浏览器以便我们只获取消息的副本,以便我们可以跟踪它单独的应用程序记录所有收到的消息。

我在下面提供了一些选项。


选项 1

不要仅仅为了记录收到的消息而使用单独的应用程序,而是让您的“业务案例”应用程序将消息记录为处理的一部分。


选项 2

设置两个队列,第一个将接收入站消息并由记录消息的应用程序使用,然后将其副本放入第二个队列,该队列将由您的“业务案例”应用程序使用。


选项 3

使用 IBM MQ 发布/订阅功能创建消息的两个副本,其中一个将由记录消息的应用程序使用,另一个将由您的“业务案例”应用程序使用。请注意,这只会复制消息正文,不会复制 MQ 消息描述符 (MQMD),它是有关消息的元数据(例如放置时间、放置日期、消息 ID、用户 ID)。许多应用程序不查看 MQMD,因此这对您来说可能不是问题。

设置看起来像这样:

为入站消息创建一个QALIAS,这个别名将通过指定目标是一个主题对象来指向一个主题字符串:

DEFINE QALIAS(INBOUND.QUEUE) TARGET(INBOUND.TOPIC) TARGTYPE(TOPIC)

定义TOPIC对象:

DEFINE TOPIC(INBOUND.TOPIC) TOPICSTR(INBOUND/TOPIC)

创建两个 QLOCAL 对象,一个由记录消息的应用程序使用,另一个由您的“业务案例”应用程序使用:

DEFINE QLOCAL(INBOUND.QUEUE.LOGGER)
DEFINE QLOCAL(INBOUND.QUEUE.PROCESSOR)

定义两个管理SUBSCRIPTION 对象以将两个队列订阅到主题主题字符串:

DEFINE SUB(INBOUND.QUEUE.LOGGER.SUB) TOPICSTR(INBOUND/TOPIC) DEST(INBOUND.QUEUE.LOGGER)
DEFINE SUB(INBOUND.QUEUE.PROCESSOR.SUB) TOPICSTR(INBOUND/TOPIC) DEST(INBOUND.QUEUE.PROCESSOR)

上述设置的结果是,放入名为 INBOUND.QUEUE 的队列的每条消息都会有一个副本发布到两个队列 INBOUND.QUEUE.LOGGERINBOUND.QUEUE.PROCESSOR


选项 4

您可以设置三个 QLOCAL 对象,一个是入站消息的队列,您可以让一个程序从这个队列中读取消息,然后将消息的副本写入其他两个队列。 Capitalware 维护了一个名为 Message Multiplexer (MMX) 的开源工具它可以从源队列读取并写入一个或多个队列,这确实复制了 MQMD 和消息正文。

设置看起来像这样:

创建三个 QLOCAL 对象,第一个将被一个应用程序使用,它将复制到第二个将被记录消息的应用程序使用,第三个将被您的应用程序使用“业务案例”应用:

DEFINE QLOCAL(INBOUND.QUEUE)
DEFINE QLOCAL(INBOUND.QUEUE.LOGGER)
DEFINE QLOCAL(INBOUND.QUEUE.PROCESSOR)

选项 5

有一个名为 MQ Message Replication (MQMR) 的商业产品它可以使用 MQ API 导出将发送到“业务案例”应用程序队列的消息准确复制到一个或多个其他队列。我个人没有使用过它,但设置将只有两个 QLOCAL 队列,第一个将由您的“业务案例”应用程序使用,第二个将由记录消息的应用程序使用。

DEFINE QLOCAL(INBOUND.QUEUE)
DEFINE QLOCAL(INBOUND.QUEUE.LOGGER)

关于c# - queueBrowser.GetEnumerator() 没有收到任何消息 | IBM MQ XMS C# 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46979331/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com