2017-02-17 29 views
1

Я использую Spring в @JmsListener (весна-JMS-4.3.4.RELEASE.jar) для приема сообщений от ActiveMQ, используя следующий код:@JmsListener проблема с долговременной подписки

@Component 
public class TopicSubscriber { 
    @JmsListener(destination="xyz.topic1", subscription="xyz_topic_durable_subscription") 
    public void send(Product product) {  
     System.out.println(" reveived message ***"+product); 
    } 
} 

Согласно документации Spring API, (ссылка ниже), приведенный выше код должен создать долговечную подписку с именем подписки в xyz_topic_durable_subscription:

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jms/annotation/JmsListener.html#subscription--

Но проблема в том, что приведенный выше код создает на ly Non-Durable подписка, которую я смог найти, проверив ActiveMQ с помощью консоли администратора (добавлен снимок экрана ниже, найдите пункт «xyz.topic1» в разделе «Активные непротиворечивые темы подписчиков»).

Следует ли внести изменения в код, чтобы сделать простую подписку?

ответ

3

Вам нужно настроить ListenerContainerFactory надлежащим образом:

@Bean 
public JmsListenerContainerFactory<?> myFactory(ConnectionFactory connectionFactory, 
               DefaultJmsListenerContainerFactoryConfigurer configurer) { 
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); 
    factory.setPubSubDomain(true); 
    factory.setSubscriptionDurable(true); 
    factory.setClientId("jmsDemo"); 
    // This provides all boot's default to this factory, including the message converter 
    configurer.configure(factory, connectionFactory); 
    // You could still override some of Boot's default if necessary. 
    return factory; 
} 

Там интересная часть здесь:

factory.setSubscriptionDurable(true); 
    factory.setClientId("jmsDemo"); 

Теперь, когда вы входите в ActiveMQ WebConsole вы должны увидеть это:

ActiveMQ WebConsole showing one Durable Topic Subscriber

1

Вам также необходимо настроить фабрику контейнеров-слушателей, чтобы создать контейнер для durable subscriptions.

1

В ответе, отмеченном в правильной выше, код:

factory.setPubSubDomain(true); 
factory.setSubscriptionDurable(true); 
factory.setClientId("jmsDemo"); 

должны прийти после того, как

configurer.configure(factory, connectionFactory); 

или вы потеряете эти настройки.

 Смежные вопросы

  • Нет связанных вопросов^_^