1.依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
定义一个接口:
package van.client.rabbit;
import org.springframework.cloud.stream.annotation.Input;
import org.springframework.cloud.stream.annotation.Output;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.SubscribableChannel;
/**
* @author Van
* @date 2020/4/11 - 11:53
*/
public interface RabbitClient {
@Input("MyMessage")
SubscribableChannel input();
@Output("MyMessage")
MessageChannel output();
}
3.定义一个接收者
package van.client.rabbit;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.stereotype.Component;
/**
* @author Van
* @date 2020/4/11 - 11:55
*/
@Component
@EnableBinding(RabbitClient.class)
@Slf4j
public class StreamReceiver {
@StreamListener("MyMessage")
public void message(Object msg){
log.info("receive message:{}",msg);
}
}
4.使用接口发送消息
package van.client.controller;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import van.client.rabbit.RabbitClient;
import javax.annotation.Resource;
/**
* @author Van
* @date 2020/4/11 - 12:01
*/
@RestController
@RequestMapping("/rabbit")
public class RabbitController {
@Resource
private RabbitClient rabbitClient;
@RequestMapping("/msg")
public void msg(){
String msg="rabbit message";
rabbitClient.output().send(MessageBuilder.withPayload(msg).build());
}
}
启动项目,访问localhost:8080/rabbit/msg
会看到:
其他:
1**.集群环境下:**
当开启多个此项目时,会相应的建立多个名为MyMessage的队列,而且发送一次消息,所有队列都会收到消息,这当然不是想要的结果。如何做到发送一次消息,只让一个项目收到?
在配置文件加入:spring.cloud.stream.bindings.MyMessage.group=client
相当于给所有的集群都归为一个组,他们共享一个名为client的queue。
当发送一个消息的时候只会有一个项目收到。
2.若发送的msg是一个java object,并且我想在queue中看到积累的消息。
不做任何处理的话,在queue中看到的是一个不知道什么鬼的字符串(用base64加密过的),那么我想看到一个序列化的java object该怎么办呢?
在配置文件中加入:
spring.cloud.stream.bindings.MyMessage.content-type=application/json
注意MyMessage这里都是自定义的,其实写成啥都可以。
如果receiver想再发条消息,代表已经消息确认,可以加@SentTo()
进阶可以看:这篇博客