spring 云流无法使用 Spring RestTemplate 解析发布到 RabbitMq 的消息
spring cloud stream unable to parse message posted to RabbitMq using Spring RestTemplate
我在将消息发送到 spring-cloud-stream spring-boot app 时遇到问题。
我正在使用 rabbitMq 作为消息引擎。
消息生成器是一个非 spring 引导应用程序,它使用 Spring RestTemplate 发送消息。
队列名称:"audit.logging.rest"
消费者应用程序已设置为侦听该队列。这个应用程序是 spring-boot app(spring-cloud-stream).
下面是消费代码
application.yml
cloud:
stream:
bindings:
restChannel:
binder: rabbit
destination: audit.logging
group: rest
AuditServiceApplication.java
@SpringBootApplication
public class AuditServiceApplication {
@Bean
public ByteArrayMessageConverter byteArrayMessageConverter() {
return new ByteArrayMessageConverter();
}
@Input
@StreamListener(AuditChannelProperties.REST_CHANNEL)
public void receive(AuditTestLogger logger) {
...
}
AuditTestLogger.java
public class AuditTestLogger {
private String applicationName;
public String getApplicationName() {
return applicationName;
}
public void setApplicationName(String applicationName) {
this.applicationName = applicationName;
}
}
以下是生产者应用程序以 JSON 格式发送的请求。
{"applicationName" : "AppOne" }
发现了几个问题:
问题 1:
我注意到以下方法仅在方法参数作为对象提及时才会触发,因为 spring-cloud-stream 无法将消息解析为 Java POJO 对象。
@Input
@StreamListener(AuditChannelProperties.REST_CHANNEL)
public void receive(AuditTestLogger logger) {
问题2:
当我更改接收对象的方法时。我看到对象是无法解析的 RMQTextMessage 类型。但是我在其中看到了针对文本 属性.
的实际发布消息
我写了一个 ByteArrayMessageConverter 甚至没有帮助。
有什么方法可以告诉 spring 云流使用 MessageConverter 从 RMQTextMessage 中提取消息并从中获取实际消息。
提前致谢..
RMQTextMessage
?看起来它是 rabbitmq-jms-client
.
的一部分
如果是 RabbitMQ Binder,你应该只依赖 Spring AMQP。
现在让我们弄清楚您的生产者应用程序在做什么。
因为你得到 RMQTextMessage
作为 @StreamListener
方法的值,这告诉我发送者真的使用 rabbitmq-jms-client
来生产,因此队列中真正的 AMQP 消息有 RMQTextMessage
作为真实 payload
.
的包装器
为什么不在那里也使用 Spring AMQP?
这是一个迟到的回复,但我有确切的问题并通过发送和接收 application/json 格式的消息解决了它。在 spring 云流配置中使用它。
content-type: application/json
我在将消息发送到 spring-cloud-stream spring-boot app 时遇到问题。 我正在使用 rabbitMq 作为消息引擎。 消息生成器是一个非 spring 引导应用程序,它使用 Spring RestTemplate 发送消息。
队列名称:"audit.logging.rest"
消费者应用程序已设置为侦听该队列。这个应用程序是 spring-boot app(spring-cloud-stream).
下面是消费代码
application.yml
cloud:
stream:
bindings:
restChannel:
binder: rabbit
destination: audit.logging
group: rest
AuditServiceApplication.java
@SpringBootApplication
public class AuditServiceApplication {
@Bean
public ByteArrayMessageConverter byteArrayMessageConverter() {
return new ByteArrayMessageConverter();
}
@Input
@StreamListener(AuditChannelProperties.REST_CHANNEL)
public void receive(AuditTestLogger logger) {
...
}
AuditTestLogger.java
public class AuditTestLogger {
private String applicationName;
public String getApplicationName() {
return applicationName;
}
public void setApplicationName(String applicationName) {
this.applicationName = applicationName;
}
}
以下是生产者应用程序以 JSON 格式发送的请求。
{"applicationName" : "AppOne" }
发现了几个问题: 问题 1: 我注意到以下方法仅在方法参数作为对象提及时才会触发,因为 spring-cloud-stream 无法将消息解析为 Java POJO 对象。
@Input
@StreamListener(AuditChannelProperties.REST_CHANNEL)
public void receive(AuditTestLogger logger) {
问题2:
当我更改接收对象的方法时。我看到对象是无法解析的 RMQTextMessage 类型。但是我在其中看到了针对文本 属性.
的实际发布消息我写了一个 ByteArrayMessageConverter 甚至没有帮助。
有什么方法可以告诉 spring 云流使用 MessageConverter 从 RMQTextMessage 中提取消息并从中获取实际消息。
提前致谢..
RMQTextMessage
?看起来它是 rabbitmq-jms-client
.
如果是 RabbitMQ Binder,你应该只依赖 Spring AMQP。
现在让我们弄清楚您的生产者应用程序在做什么。
因为你得到 RMQTextMessage
作为 @StreamListener
方法的值,这告诉我发送者真的使用 rabbitmq-jms-client
来生产,因此队列中真正的 AMQP 消息有 RMQTextMessage
作为真实 payload
.
为什么不在那里也使用 Spring AMQP?
这是一个迟到的回复,但我有确切的问题并通过发送和接收 application/json 格式的消息解决了它。在 spring 云流配置中使用它。
content-type: application/json