第一:问题 我无法在针对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中删除任何订阅。
感谢
答案 0 :(得分:0)
因此,在更多地查看文档并与其他人进行更多咨询之后,这不是最明确的MQ文档。
传递给Unsubscribe方法的需求是传递给CreateDurableSubscriber方法的ID
所以....使用上面的代码,唯一的变化就是Unsubscribe调用。
s.Session.Unsubscribe(subId.ToString());
然后一切都很好。