Java RabbitMQ配置和使用,基于SpringBoot

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package rabbitmq.demo;
 
import com.rabbitmq.client.AMQP;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.core.AmqpAdmin;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
 
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
 
@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {
 
    @Autowired
    RabbitTemplate rabbitTemplate;  //使用RabbitTemplate,这提供了接收/发送等等方法
 
    @Autowired
    AmqpAdmin amqpAdmin;
 
    /**
     * 创建交换器 Exchange
     */
    @Test
    public void createExchange() {
        // 创建Exchange 交换器
        amqpAdmin.declareExchange(new DirectExchange("amqpadmin.exchange"));
        System.out.println("创建Exchange完成");
        // 创建Queue 队列,持久化
        amqpAdmin.declareQueue(new Queue("amqpproduct", true));
        System.out.println("创建Queue完成");
        // 创建绑定规则
        amqpAdmin.declareBinding(new Binding("amqpproduct", Binding.DestinationType.QUEUE,
                "amqpadmin.exchange", "amqpproduct", null));
        System.out.println("创建绑定规则完成");
    }
 
    /**
     * 发送消息给RabbitMQ消息队列 发送单播 点对点的消息  direct方式
     */
    @Test
    public void rabbitMqSendTest() {
        String messageId = String.valueOf(UUID.randomUUID());
        String messageData = "test message, hello!";
        String createTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        Map<String, Object> map = new HashMap<>();
        map.put("messageId", messageId);
        map.put("messageData", messageData);
        map.put("createTime", createTime);
 
        //方式一  以默认序列化的方式发送,如用json的方式,写RabbitConfig文件
        rabbitTemplate.convertAndSend("myexchange.direct", "myproduct", map);
    }
 
    /**
     * 发送消息给RabbitMQ消息队列 广播方式  fanout方式
     */
    @Test
    public void rabbitMqSendTest2() {
        String messageId = String.valueOf(UUID.randomUUID());
        String messageData = "test message, hello!";
        String createTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        Map<String, Object> map = new HashMap<>();
        map.put("messageId", messageId);
        map.put("messageData", messageData);
        map.put("createTime", createTime);
 
        //fanout广播方式 不用填路由键 无效
        rabbitTemplate.convertAndSend("myexchange.fanout", "", map);
    }
 
    /**
     * 从RabbitMQ接收消息
     */
    @Test
    public void rabbitMqGetTest() {
        //收取消息成功后,会从相对应的消息队列里删除该消息
        Object o = rabbitTemplate.receiveAndConvert("myproduct");
        System.out.println("接收的消息队列数据类型:" + o.getClass());
        System.out.println("接收的消息队列数据:" + o.toString());
    }
 
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package rabbitmq.demo.config;
 
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
@Configuration
public class RabbitConfig {
 
    /**
     * 用json方式替换默认的序列化
     * @return
     */
    @Bean
    public MessageConverter messageConverter()
    {
        return  new Jackson2JsonMessageConverter();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package rabbitmq.demo.service;
 
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;
 
@Service
public class RabbitListenerService {
    /**
     * 添加监听器,自动获取消息队列信息
     * @param o
     */
    @RabbitListener(queues = {"myproduct","myproduct","myarticle.new"})  //可监听多个queue
    public  void  rabbitMqListenerReceive(Object o){
        // 需要在启动入口添加 @EnableRabbit   开启基于注解的rabbitMQ模式
        System.out.println("接收的消息队列数据类型:" + o.getClass());
        System.out.println("接收的消息队列数据:" + o.toString());
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#application.yml
server:
  port: 8080
spring:
  #给项目来个名字
  application:
    name: rabbitmq-provider
  #配置rabbitMq 服务器
  rabbitmq:
    host: 139.199.162.126
    port: 5672
    username: xxxx
    password: xxxx
    #虚拟host 可以不设置,使用server默认host
    #virtual-host: JCcccHost
1
2
3
4
5
<!--rabbitmq-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

 

posted @   深南大道  阅读(3450)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示