我有一个组件,它向等待结果的工作服务发送消息。
@Autowired
private RabbitTemplate rabbit;
[...]
Object response = rabbit.convertSendAndReceive("testQ", ...);
工作服务使用Apache Camel rabbitmq路由实现:
from("rabbitmq://localhost/myExchange?declare=false&routingKey=testQ&queue=testQ")
.routeId("myCamelRoute")
.process(myProcessor)
.to("log:myLog");
myProcessor处理邮件并注销Camel Message标头:
__TypeId__=...
breadcrumbId=...
rabbitmq.CONTENT_ENCODING=UTF-8
rabbitmq.CONTENT_TYPE=application/json
rabbitmq.CORRELATIONID=7e390b6b-d30f-4f26-ba44-33fb887db0e8
rabbitmq.DELIVERY_TAG=4
rabbitmq.EXCHANGE_NAME=
rabbitmq.PRIORITY=0
rabbitmq.REPLY_TO=amq.rabbitmq.reply-to.g2dkABNyYWJiaXRAOWU5ZjkxNDI4ZWRiAAAJgwAAADUC.5+kPXXxaXhoYo7A4T0HSZQ==
rabbitmq.ROUTING_KEY=testQ
邮件标题显然在工作方包含 rabbitmq.CONTENT_TYPE = application / json ,但此信息似乎已丢失""当响应消息返回时:
o.s.a.s.c.Jackson2JsonMessageConverter:无法转换 内容类型为[null]
的传入邮件
知道这里有什么问题吗?
答案 0 :(得分:6)
使用 Headers 字段时,我使用RabbitMQ管理控制台看到了同样的错误。 传递" content_type":" application / json"作为消息 Property 工作正常。
答案 1 :(得分:1)
编辑:实际上,Chrome自动完成功能似乎无法正常工作。我手动键入该属性,并且也能正常工作
我遇到了同样的问题。 RabbitMQ管理控制台和Spring使用者之间似乎存在问题。
基于this,我重写了Jackson2JsonMessageConverter的 fromMessage 方法,并将contentType强制为application / json,并且运行良好
我的堆栈是:
import org.springframework.amqp.core.Message;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
public class JacksonMessageConverter extends Jackson2JsonMessageConverter {
public JacksonMessageConverter() {
super();
}
@Override
public Object fromMessage(Message message) {
message.getMessageProperties().setContentType("application/json");
return super.fromMessage(message);
}
}
然后在兔子配置中使用
@Bean
public MessageConverter messageConverter() {
JacksonMessageConverter jsonMessageConverter = new JacksonMessageConverter();
jsonMessageConverter.setClassMapper(classMapper());
return jsonMessageConverter;
}
另一种解决方案是在GO中创建一个基本应用程序以发布消息,添加内容类型,并且工作正常,因为问题似乎出在RabbitMQ管理控制台中。
我的脚本正在运行:
// MqFactory - Creates a connection with mq
func MqFactory() *amqp.Connection {
mqURI, err := amqp.ParseURI(createAmqpURI())
if err != nil {
fmt.Printf("Failed on parse mq uri: %s", err)
}
conn, err := amqp.Dial(mqURI.String())
if err != nil {
failOnError(err, "Failed to connect to MQ")
} else {
fmt.Println("Connection established with MQ")
}
sendMessage(conn)
return conn
}
func sendMessage(conn *amqp.Connection) {
channel, err := conn.Channel()
if err != nil {
failOnError(err, "Failed 1")
}
err2 := channel.Publish(
"<exchange>",
"<routin_key>",
false,
false,
amqp.Publishing{
Headers: amqp.Table{
"__TypeId__": "<type_id>", // If needed
},
ContentType: "application/json",
Body: []byte("<body>"),
},
)
if err2 != nil {
failOnError(err2, "Failed 2")
}
}
func createAmqpURI() string {
host := os.Getenv("MQ_HOST")
port := os.Getenv("MQ_PORT")
usr := os.Getenv("MQ_USR")
pwd := os.Getenv("MQ_PWD")
return "amqp://" + usr + ":" + pwd + "@" + host + ":" + port
}
func failOnError(err error, msg string) {
println(msg)
if err != nil {
fmt.Printf("%s: %s", msg, err)
}
}
答案 2 :(得分:0)
如果 spring-amqp:
@Bean
public CachingConnectionFactory cachingConnectionFactory() {
final CachingConnectionFactory factory = new CachingConnectionFactory();
factory.setUsername(username);
factory.setPassword(password);
factory.setHost(host);
factory.setPort(port);
return factory;
}
@Bean
@DependsOn("cachingConnectionFactory")
public RabbitTemplate rabbitTemplate(CachingConnectionFactory cachingConnectionFactory) {
RabbitTemplate rabbitTemplate = new RabbitTemplate(cachingConnectionFactory);
rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());
return rabbitTemplate;
}