Stream使用rocketmq

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 可以设置多个 消息过滤可设置多个 尽量设置了的头都进行过滤处理 可处理消息过滤和部分重复消费

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值