尝试使用Spring Boot消费JMS主题消息时发生异常

我正在尝试使用activeMQ主题中的消息。下面是代码:

@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:创建在类路径资源[com / investbank / equityfeedsprocessingrevised / config / Config.class]中定义的名称为'jmsTemplate'的bean时出错:通过工厂方法的Bean实例化失败;嵌套的异常是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.DefaultJmsListenerContainerFactory和javax.jms.ConnectionFactory处于未命名模块中)加载程序“ app”)

我在这里做错了什么?为什么例外?

我也尝试过:

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

我在这里得到的例外是:

通过字段'jmsTemplate'表示的不满足的依赖关系;嵌套的异常是org.springframework.beans.factory.BeanCreationException:创建在类路径资源[com / investbank / equityfeedsprocessingrevised / config / Config.class]中定义的名称为'jmsTemplate'的bean时出错:通过工厂方法的Bean实例化失败;嵌套的异常是org.springframework.beans.BeanInstantiationException:无法实例化[org.springframework.jms.core.JmsTemplate]:工厂方法'jmsTemplate'引发了异常;嵌套异常是org.springframework.beans.factory.BeanCreationException:在类路径资源[com / investmentbank / equityfeedsprocessingrevised / config / Config.class]中创建名称为'jmsListenerContainerFactory'的bean时出错:调用init方法失败;嵌套的异常是java.lang.IllegalArgumentException:属性'destination'或'destinationName'是必需的

只需添加我的JmsTemplate代码,如下所示:

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

我已经使用Apache Camel(代码)实现了JMS Topic Publisher:

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");
            }

        });

我可以在主题名称的“已入队消息”列中看到消息数。

出了什么问题?我已经阅读了网上的各种帖子,但无法解决问题。请帮助解决问题。我无法阅读有关activeMQ主题的消息。让我知道我是否遗漏了一些信息。

xyzliuyu0 回答:尝试使用Spring Boot消费JMS主题消息时发生异常

您可以尝试将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;
}
,

我使用以下代码解决了这个问题:

    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. 。此外,消息需要一段时间才能被 消费者。

本文链接:https://www.f2er.com/2486297.html

大家都在问