IBM.XMS IMessageConsumer - 不会发布 - 无法取消订阅

时间:2014-12-22 19:14:56

标签: c# ibm-mq publish-subscribe xms

第一:问题 我无法在针对ibm的mq主题的异步持久订阅者上成功执行这些步骤。

IMessageConsumer.MessageListener = null;
IMessageConsumer.Close();
IMessageConsumer.Dispose();
ISession.Unsubscribe(topicPath);

我得到IBM.WMQ.MQException {“2428”} “无法使用MQCLOSE取消订阅主题X. 删除订阅可能存在问题,因为消息使用者正在使用它。 在取消订阅之前,请确保使用此订阅的任何消息使用者都已关闭。有关详细信息,请参阅链接的例外。“

第二:细节 所以我正在使用IBM的MQ基础架构。特别是他们的分布式发布者/订阅者实现的主题实现。我将整个事情包装在.NET WEB API(MVC5)项目中,以从组织的其余部分抽象出所有MQ细节。 暂时忽略所有故障转移等等。当客户端打电话给我时,首先看看我们是否有调用者的ISession。如果我们使用现有的,如果不是我从共享连接工厂创建新的。然后我为消费者创建了一个新目的地。接下来,我为特定主题路径创建持久订阅。然后我添加一个MessageListener并将整个混乱添加到内存缓存中。其他跟踪也发生但对此讨论并不重要。

using IBM.XMS;

// Subscribe
MQConnectionFactory f = (MQConnectionFactory)fact;
SessionClass newSession = new SessionClass(); // Contains an ISession, IDestination, IMessageConsumer

newSession.Session = f.CreateSession();
newSession.Destination = newSession.Session.CreateTopic(MQConnectionFactory.FormatTopic(path));
newSession.Consumer = newSession.Session.CreateDurableSubscriber(newSession.Destination, subId.ToString());
newSession.Consumer.MessageListener = new MessageListener(MessageHandler);


// Message Handler - Some "details" removed
private void MessageHandler(IMessage msg)
{
    string topic = msg.GetStringProperty(MQConstants.TOPIC);
    DateTime timestamp = DateTime.FromBinary(msg.GetLongProperty(MQConstants.DATETIME));
    List<KeyValuePair<string, object>> parms = msg.GetStringProperty(MQConstants.PARAMETERS).FromBase64();
    object payload = msg.GetObjectProperty(MQConstants.PAYLOAD);

    Publication publication = new Publication()
    {
        MessageTimestamp = timestamp,
        Topic = topic,
        Parameters = parms
    };

    Callback.Notify(publication))
    _log.DebugFormat("Message delivered to {0}", msg.JMSMessageID);
    msg.Acknowledge();
}

// And for unsubscribe
SessionClass s = _destinations[fullPath];
s.Consumer.MessageListener = null;
s.Consumer.Close();
s.Consumer.Dispose();
s.Session.Unsubscribe(s.Destination.Name);
_destinations.Remove(fullPath);

因此所有订阅和消息处理都可以正常工作。当我点击

时,UnSubscribe总是失败
s.Session.Unsubscribe(s.Destination.Name) 

基本上说它“在使用中”。我试图在取消订阅之前停止连接也没有效果。

有人有什么想法吗?在创建结果后,我完全无法从MQ中删除任何订阅。

感谢

1 个答案:

答案 0 :(得分:0)

因此,在更多地查看文档并与其他人进行更多咨询之后,这不是最明确的MQ文档。

传递给Unsubscribe方法的需求是传递给CreateDurableSubscriber方法的ID

所以....使用上面的代码,唯一的变化就是Unsubscribe调用。

s.Session.Unsubscribe(subId.ToString());

然后一切都很好。