Spring Cloud Stream 是一个构建消息驱动微服务的框架,应用程序通过input(相当于consumer)、output(相当于producer)来与Spring Cloud Stream中Binder交互,而Binder负责与消息中间件交互;因此,我们只需关注如何与Binder交互即可,而无需关注与具体消息中间件的交互。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-stream-binder-rabbit</artifactId> <version>2.1.2.RELEASE</version> </dependency> 复制代码
provider配置(采用动态路由键方式)
server: port: 7071 spring: cloud: stream: binders: pro: type: rabbit environment: spring: rabbitmq: addresses: localhost port: 5672 username: test password: test virtual-host: test bindings: myOutPut: destination: myOutPut content-type: application/json default-binder: test rabbit: bindings: myOutPut: producer: exchangeType: topic routing-key-expression: headers.routeId 复制代码
consumer配置
server: port: 7072 spring: cloud: stream: rabbit: bindings: input: consumer: bindingRoutingKey: routeKey1 acknowledge-mode: manual binders: protest: type: rabbit environment: spring: rabbitmq: addresses: localhost port: 5672 username: test password: test virtual-host: test bindings: input: destination: myOutPut content-type: application/json default-binder: protest group: group-cus1 复制代码
provider
public interface MqMessageSource {//自定义通道 String MY_OUT_PUT = "myOutPut"; @Output(MY_OUT_PUT) MessageChannel testOutPut(); } 复制代码
@EnableBinding(MqMessageSource.class) public class MessageProviderImpl implements IMessageProvider { @Autowired @Output(MqMessageSource.MY_OUT_PUT) private MessageChannel channel; @Override public void send(Company company) { channel.send(MessageBuilder.withPayload(company).setHeader("routeId", company.getTitle()).build()); } } 复制代码
@Component @EnableBinding(Sink.class) public class MessageListener { @StreamListener(Sink.INPUT) public void input(Message<Company> message) throws IOException { Channel channel = (com.rabbitmq.client.Channel)message.getHeaders().get(AmqpHeaders.CHANNEL); Long deliveryTag = (Long) message.getHeaders().get(AmqpHeaders.DELIVERY_TAG); channel.basicAck(deliveryTag, false); System.err.println(JSON.toJSONString(message.getPayload())); } } 复制代码