添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
  • 现象:收到消息会打印告警消息::Could not convert incoming message with content-type [null]
  • 解决:

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

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

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

引入Gson的pom

[html] view plain copy

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

转换类实现如下:

[java] view plain copy

  1. package cn.slimsmart.rabbitmq.demo.spring.tag;
  2. import java.io.IOException;
  3. import java.io.UnsupportedEncodingException;
  4. import org.apache.commons.logging.Log;
  5. import org.apache.commons.logging.LogFactory;
  6. import org.springframework.amqp.core.Message;
  7. import org.springframework.amqp.core.MessageProperties;
  8. import org.springframework.amqp.support.converter.AbstractJsonMessageConverter;
  9. import org.springframework.amqp.support.converter.ClassMapper;
  10. import org.springframework.amqp.support.converter.DefaultClassMapper;
  11. import org.springframework.amqp.support.converter.MessageConversionException;
  12. import com.google.gson.Gson;
  13. public class Gson2JsonMessageConverter extends AbstractJsonMessageConverter {
  14. private static Log log = LogFactory.getLog(Gson2JsonMessageConverter.class);
  15. private static  ClassMapper classMapper =  new DefaultClassMapper();
  16. private static Gson gson = new Gson();
  17. public Gson2JsonMessageConverter() {
  18. super();
  19. }
  20. @Override
  21. protected Message createMessage(Object object,
  22. MessageProperties messageProperties) {
  23. byte[] bytes = null;
  24. try {
  25. String jsonString = gson.toJson(object);
  26. bytes = jsonString.getBytes(getDefaultCharset());
  27. }
  28. catch (IOException e) {
  29. throw new MessageConversionException(
  30. "Failed to convert Message content", e);
  31. }
  32. messageProperties.setContentType(MessageProperties.CONTENT_TYPE_JSON);
  33. messageProperties.setContentEncoding(getDefaultCharset());
  34. if (bytes != null) {
  35. messageProperties.setContentLength(bytes.length);
  36. }
  37. classMapper.fromClass(object.getClass(),messageProperties);
  38. return new Message(bytes, messageProperties);
  39. }
  40. @Override
  41. public Object fromMessage(Message message)
  42. throws MessageConversionException {
  43. Object content = null;
  44. MessageProperties properties = message.getMessageProperties();
  45. if (properties != null) {
  46. String contentType = properties.getContentType();
  47. if (contentType != null && contentType.contains("json")) {
  48. String encoding = properties.getContentEncoding();
  49. if (encoding == null) {
  50. encoding = getDefaultCharset();
  51. }
  52. try {
  53. Class<?> targetClass = getClassMapper().toClass(
  54. message.getMessageProperties());
  55. content = convertBytesToObject(message.getBody(),
  56. encoding, targetClass);
  57. }
  58. catch (IOException e) {
  59. throw new MessageConversionException(
  60. "Failed to convert Message content", e);
  61. }
  62. }
  63. else {
  64. log.warn("Could not convert incoming message with content-type ["
  65. + contentType + "]");
  66. }
  67. }
  68. if (content == null) {
  69. content = message.getBody();
  70. }
  71. return content;
  72. }
  73. private Object convertBytesToObject(byte[] body, String encoding,
  74. Class<?> clazz) throws UnsupportedEncodingException {
  75. String contentAsString = new String(body, encoding);
  76. return gson.fromJson(contentAsString, clazz);
  77. }
  78. }
现象:收到消息会打印告警消息::Could not convert incoming message with content-type [null] 解决:RabbitMQ已经实现了Jackson的消息转换(Jackson2JsonMessageConverter),由于考虑到效率,如下使用Gson实现消息转换。如下消息的转换类的接口MessageConverter,Jackson2JsonMessageConverter的父类AbstractJsonMessageConverter针对json转
SpringBoot整合 Rabbitmq 发送接收 消息 实战 另外,博主发起了SpringBoot整合 Rabbitmq 这一系列的gitchat交流会。刚兴趣的童鞋可以进入交流:https://gitbook.cn/gitchat/activity/5b90f9214fb1bd5c9acd4338 交流QQ:1974544863
PayMap PayMap是一个使用Java语言集成三方支付的小Demo,现已集成支付宝(国内、国际、移动端、PC端)、微信、银联(ACP、UPOP)、光大(网关、网页)、邮政支付,采用的技术栈为:SpringMVC+Spring+MyBatis+Shiro+ RabbitMQ +Redis。 支持前面提到的各种**支付 支付请求调用...
问题描述: org.springframework.amqp.rabbit.support.ListenerExecution Failed Exception: Failed to convert message Caused by: org.springframework.amqp.AmqpException: No method found for class java.lang.String 问题分析: 1、 消息 生产者发送的 消息 类型为String, 消息 消费者接收的 消息
支持byte[] 、CharSequence 两种类型直接传输 ,其余对象直接用fastjson转为json字符串传输 。 byte[] 一般用来传输文件 , 而 CharSequence用来传输字符串效率更高。 import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializerFeature; import org.springframework.amqp.core. Message ; impor <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> 2.配置 RabbitMQ 连接信息,例如在application.properties中添加以下配置: spring. rabbitmq .host=localhost spring. rabbitmq .port=5672 spring. rabbitmq .username=guest spring. rabbitmq .password=guest 3.创建一个发送 消息 的工具类,例如AlertSender.java: @Component public class AlertSender { @Autowired private RabbitTemplate rabbitTemplate; public void send(String message ) { rabbitTemplate. convert AndSend("alert.exchange", "alert.key", message ); 4.在需要发送 告警 消息 的地方调用AlertSender的send方法,例如: @Autowired private AlertSender alertSender; public void doSomething() { // 发送 告警 消息 alertSender.send("发生了错误!"); 5.在 RabbitMQ 中创建exchange和queue,并将它们绑定起来,例如: @Bean public DirectExchange alertExchange() { return new DirectExchange("alert.exchange"); @Bean public Queue alertQueue() { return new Queue("alert.queue"); @Bean public Binding alertBinding(DirectExchange alertExchange, Queue alertQueue) { return BindingBuilder.bind(alertQueue).to(alertExchange).with("alert.key"); 这样就完成了使用SpringBoot和 RabbitMQ 发送 告警 消息 的实现。