straem使用rocketmq
1:添加依赖
版本对应可能会有问题 需要自己对应springcloud版本.
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rocketmq</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
2:使用自带Binding存消息
可以使用自带的直接@Autowired注入.
stream自带的两个使用,以下为Source ,Sink同样.
public interface Source {
String OUTPUT = "output";
@Output(Source.OUTPUT)
MessageChannel output();
}
如果只有一个MessageChannel,则这样使用.
@Autowired
private Source source;
@RequestMapping(value = "/sendMessage")
public void send(String flagHeader){
String msg = "source一条消息";
flagHeader = "out";
this.source.output().send(MessageBuilder.withPayload(msg)
// 设置用于过滤消息的header
.setHeader("flag-header", flagHeader)
.build());
System.out.println("======================");
}
如果不止一个MessageChannel,则这样使用.(推荐使用第二种)
@Autowired
@Qualifier(Source.OUTPUT)
private MessageChannel messageChannel;
@RequestMapping(value = "/sendMessage")
public void send(String flagHeader){
String msg = "source一条消息";
flagHeader = "out";
this.MessageChannel .output().send(MessageBuilder.withPayload(msg)
// 设置用于过滤消息的header
.setHeader("flag-header", flagHeader)
.build());
System.out.println("======================");
}
启动类加上 @EnableBinding(Source.class) 指定需要需要使用的类
3:使用自定义Binding存消息
public interface CustomBinding {
String INPUT1 = "input1";
String OUTPUT1 = "output1";
@Input
SubscribableChannel input1();
@Output
MessageChannel output1();
}
@EnableBinding(CustomBinding.class)
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@Component
public class UserProducer {
@Autowired
@Qualifier(CustomBinding.OUTPUT1)
private MessageChannel messageChannel;
public void sendUser(User user) {
String flagHeader = "out";
this.MessageChannel .output().send(MessageBuilder.withPayload(user)
// 设置用于过滤消息的header
.setHeader("flag-header", flagHeader)
.build());
System.out.println("======================");
}
}
4:使用自定义Binding取消息
表示取带有ot头的数据
@Component
@Slf4j
public class UserConsumer {
@StreamListener(value=CustomBinding.INPUT1 ,condition = "headers['flag-header']=='ot'")
public void consumeUser(String user) {
log.info("从Binding-{}收到User类型的消息-{}", CustomBinding.INPUT1, user);
// throw new RuntimeException("异常了");
}
/**
* 消息消费失败3次的降级处理逻辑 此种为同一条消息处理三次仍然异常的处理方法 并没有重新放入队列
*
* @param message
*/
@ServiceActivator(inputChannel = "test.demo-input-group.errors")
public void error(Message<?> message) {
Log.info("消费异常处理");
}
}
取消息为String ,修改为实体可自动接收
@EnableBinding( Sink.class)
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
注:尽量都注入容器方便管理
5:yml配置
生产者
spring:
cloud:
stream:
rocketmq:
binder:
name-server: ip:9876 //服务器连接地址
bindings:
output:
producer:
group: pro //生产者分组
bindings:
output:
destination: test //topic
content-type: application/json //数据格式
消费者
spring:
cloud:
stream:
rocketmq:
binder:
name-server: ip:9876
bindings:
input:
consumer:
broadcasting: true //是否开启广播模式 默认为false
bindings:
input:
destination: test //topic
group: group1 //消费者分组
content-type: application/json
注:topic 可以设置多个 消息过滤可设置多个 尽量设置了的头都进行过滤处理 可处理消息过滤和部分重复消费