农妇山泉一亩田 发表于 2024-8-17 13:25:27

java操作RabbitMQ速通

docker部署rabbitMQ

由于常规的rabbitMQ部署需要配置很多依赖,而且容易因为版本的问题而导致部署失败,所以这里采用docker部署方式,不认识docker部署的可以看下面这篇文章:
Docker部署基础快速入门-CSDN博客
拉取镜像

docker pull rabbitmq:management 如果出现因网络而拉取失败的可以参考以下文章:
2024 最新docker仓库镜像,6月,7月_最新docker镜像源-CSDN博客
启动容器

docker run -e RABBITMQ_DEFAULT_USER=root
-e RABBITMQ_DEFAULT_PASS=1234
-v mq-plugins:/plugins
--name mq3
-p 15672:15672
-p 5672:5672
-d rabbitmq:management 如果出现启动容器后容器立刻关闭可以参考以下文章:
docker启动容器之后立刻又自动关闭了_docker 容器 启动又秒退-CSDN博客
如果还不行,就查抄容器日志:
docker logs 容器名 如果出现下面的报错:
Failed to create thread: Operation not permitted (1) 可以在启动容器的下令中参加以下下令:
--privileged=true 启动成功后检察运行的容器:
docker ps  成功后显示:
https://i-blog.csdnimg.cn/direct/3ad45e261631429fa32f42ad709d488a.png
访问http://localhost:15672/显示:
https://i-blog.csdnimg.cn/direct/806dc0fecfad41f88760302cd5990535.png

rabbitMQ数据隔离

一个rabbitMQ服务下可能有多个消耗者和生产者,不同的服务之间需要举行数据隔离,我们可以通过在rabbitMQ主机中创建虚拟主机来实现数据隔离
创建一个用户: 

https://i-blog.csdnimg.cn/direct/1bf4be63b68e4e0e9d82fda4d17c6013.png利用创建的用户再次登录后为该用户创建一个虚拟主机:

https://i-blog.csdnimg.cn/direct/3f5c903b030141b3b2dd9e0df0c58da4.png
如许一来,不同的用户访问各自的虚拟主机,服务之间的数据也就隔离开来了。 
Spring AMQP

Spring AMQP (Asynchronous Message Passing Protocol) 是 Spring Framework 的一个扩展模块,用于简化基于 AMQP (Advanced Message Queuing Protocol) 的消息中间件(如 RabbitMQ)的集成。
pom.xml引入依赖

      <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
      </dependency> yml配置

消耗者端
spring:
application:
   name: consumer

rabbitmq:
   host: localhost
   port: 5672
   virtual-host: /demo #主机下的虚拟机名
   username: root2
   password: 1234 生产者端
spring:
application:
   name: producer

rabbitmq:
   host: localhost
   port: 5672
   virtual-host: /demo #主机下的虚拟机名
   username: root2
   password: 1234 消息推送和接收

在rabbitMQweb端创建一个队列:

https://i-blog.csdnimg.cn/direct/99fdcf718442446e9b1c05f0b9f85155.png
 消息推送:

测试样例:
@SpringBootTest
class Demo1ApplicationTests {
    @Resource
    private RabbitTemplate rabbitTemplate;
    @Test
    void contextLoads() {
         String QueueName="demo.queue";
         String msg="hello rabbitmq";
         rabbitTemplate.convertAndSend(QueueName,msg);
    }

} 消息接收:
创建一个监听器类:
样比方下:
@Component
public class RabbbitmqDemo {

    @RabbitListener(queues = "demo.queue")
    public void receiveMsg(String msg){
      System.out.println(msg);
    }

}  先运行生产者后运行消耗者,运行效果如下:
https://i-blog.csdnimg.cn/direct/b2dbcafa2a3e4a9fa680564d49449d42.png
work模子

work模子简而言之就是多个消耗者绑定一个队列,从而提高消息处理处罚的速率,
https://i-blog.csdnimg.cn/direct/853d2e64a1504c159712fa037a8da1eb.png
 同时要记得在yml文件中配置以下信息,否则就会出现一个快的消耗者和一个慢的消耗者同时拉取到雷同数目标消息,正常的情况应该是快的处理处罚的消息要多,如许才能充实利用起多个消耗者协同合作的性能:
spring:
application:
   name: consumer

rabbitmq:
   host: localhost
   port: 5672
   virtual-host: /demo #主机下的虚拟机名
   username: root2
   password: 1234   listener:       simple:         prefetch: 1 #每次只能获取一条消息,处理处罚完才能获取下一条消息 交换机

以上消息推送和接收均是访问队列,而在实际的开发中是先访问交换机后,由交换机来转发消息给队列,常见的交换机有以下几种: 
fanout

一个交换机分发给多个队列:
https://i-blog.csdnimg.cn/direct/539f8c0095b847f996b27db7279071b8.png
direct

也就是每个队列都会与一个key相干联,好比我有一个付出业务,那么这个业务就可以将消息发送给所有与"pay"(实际的key要在向交换机中添加队列时自定义)绑定的队列
https://i-blog.csdnimg.cn/direct/316795020a95476899e3e7bf96a4b627.png
topic

topic与direct最大的不同就是它可以根据通配符绑定好比在发送消息时绑定key=“pay.#”,那么消息就会发送给所有和雷同于("pay.red","pay.yellow","pay.blue")的关键词绑定的队列
https://i-blog.csdnimg.cn/direct/749818171e874dd388bb19173cbcae1d.png
在java中定义交换机和队列

在rabbitmq网页端定义交换机和队列,难免有些贫苦,下面提供了一种在java代码中定义交换机和队列的方式:
这里只需要在消耗者监听器上添加以下的注解,如果是fanout交换机,那么就可以省略key的定义(此注解为样例实际需要本身根据模板定义):
    @RabbitListener(bindings = @QueueBinding(
            value=@Queue(name="队列名",durable = "true"可持久化设置,true代表开启),
            exchange = @Exchange(name="交换机名",type = ExchangeTypes.DIRECT 交换机类型),
            key={"red","yellow"}和队列绑定的key
    )) 然后在生产者端定义交换机名和key就可以发送到特定的队列中,如果是fanout交换机,那么就可以省略key的定义
@SpringBootTest
class Demo1ApplicationTests {
    @Resource
    private RabbitTemplate rabbitTemplate;
    @Test
    void contextLoads() {
      String ExchangeName="交换机名";
      String msg="hello rabbitmq";
      rabbitTemplate.convertAndSend(ExchangeName,"key的名称",msg);
    }

} 消息转换器

除了字符串范例的对象,可能在实际开发中还需要其他的对象消息好比User,Map等,这个时候要想在消息队列中存储这些对象的json格式就需要用到消息转换器来实现转换,配置消息转换器的步调如下:

https://i-blog.csdnimg.cn/direct/08dd0579bdaa497592eae8639f8bc118.png


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: java操作RabbitMQ速通