SpringBoot下Activemq自定义MessageConverter

在一些场景下我们希望在消息发送到MQ之前或者接受消息前对消息做一些自定义处理,这个时候就需要自定义MessageConverter了

首先要说明的是,在ActiveMQ中自带的有几个MessageConverter,基本能够帮我们完成普通对象的转换,比如我们发送消息时可以直接发送一个User对象,接受消息时可以直接用User来接受而无需自定义MessageConvert
自带的Converter的转换方式有时候并不适用我们的业务,这里就不再多说,大家可以自己看源码


SpringBoot下Activemq自定义MessageConverter_第1张图片
自带的几个Converter

准备工作:

创建SpringBoot项目, 添加ActiveMQ的Springboot依赖包

    
            org.springframework.boot
            spring-boot-starter-activemq
        
        
            org.apache.activemq
            activemq-pool
             5.7.0
        

在application.properties中添加配置(配置可按需添加,这里只列出相关的几个)

#指定ActiveMQ broker的URL,默认自动生成.
spring.activemq.broker-url=tcp://192.168.135.128:61616
# 要信任的特定包的逗号分隔列表(当不信任所有包时)
spring.activemq.packages.trusted=cn.ym.a,cn.ym.b
#设置信任所有的包(和上面的配置二选一)
spring.activemq.packages.trust-all=true

步骤:1

配置JmsListenerContainerFactory

 @Bean
    public JmsListenerContainerFactory queueContainer(ActiveMQConnectionFactory connectionFactory){
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        factory.setPubSubDomain(Boolean.FALSE);//支持queue
        factory.setMessageConverter(new UserConvert());
        return  factory;
    }

步骤:2

配置消费者

@Component
public class AMQLitenner {

    @JmsListener(destination ="user_create_queue",containerFactory="queueContainer" )
    public void user_create_queue(User user) {
        System.out.println("user_create_queue 接受到消息:  "+user);
    }


步骤:3

定义测试类User

@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable{

    private Long id;
    private String name;

}

步骤4:

自定义MessageConverter

public class UserConvert implements MessageConverter {
    /**
     * 发送消息时转换
     */
    @Override
    public Message toMessage(Object o, Session session) throws JMSException, MessageConversionException {
        try {
            ObjectMapper mapper = new ObjectMapper();
            String ret = mapper.writeValueAsString(o);
            return session.createTextMessage(ret);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return session.createTextMessage("error");
    }

    /**
     * 接受消息时转换
     */
    @Override
    public User fromMessage(Message message) throws JMSException, MessageConversionException {
        try {
            TextMessage msg = (TextMessage) message;
            ObjectMapper mapper = new ObjectMapper();
            String text = msg.getText();
            return mapper.readValue(text, User.class);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

步骤5:

创建测试接口

    @GetMapping("/testConvert")
    public void test(){
        ActiveMQQueue destination = new ActiveMQQueue("user_create_queue");
        jmsTemplate.setMessageConverter(new UserConvert());
        jmsTemplate.convertAndSend(destination,new User(1L,"才女无敌"));

    }

步骤6:

测试结果

user_create_queue 接受到消息:  User(id=1, name=才女无敌)

你可能感兴趣的:(SpringBoot下Activemq自定义MessageConverter)