设置自定义消息转换器时,不执行带有@JmsListener的方法 [英] Method with @JmsListener not executed when setting custom message converter

查看:543
本文介绍了设置自定义消息转换器时,不执行带有@JmsListener的方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有了这三个类,我发现了一个问题:

Having these three classes I have found a problem:

package xpadro.spring.jms;


import javax.jms.ConnectionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.support.converter.MarshallingMessageConverter;
import org.springframework.oxm.jaxb.Jaxb2Marshaller;





@SpringBootApplication
public class JmsJavaconfigApplication {

    public static void main(String[] args) {
        SpringApplication.run(JmsJavaconfigApplication.class, args);
    }




    @Bean
    public Jaxb2Marshaller jaxb2Marshaller(){
        Jaxb2Marshaller jaxb = new Jaxb2Marshaller();
        Class array[] = new Class[1];
        array[0]= xpadro.spring.jms.model.Order.class;      
        jaxb.setClassesToBeBound(array);
        return jaxb;
    }


    @Bean
    @Autowired
    public MarshallingMessageConverter marshallingMessageConverter( Jaxb2Marshaller marshaller){
        MarshallingMessageConverter mc = new MarshallingMessageConverter();     
        mc.setMarshaller(marshaller);
        mc.setUnmarshaller(marshaller);     
        return mc;      
    }


    @Bean
    @Autowired
    public JmsTemplate init(MarshallingMessageConverter messageConverter,ConnectionFactory  connectionFactory){
        JmsTemplate template = new JmsTemplate();
        template.setMessageConverter(messageConverter); 
        template.setConnectionFactory(connectionFactory);
        return template;
    } 


}

接下来,该模型:

package xpadro.spring.jms.model;

import java.io.Serializable;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "order")
@XmlAccessorType(XmlAccessType.FIELD)
public class Order implements Serializable {
    private static final long serialVersionUID = -797586847427389162L;

    @XmlElement(required = true)
    private String id="";

    public Order() {

    }

    public Order(String id) {
        this.id = id;
    }


    public String getId() {
        return id;
    }
}

接下来,听众:

package xpadro.spring.jms.listener;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;

import xpadro.spring.jms.model.Order;
import xpadro.spring.jms.service.StoreService;

@Component
public class SimpleListener {
    private final StoreService storeService;

    @Autowired
    public SimpleListener(StoreService storeService) {
        this.storeService = storeService;
    }

    @JmsListener(destination = "simple.queue")
    public void receiveOrder(Order order) {
        storeService.registerOrder(order);
    }
}

发送消息的类:

package xpadro.spring.jms.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Service;

import xpadro.spring.jms.model.Order;

@Service
public class ClientServiceImpl implements ClientService {
    private static final String SIMPLE_QUEUE = "simple.queue";
    private static final String IN_QUEUE = "in.queue";

    private final JmsTemplate jmsTemplate;

    @Autowired
    public ClientServiceImpl(JmsTemplate jmsTemplate) {
        this.jmsTemplate = jmsTemplate;
    }

    @Override
    public void addOrder(Order order) {
        //MessageRegistered with a bean
        jmsTemplate.convertAndSend(SIMPLE_QUEUE, order);
    }

    @Override
    public void registerOrder(Order order) {
        //MessageRegistered with a bean
        jmsTemplate.convertAndSend(IN_QUEUE, order);
    }
}

重点是当我在类JmsJavaconfigApplication中设置自定义消息转换器时,未执行listener(method receiveOrder()).当我不设置它时,Spring Boot会设置一个SimpleMessageConverter并执行侦听器.

The point is that listener(method receiveOrder()) is not executed when I set a custom message converter in the class JmsJavaconfigApplication. When I dont set it, spring boot sets a SimpleMessageConverter and the listener is executed.

任何错误或遗漏的配置?

Any wrong or missed configuration?

谢谢

推荐答案

您需要通过配置侦听器容器工厂

You need to provide an marshalling converter to the @JmsListener to unmarshall the message, by configuring the listener container factory see the documentation.

这篇关于设置自定义消息转换器时,不执行带有@JmsListener的方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆