Spring-ActiveMQ-持久订阅-关闭连接并重新订阅以获取脱机消息

Spring-ActiveMQ-持久订阅-关闭连接并重新订阅以获取脱机消息,activemq,spring-jms,durable-subscription,Activemq,Spring Jms,Durable Subscription,我想用activeMQ在SpringJMS中实现一个解决方案,其中我想创建一个主题的持久订阅。其目的是,如果订阅服务器关闭订阅一段时间,并再次使用相同的客户端id和订阅名称重新创建durablesubscription,则订阅服务器应接收订阅关闭期间传递的所有消息 我想为持久订阅实现ORACLE URL中提到的以下逻辑: 但我无法使用SpringJMS执行此操作。根据URL,我需要获取messageConsumer实例,并对该方法调用close(),以暂时停止从主题接收消息。但我不知道如何得到

我想用activeMQ在SpringJMS中实现一个解决方案,其中我想创建一个主题的持久订阅。其目的是,如果订阅服务器关闭订阅一段时间,并再次使用相同的客户端id和订阅名称重新创建durablesubscription,则订阅服务器应接收订阅关闭期间传递的所有消息

我想为持久订阅实现ORACLE URL中提到的以下逻辑:

但我无法使用SpringJMS执行此操作。根据URL,我需要获取messageConsumer实例,并对该方法调用close(),以暂时停止从主题接收消息。但我不知道如何得到它

以下是我的配置。请告诉我如何修改配置以执行此操作

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:jms="http://www.springframework.org/schema/jms"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                    http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms.xsd">


<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"
    p:userName="admin"
    p:password="admin" 
    p:brokerURL="tcp://127.0.0.1:61616"
    primary="true"
    ></bean>

<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer" p:durableSubscriptionName="gxaa-durable1" p:clientId="gxaa-client1">
    <property name="connectionFactory" ref="connectionFactory"/>
    <property name="destination" ref="adiTopic"/>
    <property name="messageListener" ref="adiListener"/>
</bean>

<bean id="configTemplate" class="org.springframework.jms.core.JmsTemplate" 
        p:connectionFactory-ref="connectionFactory"
        p:defaultDestination-ref="adiTopic" primary="true"
        p:pubSubDomain="true">
</bean>

<bean id="adiTopic" class="org.apache.activemq.command.ActiveMQTopic" p:physicalName="gcaa.adi.topic"></bean>

<bean id="adiListener" class="com.gcaa.asset.manager.impl.AdiListener"></bean>


为什么不调用
DefaultMessageListenerContainer.stop()停止容器和使用者

您可以将
jmsContainer
注入另一个bean,并在需要时关闭它,稍后调用start()

持久消费者脱机时发送到代理的所有消息都将被存储,直到其重新连接

要制作订阅耐用品,您需要将其添加到
jmsContainer
bean中

    <property name="subscriptionDurable" value="true" />
    <property name="cacheLevel" value="1" />
或使用


并更新jmsContainer


更新:

如果您的
adListener
实现了
org.springframework.jms.listener.SessionAwareMessageListener
它必须定义方法
onMessage(M message,Session Session)
并且当您有会话时,您可以调用
javax.jms.Session.unsubscribe(String subscriptionName)


subscriptionName是上面定义的,可以注入到这个bean中,也可以使用指定消息侦听器的类名。

为什么不调用
DefaultMessageListenerContainer.stop()停止容器和使用者

您可以将
jmsContainer
注入另一个bean,并在需要时关闭它,稍后调用start()

持久消费者脱机时发送到代理的所有消息都将被存储,直到其重新连接

要制作订阅耐用品,您需要将其添加到
jmsContainer
bean中

    <property name="subscriptionDurable" value="true" />
    <property name="cacheLevel" value="1" />
或使用


并更新jmsContainer


更新:

如果您的
adListener
实现了
org.springframework.jms.listener.SessionAwareMessageListener
它必须定义方法
onMessage(M message,Session Session)
并且当您有会话时,您可以调用
javax.jms.Session.unsubscribe(String subscriptionName)


subscriptionName是上面定义的,可以注入到这个bean中,也可以使用指定消息侦听器的类名。

谢谢Hassen。当jmsContainer再次启动时,它可以将消息传递到持久订阅。我无法使用上述解决方案完全取消持久订阅。谢谢Hassen。当jmsContainer再次启动时,它可以将消息传递到持久订阅。我无法使用上述解决方案完全取消持久订阅。