rabbitmq第五篇:spring集成rabbitmq

lpeiNet      2022-02-07     537

关键词:

   前面几篇讲解了如何使用rabbitMq,这一篇主要讲解spring集成rabbitmq。

   首先引入配置文件org.springframework.amqp,如下

        <dependency>
            <groupId>org.springframework.amqp</groupId>
            <artifactId>spring-rabbit</artifactId>
            <version>1.6.0.RELEASE</version>
        </dependency>

一:配置消费者和生成者公共部分

<rabbit:connection-factory id="connectionFactory" host="${rabbit.hosts}"
                               port="${rabbit.port}" username="${rabbit.username}" password="${rabbit.password}" virtual-host="${rabbit.virtualHost}"
                               channel-cache-size="50"/>
    <rabbit:admin connection-factory="connectionFactory"/>
    <!--定义消息队列-->
    <rabbit:queue name="spittle.alert.queue.1" durable="true" auto-delete="false"/>
    <rabbit:queue name="spittle.alert.queue.2" durable="true" auto-delete="false"/>
    <rabbit:queue name="spittle.alert.queue.3" durable="true" auto-delete="false"/>
    <!--绑定队列-->
    <rabbit:fanout-exchange id="spittle.fanout" name="spittle.fanout" durable="true">
        <rabbit:bindings>
            <rabbit:binding queue="spittle.alert.queue.1"></rabbit:binding>
            <rabbit:binding queue="spittle.alert.queue.2"></rabbit:binding>
            <rabbit:binding queue="spittle.alert.queue.3"></rabbit:binding>
        </rabbit:bindings>
    </rabbit:fanout-exchange>

二:配置生成者

<import resource="amqp-share.xml"/>
    <!--创建消息队列模板-->
    <rabbit:template id="rabbitTemplate" connection-factory="connectionFactory"
                     exchange="spittle.fanout" message-converter="jsonMessageConverter">
    </rabbit:template>
    <bean id="jsonMessageConverter" class="org.springframework.amqp.support.converter.JsonMessageConverter"></bean>

三:生产者程序

public class Spittle implements Serializable {
    private Long id;
    private Spitter spitter;
    private String message;
    private Date postedTime;

    public Spittle(Long id, Spitter spitter, String message, Date postedTime) {
        this.id = id;
        this.spitter = spitter;
        this.message = message;
        this.postedTime = postedTime;
    }

    public Long getId() {
        return this.id;
    }

    public String getMessage() {
        return this.message;
    }

    public Date getPostedTime() {
        return this.postedTime;
    }

    public Spitter getSpitter() {
        return this.spitter;
    }
}
public class ProducerMain {
    public static void main(String[] args) throws Exception {
        ApplicationContext context = new ClassPathXmlApplicationContext("amqp/amqp-producer.xml");
        AmqpTemplate template = (AmqpTemplate) context.getBean("rabbitTemplate");
        for (int i = 0; i < 20; i++) {
            System.out.println("Sending message #" + i);
            Spittle spittle = new Spittle((long) i, null, "Hello world (" + i + ")", new Date());
            template.convertAndSend(spittle);
            Thread.sleep(5000);
        }
        System.out.println("Done!");
    }
}

其中convertAndSend方法默认第一个参数是交换机名称,第二个参数是路由名称,第三个才是我们发送的数据,现在我们启动程序,效果如下

第四个:消费者程序

首先编写一个用于监听生产者发送信息的代码

/**
 * Created by Administrator on 2016/11/18.
 */
public class SpittleAlertHandler implements MessageListener {
    @Override
    public void onMessage(Message message) {
        try {
            String body=new String(message.getBody(),"UTF-8");
            System.out.println(body);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
}

一定要注意实现MessageListener,我们只需要获取message的body即可,通过json来转换我们需要的程序(比如我们可以发送一个map,map存放方法和实体,这样我们可以通过反射来调用不同的程序来运行)。

下面我们配置消费者

 

<import resource="amqp-share.xml"/>
    <rabbit:listener-container connection-factory="connectionFactory">
      <rabbit:listener ref="spittleListener" method="onMessage" queues="spittle.alert.queue.1,spittle.alert.queue.3,spittle.alert.queue.2"/>
    </rabbit:listener-container>
    <bean id="spittleListener" class="com.lp.summary.rabbitmq.impl.SpittleAlertHandler"/>

其中spittleListener是监听的程序,method是执行的方法,queues是我们监听的队列,多个队列可以逗号隔开(因为我们采用的是分发,所以三个队列获取的消息是相同的,这里为了简便我放在一个监听程序中了,其实我们可以写三个消费者,每个消费者监听一个队列)

现在只需要启动程序即可运行

public class ConsumerMain {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("amqp/amqp-consumer.xml");
    }
}

 当然direct跟上面的情况差不多,只不过这个是根据路由匹配,先把数据发送到交换机,然后绑定路由和队列,通过交换机id和路由来找到队列,下面是一些主要的配置

 <rabbit:queue id="spring-test-queue1" durable="true" auto-delete="false" exclusive="false" name="spring-test-queue1"></rabbit:queue>
    <rabbit:queue name="spring-test-queue2" durable="true" auto-delete="false" exclusive="false"></rabbit:queue>
    <!--交换机定义-->
    <!--rabbit:direct-exchange:定义exchange模式为direct,
        意思就是消息与一个特定的路由键完全匹配,才会转发。
        rabbit:binding:设置消息queue匹配的key-->
    <rabbit:direct-exchange name="${rabbit.exchange.direct}" durable="true" auto-delete="false" id="${rabbit.exchange.direct}">
        <rabbit:bindings>
            <rabbit:binding queue="spring-test-queue1" key="spring.test.queueKey1"/>
            <rabbit:binding queue="spring-test-queue2" key="spring.test.queueKey2"/>
      </rabbit:bindings>
    </rabbit:direct-exchange>

    <!--spring template声明-->
    <rabbit:template exchange="${rabbit.exchange.direct}" id="rabbitTemplate" connection-factory="connectionFactory"
    message-converter="jsonMessageConverter"></rabbit:template>
    <!--消息对象转成成json-->
    <bean id="jsonMessageConverter" class="org.springframework.amqp.support.converter.JsonMessageConverter"></bean>

下面是消费者监听配置

 <rabbit:listener-container connection-factory="connectionFactory" acknowledge="auto">
        <rabbit:listener queues="spring-test-queue1" method="onMessage" ref="queueListenter"></rabbit:listener>
    </rabbit:listener-container>
    <rabbit:listener-container connection-factory="connectionFactory" acknowledge="auto">
        <rabbit:listener queues="spring-test-queue2" method="onMessage" ref="queueListenter"></rabbit:listener>
    </rabbit:listener-container>

下面是程序

 public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext-rabbitmq-producer.xml");
        MQProducer mqProducer=(MQProducer) context.getBean("mqProducer");
        mqProducer.sendDateToQueue("spring.test.queueKey1","Hello World spring.test.queueKey1");
        mqProducer.sendDateToQueue("spring.test.queueKey2","Hello World spring.test.queueKey2");
    }

实际情况可能需要我们去分离消费者和生成者的程序。当然spring还有负载均衡的配置,这里就不多介绍了。

 

rabbitmq简介(代码片段)

安装RabbitMQRabbitMQ是用Erlang开发的,所以需要先安装Erlang环境,在这里下载对应系统的Erlang安装包进行安装点击这里下载对应平台的RabbitMQ安装包进行安装编写生产者和消费者Spring对RabbitMQ已经进行了封装,正常使用中,会使用Spri... 查看详情

第五篇:springboot整合mybatis

前言  前面两篇文章和读者聊了SpringBoot中最简单的数据持久化方案JdbcTemplate,JdbcTemplate虽然简单,但是用的并不多,因为它没有MyBatis方便,在Spring+SpringMVC中整合MyBatis步骤还是有点复杂的,要配置多个Bean,SpringBoot中对此做了... 查看详情

rabbitmq第四篇:spring集成rabbitmq

  前面几篇讲解了如何使用rabbitMq,这一篇主要讲解spring集成rabbitmq。  首先引入配置文件org.springframework.amqp,如下<dependency><groupId>org.springframework.amqp</groupId><artifactId>spring 查看详情

第五篇:springcloudeureka权限认证

参考技术AEureka注册中心的管理界面以及服务注册时,没有任何认证机制,如果这个地址有公网IP的话,必然能直接访问到,这样是不安全的,安全性比较差,如果其它服务恶意注册一个同名服务,但是实现不同,可能就有风险了... 查看详情

第五篇:常用模块

第五篇:常用模块   PYTHON-模块time&datetime+目录规范PYTHON-模块-time&datetime-练习+目录规范PYTHON-模块sysosrandomshutilPYTHON-模块sysosrandomshutil-练习PYTHON-模块jsonpickleshelvexmlPYTHON-模块logginghashlibPY 查看详情

spring集成rabbitmq

mq.propertiesmq.host=主机ipmq.username=adminmq.password=admin123mq.port=5672mq.queue.vip=test-queuemq.exchange=test-exchangemq.vhost=testspring-rabbitmq.xml<?xmlversion="1.0"encoding="UTF-8"?>< 查看详情

Spring 集成 pubsub 与 Spring amqp RabbitMQ pubsub

】Spring集成pubsub与SpringamqpRabbitMQpubsub【英文标题】:SpringintegrationpubsubvsSpringamqpRabbitMQpubsub【发布时间】:2015-12-2402:24:51【问题描述】:我正在开发一个MicroBlogspringmvchibernate应用程序。我需要实现像twitter这样的发布订阅功能。我... 查看详情

关于ajax第五篇

AJAX-服务器 响应如需获得来自服务器的响应,请使用XMLHttpRequest对象的responseText或responseXML属性。AJAX- onreadystatechange 事件当请求被发送到服务器时,我们需要执行一些基于响应的任务。每当readyState改变时,就会触发onr... 查看详情

rabbitmq之与spring集成

Maven配置<dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>3.6.0</version></dependency><dependency><groupId 查看详情

rabbitmq安装和使用(和spring集成)

一、安装RabbitMQ    RabbitMQ是建立在强大的ErlangOTP平台上,因此安装RabbitMQ的前提是安装Erlang。通过下面两个连接下载安装3.2.3版本:下载并安装 EralngOTPForWindows (vR16B03)运行安装 RabbitMQServerWindowsInstaller (v3.2.3)具... 查看详情

第五篇uber启动视频播放

importUIKitimportAVFoundationclassGuidePage:FxBasePage{@IBOutletvarbackImageView:UIImageView?varplayer:AVPlayer!varplayerItem:AVPlayerItem!varlocation:FxLocation!overrideinit(nibNamenibNameOrNil:Strin 查看详情

rabbitmq及spring集成

...转载自https://blog.csdn.net/whoamiyang/article/details/549547801.背景RabbitMQ是一个由erlang开发的AMQP(AdvanvedMessageQueue)的开源实现。2.应用场景2.1异步处理场景说明:用户注册后,需要发注册邮件和注册短信,传统的做法有两种1.串行的方式;2.并... 查看详情

第五篇vggnet——论文翻译

文章目录摘要1引言2ConvNet配置2.1架构2.2配置2.3讨论3分类框架3.1训练3.2测试3.3实现细节 查看详情

第五篇vggnet——论文翻译

文章目录摘要1引言2ConvNet配置2.1架构2.2配置2.3讨论3分类框架3.1训练3.2测试3.3实现细节 查看详情

htmldom第五篇

通过HTMLDOM,JavaScript能够访问HTML文档中的每个元素。HTMLDOM允许您在事件发生时执行代码。当HTML元素"有事情发生"时,浏览器就会生成事件:在元素上点击加载页面改变输入字段添加、删除和替换HTML元素HTMLDOM允许JavaScript对HTML事... 查看详情

第五篇高可用配置中心config-server(svn版)(代码片段)

一新建module引入config-server依赖<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artifactId></dependency&g 查看详情

消息中间件系列四:rabbitmq与spring集成

一、RabbitMQ与Spring集成 准备工作:分别新建名为RabbitMQSpringProducer和RabbitMQSpringConsumer的mavenweb工程 在pom.xml文件里面引入如下依赖:<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/20 查看详情

开始写游戏---第五篇

开始写游戏---第五篇  今天写了一个这个组件:        代码:          用的时候这么用:               这是组件的运行效果:      写是写好了。。。但是我发现,之前写... 查看详情