SpringBoot下Activemq自定义MessageConverter

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

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


 

 

 

自带的几个Converter

准备工作:

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

    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-activemq</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-pool</artifactId>
             <version>5.7.0</version>
        </dependency>

在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

 

步骤: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=才女无敌)



作者:touch_The_Sky
链接:https://www.jianshu.com/p/8f6128d5f8bd
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

posted @ 2020-06-12 22:37  疯子110  阅读(1244)  评论(0编辑  收藏  举报