JAVA消息(第二篇)AMQP-RabbitMQ实战

 

 JMS,实际上就是java消息的基础,本篇讲解一下AMQP(Advanced Message Queuing Protocol)高级的消息队列,哈哈哈你说他高级,并不显得JMS低级啊,都很好~~~。

        多嘴一句,了解JMS就基本了解AcctiveMq上一篇的demo也是AcctiveMq的,本篇AMQP就是RabbitMq

        首先讲下AMQP是什么啊,既然说他是wire-level protocol,个人觉得:

        1.AMQP规范了线路层消息的格式

        2.因为消息格式的规范实现了客户端和消息队列互通能力

        3.AMQP优于JMS提供了更多中的发送方法(因为加入了Exchange,后面会讲)

        4.并且因为加入了Exchange,实现了生产者与队列解耦

第一。AMQP

        这里我们就不会回忆JMS消息模式了,不太清楚的请点击到上一篇了解jMS基础

       AMQP在消息的生产者以及传递信息的队列之间引入了一种间接的机制:Exchange。直接上图不BB:

        

与JMS不同,AMQP是直接把消息发不到Exchange上,Exchange会绑定一个过多个队列上,让负责将信息路由到队列上,然后结尾还是一样消费者从队列拿消息消费。

        所以说!!!重点来了!!!重点什么呢?重点是什么呢?

        问的好!!AMQP的重点就是Exchange!!!!(此处需要掌声!!)

AMQP提供四种不同类型的Exchange

        重点1.不管是哪种Exchange,当消息进入Exchange的时候,Exchange会对消息根据当前的种类的算法,生成一个ruting key 和参数,然后在与binding的队列的routing key和参数进行比较。当满足当前Exchange的算法时,才会将消息放在队列上!!!

        重点2.四个标准的AMQP Exchange如下所示:

                Direct:当消息的routing key 与 binding 的 routing key 直接匹配,消息路由到该队列

                Topic:   当消息routing key 与 binding 的 routing key 符合通配符匹配,消息路由到该队列(请百度通配符匹配)

                Headers:  当消息参数表中的头信息和值都与 binding参数表中匹配的话,消息路由到该队列

                Fanout: 任何消息直接匹配到所有队列上

第二。RabbitMQ

        RabbitMQ实现了AMQP,而spring AMQP又为RabbitMQ提供了支持,那我就值节贴一个RabbitMQ的实战代码

        下面代码是被应用到一个spring cloud里面的RabbitMQ:

首先不管是生产者和消费者都需要连接到RabbitMQ的服务上:

#Rabbitmq Config
spring.rabbitmq.host=192.111.111.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=admin

在到就是服务端,也就是生产者

在spring cloud项目中直接,注入AmqpTemplet对象即可,你看看!!你看 !!Amqp模版!!

有需要再深入源码的私聊我

@Resource private AmqpTemplate amqpTemplate;
//直接调用即可,这里用用到的是convertAndSend
 
//第一个参找到目的地的key,第二个参数,value就是你需要传递的对象
amqpTemplate.convertAndSend(“你自己合计传啥”,“对的我是对象”);

converAndSend是咋回事呢?一下来自Spring 官网的解释,还有其他方法:点击打开链接

Send the given object to the specified destination, converting the object to a NMS message with a configured IMessageConverter.

接下来,与Acctive不同的是,你需要真的建立一个队列,且和你生产者所需要的目的地KEY相同

这个方法需要再容器初始化时候加载,所以其对象需要加入标签

   
@Configuration
public class RabbitConfig {
@Bean
    public Queue accountAuthJpush(){return new Queue(“你自己合计传啥”);}

 最后就是消费者的代码了

@RabbitListener(queues = "你自己合计传啥")"
public class AccountAuthReceiver {
    @RabbitHandler
    public void process(String systemNo){
        System.out.pringtln(systemNo);//这时候打印的就是你传给送的对象
    }
}

猜你喜欢

转载自blog.csdn.net/syq8023/article/details/89846094