2017-01-12 35 views
0

我想在Spring-JMS中实现一个带有activeMQ的解决方案,我想创建持久订阅主题。其目的是,如果用户关闭了一段时间的订阅,并再次使用相同的客户端ID和订阅名称重新创建durablesubscription,则订阅者应该收到订阅结束时的所有消息。Spring - ActiveMQ - 持久订阅 - 关闭连接并重新获得脱机消息

我想要实现在ORACLE网址为长期订阅提到以下逻辑:https://docs.oracle.com/cd/E19798-01/821-1841/bncgd/index.html

enter image description here

但我不能履行本使用弹簧JMS。根据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> 

回答

2

为什么不打电话DefaultMessageListenerContainer.stop();停止容器和消费者?

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

当持久使用者处于离线状态时发送给代理的所有消息都将被存储,直到它重新连接。

让你需要把它添加到jmsContainer

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

你可以添加一个subscriptionName或将使用指定的消息监听器的类名订阅耐用消费品。

您可以添加一个clientIDconnectionFactory

<property name="clientID" value="${jms.clientId}" /> 

或使用

<bean class="org.springframework.jms.connection.SingleConnectionFactory" id="singleConnectionFactory"> <constructor-arg ref="connectionFactory" /> <property name="reconnectOnException" value="true" /> <property name="clientId" value="${jms.clientId}" /> </bean>

和更新jmsContainer

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

UPDATE:

如果您adiListener工具org.springframework.jms.listener.SessionAwareMessageListener它必须定义方法onMessage(M message, Session session),当你有会话可以调用javax.jms.Session.unsubscribe(String subscriptionName)

subscriptionName如上定义,可以是注入到此bean或指定的消息侦听器的类名称可以使用。

+0

谢谢哈森。当jmsContainer重新启动时,它将消息传递给持久订阅。 – learner

+0

我开始探索上述解决方案时有一个问题。我无法从使用上述解决方案的持久订阅中完全取消订阅。 – learner

+0

我已经更新了我的答案 –

相关问题