【发布时间】:2018-04-09 07:29:56
【问题描述】:
我们正在使用 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);
}
}
}
}
【问题讨论】:
-
我已安装完整的 MQ v9 客户端
-
队列浏览器和队列消费者设置在同一个队列上。因此,队列消费者甚至在队列浏览器有机会之前就删除了消息。一旦我停止了队列消费者,队列浏览器就能够接收消息。但是现在我的问题是如何确保队列浏览器和队列消费者协同工作?
-
Thaks JoshMC。作为业务案例的一部分,我们让消费者运行以读取消息,并希望设置浏览器以便我们只获取消息的副本,以便我们可以在单独的应用程序中跟踪它以记录收到的所有消息。
-
我编辑了问题,包括说除了消息浏览器之外还有并发消息消费者