我想在Spring-JMS中使用activeMQ实现一个解决方案,我想在其中创建一个持久的主题订阅。目的是如果订阅者暂停订阅一段时间并再次使用相同的客户端ID和订阅名称重新创建durablesubscription,则订阅者应该接收订阅关闭期间发送的所有消息。
我想在ORACLE URL中为持久订阅实现以下逻辑:https://docs.oracle.com/cd/E19798-01/821-1841/bncgd/index.html
但我无法使用spring-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>
答案 0 :(得分:3)
为什么不调用DefaultMessageListenerContainer.stop();
来停止容器和消费者?
你可以将jmsContainer
注入另一个bean并在需要时将其关闭,然后再调用start()。
当持久消费者离线时发送给代理的所有消息都将被存储,直到它重新连接为止。
制作订阅耐用品,您需要将其添加到jmsContainer
bean
<property name="subscriptionDurable" value="true" />
<property name="cacheLevel" value="1" />
您可以添加subscriptionName
或将使用指定消息侦听器的类名。
您可以向clientID
connectionFactory
<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>
更新:
如果您的adiListener
实施org.springframework.jms.listener.SessionAwareMessageListener
,则必须定义方法onMessage(M message, Session session)
,当您有会话时,您可以致电javax.jms.Session.unsubscribe(String subscriptionName)
subscriptionName在上面定义,可以注入此bean,也可以使用指定消息监听器的类名。