1.导入相关依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2.编写配置文件
spring:
datasource:
username: root
password:
url: jdbc:mysql://
driver-class-name: com.mysql.cj.jdbc.Driver
rabbitmq:
host: 192.168.0.177
virtual-host: /
port: 5672
3.开启RabbitMQ
@EnableRabbit
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application .class, args);
}
}
4.编写测试代码
public class ApplicationTests {
@Autowired
AmqpAdmin amqpAdmin;
//amqpAdmin.declareExchange();//创建一个交换机
//amqpAdmin.declareQueue();//创建一个队列
//amqpAdmin.declareBinding();//创建一个绑定关系
@Test
public void createExchane() {
DirectExchange directExchange = new DirectExchange("hello-java-exchange",true,false);
amqpAdmin.declareExchange(directExchange);
log.info("Exchange创建成功");
}
@Test
public void createQueue() {
//String name, 队列名
// boolean durable, 是否持久化、Rabbit重启后数据还在
// boolean exclusive,是否排他,就是只有一个连接能连上,其他连接无法连接,一般不会设置
// boolean autoDelete,是否自动删除
// Map<String, Object> arguments 而外参数
Queue queue = new Queue("hello-java-queue",true,false,false);
amqpAdmin.declareQueue(queue);
log.info("queue创建成功");
}
@Test
public void createBinding() {
//String destination, 目的地
// Binding.DestinationType destinationType,目的地类型
//String exchange,交换机
// String exchange, String routingKey,路由键
// Map<String, Object> arguments 而外参数
Binding binding = new Binding("hello-java-queue", Binding.DestinationType.QUEUE,"hello-java-exchange","hello.java",null);
amqpAdmin.declareBinding(binding);
log.info("binding创建成功");
}
}
交换机创建成功!
队列创建成功!
绑定关系建立成功!
发送纯文本消息
@Test
public void sendMessageTest() {
String msg="Hello World";
rabbitTemplate.convertAndSend("hello-java-exchange","hello.java",msg);
log.info("消息发送成功!!!");
}
发送对象消息
创建实体类
@Data
public class TObject implements Serializable {
private static final long serializableUID=1L;
public String name;
public int age;
}
发送
@Test
public void sendMessageTest() {
TObject tObject = new TObject();
tObject.setName("TAO");
tObject.setAge(18);
rabbitTemplate.convertAndSend("hello-java-exchange", "hello.java", tObject);
log.info("消息发送成功!!!");
}
发送成功,这里是字节流,这里需要将发送的对象序列化一下,否则发实体类无法发送出去!
如果在多系统环境下光字符串和JAVA实体类对象是搞不定的,那么我们可以将对象转换为JSON!
序列化JSON消息
创建Rabbit序列化转换器
/**
* @description: Rabbit核心配置
* @author TAO
* @date 2020/8/4 20:48
*/
@Configuration
public class MyRabbitConfig {
//讲对象序列化为JSON
@Bean
public MessageConverter messageConverter(){
return new Jackson2JsonMessageConverter();
}
}
测试代码不动!
搞定!
消息接收
编写监听实现类
这个监听的方法必须在容器内!!!
@Service
public class RabbitImpl {
@RabbitListener(queues={"hello-java-queue"})
public void recieveMessage(Object message){
System.out.println("接收到消息=>"+message+"类型=>"+message.getClass());
}
}
使用上面写好的单元测试给hello-java-queue中发送消息
查看消息
接收成功!
直接获取消息内容
/**
*message-原生消息详细信息:message中包含消息头+消息体
* tObject-发送时的实体类数据
* channel-客户端的通道
* @param message
*/
@RabbitListener(queues={"hello-java-queue"})
public void recieveMessage(Message message, TObject tObject, Channel channel){
System.out.println("接收到消息=>"+message);
System.out.println("消息内容=>"+tObject);
}
在多消息情况下,消费端不是一次性接收所有消息,而是一条一条的消费!
一个队列中存在多种类型的消息
@Service
@RabbitListener(queues={"hello-java-queue"})//标注这个类可以监听这个队列中的所有消息
public class RabbitImpl {
//这个只接收消息类型为TObject1 的
@RabbitHandler
public void recieveMessage(Message message, TObject1 tObject1, Channel channel){
System.out.println("接收到消息=>"+message);
System.out.println("消息内容=>"+tObject1);
}
//这个只接收消息类型为TObject2的
@RabbitHandler
public void recieveMessage(Message message, TObject2 tObject2, Channel channel){
System.out.println("接收到消息=>"+message);
System.out.println("消息内容=>"+tObject2);
}
}