0

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

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

我收到 IBM.WMQ.MQException {"2428"} "Failed to unsubscribe from topic X using MQCLOSE。删除订阅可能有问题,因为消息使用者正在使用它。确保使用此订阅的任何消息使用者都是退订前关闭。有关更多信息,请参阅链接的例外。

第二:细节 所以我使用 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);

所以所有的订阅和消息处理工作正常。当我点击取消订阅时,总是失败

s.Session.Unsubscribe(s.Destination.Name) 

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

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

谢谢

4

1 回答 1

0

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

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

所以....使用上面的代码唯一的改变是取消订阅调用。

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

然后一切都很好。

于 2014-12-26T16:09:59.903 回答