Исключение при попытке получить сообщение JMS Topi c с помощью Spring Boot - PullRequest
1 голос
/ 08 апреля 2020

Я пытаюсь использовать сообщение от ActiveMQ Topi c. Ниже приведен код:

@Configuration
@EnableJms
public class Config {

@Value("${activemq.broker-url}")
private String brokerURL;

@Bean
public ActiveMQConnectionFactory activeMQConnectionFactory() {
    ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory();
    activeMQConnectionFactory.setBrokerURL(brokerURL);
    activeMQConnectionFactory.setTrustAllPackages(true);
    return activeMQConnectionFactory;
}

public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(){
    DefaultJmsListenerContainerFactory defaultJmsListenerContainerFactory = new DefaultJmsListenerContainerFactory();
    defaultJmsListenerContainerFactory.setConnectionFactory(activeMQConnectionFactory());
    defaultJmsListenerContainerFactory.setPubSubDomain(true);
    return defaultJmsListenerContainerFactory;
}

Мой код потребителя:

@Component
@EnableJms
public class Consumer {

   @JmsListener(destination = "xml.inbound.topic", containerFactory = "jmsListenerContainerFactory")
   public void Processor(final Message xmlMessage) {

   }
}

Исключение, которое я получаю:

Неудовлетворенная зависимость, выраженная через поле ' jmsTemplate '; вложенное исключение - org.springframework.beans.factory.BeanCreationException: ошибка создания бина с именем 'jmsTemplate', определенного в ресурсе пути к классу [com / investmentbank / equityfeedsprocessingrevised / config / Config.class]: сбой создания экземпляра бина с помощью метода фабрики; вложенным исключением является org.springframework.beans.BeanInstantiationException: не удалось создать экземпляр [org.springframework.jms.core.JmsTemplate]: фабричный метод 'jmsTemplate' вызвал исключение; Вложенное исключение: java .lang.ClassCastException: класс org.springframework.jms.config.DefaultJmsListenerContainerFactory не может быть приведен к классу javax.jms.ConnectionFactory (org.springframework.jms.config.DefaultJmsLactjConv.jpgFactory.avn_Firectory.JAFF. модуль загрузчика 'app')

Что я тут не так делаю? Почему исключение?

Я также пытался:

@Bean
public DefaultMessageListenerContainer jmsListenerContainerFactory() {
        DefaultMessageListenerContainer dmlc = new DefaultMessageListenerContainer();
        dmlc.setConnectionFactory(activeMQConnectionFactory());
        dmlc.setPubSubDomain(true);
        return dmlc;
}

Исключение, которое я здесь получаю:

Неудовлетворенная зависимость, выраженная через поле 'jmsTemplate'; вложенное исключение - org.springframework.beans.factory.BeanCreationException: ошибка создания бина с именем 'jmsTemplate', определенного в ресурсе пути к классу [com / investmentbank / equityfeedsprocessingrevised / config / Config.class]: сбой создания экземпляра бина с помощью метода фабрики; вложенным исключением является org.springframework.beans.BeanInstantiationException: не удалось создать экземпляр [org.springframework.jms.core.JmsTemplate]: фабричный метод 'jmsTemplate' вызвал исключение; вложенное исключение - org.springframework.beans.factory.BeanCreationException: ошибка создания бина с именем 'jmsListenerContainerFactory', определенного в ресурсе пути к классу [com / investmentbank / equityfeedsprocessingrevised / config / Config.class]: сбой вызова метода init; вложенное исключение: java .lang.IllegalArgumentException: требуется свойство 'destination' или 'destinationName'

Просто добавить мой код JmsTemplate выглядит следующим образом:

@Bean
public JmsTemplate jmsTemplate() {
JmsTemplate jmsTemplate = new JmsTemplate();
         jmsTemplate.setConnectionFactory(activeMQConnectionFactory());
         jmsTemplate.setPubSubDomain(true);
         return jmsTemplate;
}

I Я выполнил JMS Topi c Publisher, используя Apache Camel (Код):

ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
        CamelContext _ctx = new DefaultCamelContext(); 
        _ctx.addComponent("jms", JmsComponent.jmsComponentAutoAcknowledge(connectionFactory));
        _ctx.addRoutes(new RouteBuilder() {

            public void configure() throws Exception {
                from("file:src/main/resources?fileName=data-sample_2.csv")
                .process(new MyTransformRevised1())
                .to("file:src/main/resources/?fileName=emp.xml")                
                .split(body().tokenizeXML("equityFeeds", null)).streaming().to("jms:topic:xml.inbound.topic");
            }

        });

Я могу видеть количество сообщений в столбце "Постановка сообщений" моего имени Topi c.

Что не так? Я прочитал различные сообщения на net, но не смог решить проблему. Пожалуйста, помогите в решении проблемы. Я не могу прочитать сообщение на ActiveMQ Topi c. Дайте мне знать, если какая-то информация отсутствует с моей стороны.

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

вы можете попытаться обернуть activeMQConnectionFactory в CachingConnectionFactory и использовать DefaultJmsListenerContainerFactoryConfigurer для настройки JmsListenerContainerFactory:

@Bean
ConnectionFactory connectionFactory() {
    return new CachingConnectionFactory(activeMQConnectionFactory());
}

@Bean
public JmsListenerContainerFactory<?> jmsListenerContainerFactory(ConnectionFactory connectionFactory,
                                    DefaultJmsListenerContainerFactoryConfigurer configurer) {

    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    configurer.configure(factory, connectionFactory);
    return factory;
}

ПРАВКА ПРАВКИ:

не могли бы вы попробуйте изменить JmsTemplate на:

@Bean
public JmsTemplate jmsTemplate(ConnectionFactory connectionFactory) {
JmsTemplate jmsTemplate = new JmsTemplate();
         jmsTemplate.setConnectionFactory(connectionFactory);
         jmsTemplate.setPubSubDomain(true);
         return jmsTemplate;
}
0 голосов
/ 10 апреля 2020

Я решил это с помощью приведенного ниже кода:

    public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(){
    DefaultJmsListenerContainerFactory defaultJmsListenerContainerFactory = new DefaultJmsListenerContainerFactory();
                defaultJmsListenerContainerFactory.setConnectionFactory(activeMQConnectionFactory());
defaultJmsListenerContainerFactory.setPubSubDomain(true);
return defaultJmsListenerContainerFactory;
        }

     @Bean
     public JmsTemplate jmsTemplate() {
        JmsTemplate jmsTemplate = new JmsTemplate();
        jmsTemplate.setConnectionFactory(activeMQConnectionFactory());
        jmsTemplate.setPubSubDomain(true);
        return jmsTemplate;
    }

    @JmsListener(destination = "${my.inboundTopicName}", containerFactory = "jmsListenerContainerFactory")
    public void myProcessor(final Message xmlMessage) {
    ///

    }

Я хочу добавить, что у меня необычное поведение.

  1. В то время, когда сообщения генерируются от производителя и если потребитель работает, тогда только сообщения потребляются потребителем. Я имею в виду, что если сообщения производятся производителем и ставятся в очередь ActiveMQ, и через некоторое время я включаю потребителя, то сообщения не потребляются потребителем.

  2. . Также потребуется некоторое время, прежде чем сообщения будут использованы потребителем.

...