消息驱动–生产者
1.新建module添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2.配置yml
cloud:
stream:
binders:
defaultRabbit:
type: rabbit
environment:
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
bindings:
output:
destination: studyExchange #要使用的Exchange名称
content-type: application/json #消息类型
binder: defaultRabbit #要绑定的消息服务的具体设置
3.业务类
新建接口,其中的MessageBuilder为
org.springframework.integration.support.MessageBuilder;
public interface IMessageProvider {
public String send();
}
@EnableBinding(Source.class)// 定义消息的推送管道
public class IMessageProvider implements org.yuanqi.streamprovider8801.service.IMessageProvider {
@Resource
private MessageChannel output; //消息发送管道
@Override
public String send() {
String message = "sender";
output.send(MessageBuilder.withPayload(message).build()); 发送消息
return null;
}
}
调用控制类时,发送消息
@Controller
public class SendMessageHandler {
@Resource
private IMessageProvider provider;
@RequestMapping(value = "/sendMessage")
@ResponseBody
public String sendMessage(){
return provider.send();
}
}
常用注解
消息驱动的流程示意图
配置文件中注册的Exchange名称
如果服务成功启用便可以在Exchanges中看到
消息驱动–消费者
1.建module 依赖同上
2.配置yml,把output改成input即可
cloud:
stream:
binders:
defaultRabbit:
type: rabbit
environment:
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
bindings:
input:
destination: studyExchange #要绑定的Exchange名称
content-type: application/json #消息类型
binder: defaultRabbit #要绑定的消息服务的具体设置
3.业务类
@Component
@EnableBinding({Sink.class})
public class ReceiveMessageListenerHandler {
@Value("${server.port}")
private String port;
@StreamListener(Sink.INPUT)
public void input(Message<String> message){
System.out.println("customer01 ------->"+message.getPayload()+"\t port: " +port);
}
}
这时启动请求发布端,接受端能接受到发布端的消息
重复消费问题–一个服务集群中只希望其中一个服务完成这个操作
解决: 服务配置
不同组是可以全面消费的
同一组内会发生竞争关系,只有其中一个可以消费
1.修改组名
bindings:
input:
destination: studyExchange
content-type: application/json
binder: defaultRabbit
group: customerA
2.希望信息只消费一次的集群gruop 配置相同的组名即可
持久化:服务宕机重启 会自动去rabbitmq上获取没有消费的消息进行消费,以免错过消息
配置了gruop后该服务便支持持久化