如何在不知道JMS选择器

时间:2018-02-06 16:38:49

标签: jms activemq

我是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对象。

但是这可能会在调用此方法时中断消息的接收。

0 个答案:

没有答案