Spring Cloud Stream 搭配RabbitMQ实现消息生产者和消费者

684 阅读1分钟

1. 先引入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>

2. 在配置文件中进行配置

spring:
  # 配置rabbitmq连接信息
  rabbitmq:
    host: 192.168.10.233
    port: 5672
    username: admin
    password: admin
    virtual-host: my-project-dev
  cloud:
    stream:
      bindings: # 绑定通道和交换机
        myOutput: # 定义生产者的通道
          destination: streamExchange #自定义交换机的名字
        myInput: # 定义消费者通道
          destination: streamExchange
          # 通过分组避免消息被重复消费,以及实现消息的持久化
          group: group1

3. 实现消息生产者

  • 构建消息通道接口
import org.springframework.cloud.stream.annotation.Input;
import org.springframework.cloud.stream.annotation.Output;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.SubscribableChannel;
import org.springframework.stereotype.Component;

/**
 * 声明构建通道channel
 */
@Component
public interface MyStreamChannel {

    String OUTPUT = "myOutput";
    String INPUT = "myInput";

    /**
     * 消息生产
     *
     * @return
     */
    @Output(MyStreamChannel.OUTPUT)
    MessageChannel output();

    /**
     * 消息消费
     *
     * @return
     */
    @Input(MyStreamChannel.INPUT)
    SubscribableChannel input();

}
  • 创建发送消息接口
/**
 * 发送消息接口
 */
public interface StreamService {

    /**
     * 发送消息操作
     */
    public void sendMsg();

}
  • 实现发送消息功能
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Component;

/**
 * 开启绑定器,绑定通道channel
 */
@Component
@EnableBinding(MyStreamChannel.class)
public class StreamServiceImpl implements StreamService {

    @Autowired
    private MyStreamChannel myStreamChannel;

    @Override
    public void sendMsg() {
        AppUser user = new AppUser();
        user.setId("1001");
        user.setNickname("Tom");
        // 发送消息给mq
        myStreamChannel.output().send(MessageBuilder.withPayload(user).build());
    }
}

这里需要通过注解 @EnableBinding(MyStreamChannel.class) 绑定到对应的channel上

send()方法参数 Message 是泛型,任何类型的消息数据都可以

image.png

4. 实现消息消费者

import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.stereotype.Component;

/**
 * 消息消费端
 */
@Component
@EnableBinding(MyStreamChannel.class)
public class MyStreamConsumer {

    /**
     * 监听并且实现消息的消费
     *
     * @param user {@link AppUser}
     */
    @StreamListener(MyStreamChannel.INPUT)
    public void receiveMsg(AppUser user) {
        // 实现具体的业务逻辑
        System.out.println(user.getId());
        System.out.println(user.getNickname());
    }

}

这里也是需要通过注解 @EnableBinding(MyStreamChannel.class) 绑定到对应的channel上

5. 通过接口测试一下

@RestController
@RequestMapping("/hello")
public class HelloController{

    @Autowired
    private StreamService streamService;

    @GetMapping("/stream")
    public String stream() {
        streamService.sendMsg();
        return "send ok!";
    }

}