2017-01-12 8 views
0

Я хочу реализовать решение Spring-JMS с activeMQ, где я хочу создать прочную подписку на тему. Цель заключается в том, что если абонент некоторое время закрывает подписку и снова воссоздает подписку на длительный срок с тем же идентификатором клиента и именем подписчика, абонент должен получить все сообщения, которые были доставлены во время закрытия абонемента.Spring - ActiveMQ - прочная подписка - закрытие соединения и повторная подписка на получение сообщений в автономном режиме

Я хочу осуществить упомянутую в URL 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 другому компоненту и закрыть его, когда захотите, и вызвать start() позже.

все сообщения, отправленные брокеру, когда ваш долговечный потребитель находится в автономном режиме, будут сохранены до тех пор, пока они не будут повторно подключены.

сделать подписку товары длительного пользования, нужно, чтобы добавить это jmsContainer боба

<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>

UPDATE:

если ваши adiListener орудия org.springframework.jms.listener.SessionAwareMessageListener он должен определить метод onMessage(M message, Session session) и когда у вас есть сеанс можно назвать javax.jms.Session.unsubscribe(String subscriptionName)

subscriptionName определено выше, и может быть вводится в этот компонент или может быть использовано имя класса указанного прослушивателя сообщений.

+0

Спасибо Hassen.Он работал, чтобы доставлять сообщения до длительной подписки, когда jmsContainer запускается снова. – learner

+0

Существует одна проблема, когда я начал изучать вышеупомянутое решение. Я не могу полностью отписаться от долговременной подписки, используя вышеупомянутое решение. – learner

+0

Я обновил свой ответ –