0
点赞
收藏
分享

微信扫一扫

解决rabbitmq收到消息打印告警消息

耶也夜 2023-05-26 阅读 89


  • 现象:收到消息会打印告警消息::Could not convert incoming message with content-type [null]
  • 解决:

RabbitMQ已经实现了Jackson的消息转换(Jackson2JsonMessageConverter),由于考虑到效率,如下使用Gson实现消息转换。

如下消息的转换类的接口MessageConverter,Jackson2JsonMessageConverter的父类AbstractJsonMessageConverter针对json转换的基类。

解决rabbitmq收到消息打印告警消息_json

我们实现Gson2JsonMessageConverter转换类也继承AbstractJsonMessageConverter。

引入Gson的pom


1. <dependency>  
2.             <groupId>com.google.code.gson</groupId>  
3.             <artifactId>gson</artifactId>  
4.             <version>2.3</version>  
5.         </dependency>

转换类实现如下:

 

 



1. package cn.slimsmart.rabbitmq.demo.spring.tag;  
2.   
3. import java.io.IOException;  
4. import java.io.UnsupportedEncodingException;  
5.   
6. import org.apache.commons.logging.Log;  
7. import org.apache.commons.logging.LogFactory;  
8. import org.springframework.amqp.core.Message;  
9. import org.springframework.amqp.core.MessageProperties;  
10. import org.springframework.amqp.support.converter.AbstractJsonMessageConverter;  
11. import org.springframework.amqp.support.converter.ClassMapper;  
12. import org.springframework.amqp.support.converter.DefaultClassMapper;  
13. import org.springframework.amqp.support.converter.MessageConversionException;  
14.   
15. import com.google.gson.Gson;  
16.   
17. public class Gson2JsonMessageConverter extends AbstractJsonMessageConverter {  
18.       
19.     private static Log log = LogFactory.getLog(Gson2JsonMessageConverter.class);  
20.       
21.     private static  ClassMapper classMapper =  new DefaultClassMapper();  
22.   
23.     private static Gson gson = new Gson();  
24.   
25.     public Gson2JsonMessageConverter() {  
26.         super();  
27.     }  
28.   
29.     @Override  
30.     protected Message createMessage(Object object,  
31.             MessageProperties messageProperties) {  
32.         byte[] bytes = null;  
33.         try {  
34.             String jsonString = gson.toJson(object);  
35.             bytes = jsonString.getBytes(getDefaultCharset());  
36.         }  
37.         catch (IOException e) {  
38.             throw new MessageConversionException(  
39.                     "Failed to convert Message content", e);  
40.         }  
41.         messageProperties.setContentType(MessageProperties.CONTENT_TYPE_JSON);  
42.         messageProperties.setContentEncoding(getDefaultCharset());  
43.         if (bytes != null) {  
44.             messageProperties.setContentLength(bytes.length);  
45.         }  
46.         classMapper.fromClass(object.getClass(),messageProperties);  
47.         return new Message(bytes, messageProperties);  
48.     }  
49.   
50.     @Override  
51.     public Object fromMessage(Message message)  
52.             throws MessageConversionException {  
53.         Object content = null;  
54.         MessageProperties properties = message.getMessageProperties();  
55.         if (properties != null) {  
56.             String contentType = properties.getContentType();  
57.             if (contentType != null && contentType.contains("json")) {  
58.                 String encoding = properties.getContentEncoding();  
59.                 if (encoding == null) {  
60.                     encoding = getDefaultCharset();  
61.                 }  
62.                 try {  
63.                         Class<?> targetClass = getClassMapper().toClass(  
64.                                 message.getMessageProperties());  
65.                         content = convertBytesToObject(message.getBody(),  
66.                                 encoding, targetClass);  
67.                 }  
68.                 catch (IOException e) {  
69.                     throw new MessageConversionException(  
70.                             "Failed to convert Message content", e);  
71.                 }  
72.             }  
73.             else {  
74.                 log.warn("Could not convert incoming message with content-type ["  
75.                         + contentType + "]");  
76.             }  
77.         }  
78.         if (content == null) {  
79.             content = message.getBody();  
80.         }  
81.         return content;  
82.     }  
83.   
84.     private Object convertBytesToObject(byte[] body, String encoding,  
85.             Class<?> clazz) throws UnsupportedEncodingException {  
86.         String contentAsString = new String(body, encoding);  
87.         return gson.fromJson(contentAsString, clazz);  
88.     }  
89. }

举报

相关推荐

0 条评论