在一些场景下我们希望在消息发送到MQ之前或者接受消息前对消息做一些自定义处理,这个时候就需要自定义MessageConverter了
首先要说明的是,在ActiveMQ中自带的有几个MessageConverter,基本能够帮我们完成普通对象的转换,比如我们发送消息时可以直接发送一个User对象,接受消息时可以直接用User来接受而无需自定义MessageConvert
自带的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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。