Spring Cloud Stream 支持 RabbitMQ
Spring Cloud Stream 是一个用来为微服务应用构建消息驱动能力的框架。Spring Cloud Stream 为一些供应商的消息中间件产品提供了个性化的自动化配置实现,并引入了发布-订阅、消费组、分区这三个核心概念。通过使用 Spring Cloud Stream,可以有效简化开发人员对消息中间件的使用复杂度,让系统开发人员可以有更多的精力关注于核心业务逻辑的处理。
废话不多说,上代码
提示:以下是本篇文章正文内容,下面案例可供参考
配置
// pom依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
// springboot参数配置
spring:
rabbitmq:
host: xxx.xxx.xxx.xxx
port: 5672
username: guest
password: guest
生产者
配置
这里通过 spring.cloud.stream.bindings.*.destination 的配置,让输入通道和输出通道对应到同一个主题上
spring.cloud.stream.bindings.user-info-output.destination=exch-user-info
spring.cloud.stream.rabbit.bindings.user-info-output.producer.exchangeType=fanout
消息输出通道UserSource.java
public interface UserSource {
String USER_INFO_OUTPUT = "user-info-output";
/**
* 消息发送通道:用户系统配置
*
* @return 消息发送通道
*/
@Output(USER_INFO_OUTPUT)
MessageChannel userInfoMessageOutput();
}
消息通知类UserSender .java
@EnableBinding(UserSource.class)
public class UserSender {
@Resource
@Output(UserSource.USER_INFO_OUTPUT)
private MessageChannel userInfoChannel;
/**
* 用户系统配置通知
*
* @param req 消息体
* @return {@code true} 消息发送成功
*/
public boolean userInfo(JSONObject req) {
log.info("【Send Msg - User Info】 {}", JSON.toJSONString(req));
return userInfoChannel.send(MessageBuilder.withPayload(req).build());
}
}
业务类
{
// 业务代码
userSender.userInfo(req);
// 业务代码
}
消费者
配置
这里通过 spring.cloud.stream.bindings.*.destination 的配置,让输入通道和输出通道对应到同一个主题上
spring.cloud.stream.bindings.user-info-input.binder=issue
spring.cloud.stream.bindings.user-info-input.contentType=application/json
spring.cloud.stream.bindings.user-info-input.destination=exch-user-info
spring.cloud.stream.bindings.user-info-inputt.group=group-user-info
spring.cloud.stream.rabbit.bindings.user-info-input.consumer.autoBindDlq=true
spring.cloud.stream.rabbit.bindings.user-info-input.consumer.republishToDlq=true
消息输入通道UserInfoSink .java
public interface UserInfoSink {
String USER_INFO_INPUT = "user-info-input";
/**
* 消息收取通道
*
* @return 消息收取通道
*/
@Input(USER_INFO_INPUT)
MessageChannel userInfoMessageInput();
}
接收消息
@Service
@EnableBinding(UserInfoSink .class)
public class QueryUserReceiver {
/**
* 监听
*
* @param payload 消息
* @return 问题Key
*/
@StreamListener(UserInfoSink.USER_INFO_INPUT )
public void receive(JSONObject payload) {
log.info("【Receive Msg - user info 】\n{}", JSONObject.toJSONString(payload));
}
}