我是JMS的新手,我正在尝试为消息传递应用程序设置Apache Active MQ,作为我非常熟悉的Azure Service Bus的替代方案。我想设置主题和持久订阅者以及管理任务,并希望运行时进程仅根据其名称和可能的客户端ID来使用来自那些现有持久订阅者的消息。
如何在不知道选择器的情况下检索现有的持久订阅者?
我阅读的所有文档和示例都表明,使用消息的唯一方法是调用session.createDurableSubscriber()
方法。
另外,我更喜欢使用AMQP抽象而不是JMS。所以我找到了以下代码来检索现有订户:
public static ReceiverLink RecoverDurableSource(Session session, string topicPath, string subscriptionName)
{
Source recovered = null;
using (var attached = new ManualResetEvent(false))
{
void OnAttached(ILink link, Attach Attach)
{
recovered = (Source)Attach.Source;
attached.Set();
}
ReceiverLink receiver = null;
try
{
receiver = new ReceiverLink(session, subscriptionName, (Source)null, OnAttached);
if (!attached.WaitOne(TimeSpan.FromSeconds(5)))
return null;
CloseReceiverLink(receiver);
return recovered != null
? new ReceiverLink(session, subscriptionName, recovered, null)
: null
;
}
finally
{
if (recovered == null)
CloseReceiverLink(receiver);
}
}
}
private static void CloseReceiverLink(ReceiverLink receiver)
{
if (receiver == null)
return;
if (receiver.Error == null || Equals(receiver.Error.Condition, new Symbol("amqp:not-found")))
receiver.Close();
}
但是,这段代码具有令人讨厌的副作用,即使用相同的名称重新创建和默认持久订阅者(由ReceiverLink
对象在此代码中显示),然后,如果存在,则重新创建它正确的Source
对象。
但是这可能会在调用此方法时中断消息的接收。