程序整体结构

Maven依赖

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.test</groupId>
<artifactId>springrabbitmq</artifactId>
<version>0.0.1-SNAPSHOT</version> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- log4j日志文件管理包版本 -->
<slf4j.version>1.7.7</slf4j.version>
<log4j.version>1.2.17</log4j.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>3.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>3.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>3.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>3.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>3.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>3.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>3.2.8.RELEASE</version>
</dependency> <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version> 3.2.8.RELEASE </version>
<scope>provided</scope>
</dependency> <!--rabbitmq依赖 -->
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
<version>1.3.5.RELEASE</version>
</dependency>
<!-- log start -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- 格式化对象,方便输出日志 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.41</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- log end -->
</dependencies>
</project>

application.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"> <import resource="classpath*:rabbitMQ.xml" /> <!-- 扫描指定package下所有带有如@controller,@services,@resource,@ods并把所注释的注册为Spring Beans -->
<context:component-scan base-package="com.gm.consumer, com.gm.producer" /> <!-- 激活annotation功能 -->
<context:annotation-config />
<!-- 激活annotation功能 -->
<context:spring-configured /> </beans>

rabbitMQ.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rabbit="http://www.springframework.org/schema/rabbit"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/rabbit
http://www.springframework.org/schema/rabbit/spring-rabbit-1.2.xsd"> <!-- RabbitMQ公共配置部分 start --> <!--配置connection-factory,指定连接rabbit server参数 -->
<rabbit:connection-factory id="connectionFactory"
virtual-host="/" username="admin" password="123456" host="127.0.0.1"
port="5672" /> <!--通过指定下面的admin信息,当前producer中的exchange和queue会在rabbitmq服务器上自动生成 -->
<rabbit:admin id="connectAdmin" connection-factory="connectionFactory" /> <!-- RabbitMQ公共配置部分 end --> <!-- ~~~~~~~~~~~~~~~~~~~~~华丽的分割线~~~~~~~~~~~~~~~~~~~~~~~~~~ --> <!-- 定义 direct方式的exchange、队列、消息收发 start --> <!--定义queue -->
<rabbit:queue name="direct_queue_test" durable="true"
auto-delete="false" exclusive="false" declared-by="connectAdmin" /> <!-- 定义direct exchange,绑定direct_queue_test -->
<rabbit:direct-exchange name="exchange_direct"
durable="true" auto-delete="false" declared-by="connectAdmin">
<rabbit:bindings>
<rabbit:binding queue="direct_queue_test" key="direct_queue_key"></rabbit:binding>
</rabbit:bindings>
</rabbit:direct-exchange> <!--定义rabbit template用于数据的接收和发送 -->
<rabbit:template id="directAmqpTemplate"
connection-factory="connectionFactory" exchange="exchange_direct" /> <!-- 消息接收者 -->
<bean id="directMessageReceiver" class="com.gm.consumer.DirectMessageReceiver"></bean> <!-- queue litener 观察 监听模式 当有消息到达时会通知监听在对应的队列上的监听对象 -->
<rabbit:listener-container
connection-factory="connectionFactory">
<rabbit:listener queues="direct_queue_test" ref="directMessageReceiver" />
</rabbit:listener-container> <!-- 定义 direct方式的exchange、队列、消息收发 end --> <!-- ~~~~~~~~~~~~~~~~~~~~~华丽的分割线~~~~~~~~~~~~~~~~~~~~~~~~~~ --> <!-- 定义 topic方式的exchange、队列、消息收发 start --> <!--定义queue -->
<rabbit:queue name="topic_queue_test" durable="true"
auto-delete="false" exclusive="false" declared-by="connectAdmin" /> <!--定义topic类型exchange,绑定direct_queue_test -->
<rabbit:topic-exchange name="exchange_topic">
<rabbit:bindings>
<rabbit:binding queue="topic_queue_test" pattern="log.#" />
</rabbit:bindings>
</rabbit:topic-exchange> <!--定义rabbit template用于数据的接收和发送 -->
<rabbit:template id="topicAmqpTemplate"
connection-factory="connectionFactory" exchange="exchange_topic" /> <!-- 消息接收者 -->
<bean id="topicMessageReceiver" class="com.gm.consumer.TopicMessageReceiver"></bean> <!-- queue litener 观察 监听模式 当有消息到达时会通知监听在对应的队列上的监听对象 -->
<rabbit:listener-container
connection-factory="connectionFactory">
<rabbit:listener queues="topic_queue_test" ref="topicMessageReceiver" />
</rabbit:listener-container> <!-- 定义 topic方式的exchange、队列、消息收发 end --> <!-- ~~~~~~~~~~~~~~~~~~~~~华丽的分割线~~~~~~~~~~~~~~~~~~~~~~~~~~ --> <!-- 创建rabbitTemplate 消息模板类 -->
<bean id="rabbitTemplate" class="org.springframework.amqp.rabbit.core.RabbitTemplate">
<constructor-arg ref="connectionFactory"></constructor-arg>
</bean> <rabbit:queue name="default_queue" durable="true"
auto-delete="false" exclusive="false" declared-by="connectAdmin" /> <!-- 消息接收者 -->
<bean id="defaultMessageReceiver" class="com.gm.consumer.DefaultMessageReceiver"></bean> <!-- queue litener 观察 监听模式 当有消息到达时会通知监听在对应的队列上的监听对象 -->
<rabbit:listener-container
connection-factory="connectionFactory">
<rabbit:listener queues="default_queue" ref="defaultMessageReceiver" />
</rabbit:listener-container>
</beans>

exchange的direct消费者

DirectMessageReceiver.java

package com.gm.consumer;

import java.io.UnsupportedEncodingException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageListener; public class DirectMessageReceiver implements MessageListener {
private Logger logger = LoggerFactory.getLogger(DirectMessageReceiver.class); public void onMessage(Message message) { logger.info("consumer receive message------->:{}", message);
String body;
try {
body = new String(message.getBody(), "UTF-8");
System.out.println("consumer receive message------->"+body);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} } }

exchange的topic消费者

TopicMessageReceiver.java

package com.gm.consumer;

import java.io.UnsupportedEncodingException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageListener;
import org.springframework.stereotype.Component; @Component
public class TopicMessageReceiver implements MessageListener {
private Logger logger = LoggerFactory.getLogger(TopicMessageReceiver.class); public void onMessage(Message message) { logger.info("consumer receive message------->:{}", message);
String body;
try {
body = new String(message.getBody(), "UTF-8");
System.out.println("consumer receive message------->" + body);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} } }

简单队列消费者

DefaultMessageReceiver.java

package com.gm.consumer;

import java.io.UnsupportedEncodingException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageListener; public class DefaultMessageReceiver implements MessageListener {
private Logger logger = LoggerFactory.getLogger(DefaultMessageReceiver.class); public void onMessage(Message message) { logger.info("consumer receive message------->:{}", message);
String body;
try {
body = new String(message.getBody(), "UTF-8");
System.out.println("consumer receive message------->"+body);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} } }

exchange的direct生产者

DirectMessageProducer.java

package com.gm.producer;

import java.io.IOException;

import javax.annotation.Resource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Service; @Service
public class DirectMessageProducer {
private Logger logger = LoggerFactory.getLogger(DirectMessageProducer.class); @Resource(name = "directAmqpTemplate")
private AmqpTemplate directAmqpTemplate; public void sendMessage(Object message) throws IOException {
logger.info("to send message:{}", message);
directAmqpTemplate.convertAndSend("direct_queue_key", message);
}
}

exchange的topic生产者

TopicMessageProducer.java

package com.gm.producer;

import java.io.IOException;

import javax.annotation.Resource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Service; @Service
public class TopicMessageProducer {
private Logger logger = LoggerFactory.getLogger(TopicMessageProducer.class); @Resource(name = "topicAmqpTemplate")
private AmqpTemplate topicAmqpTemplate; public void sendMessage(Object message) throws IOException {
logger.info("to send message:{}", message);
topicAmqpTemplate.convertAndSend("log.info", message);
}
}

简单队列生产者

DefaultMessageProducer.java

package com.gm.producer;

import java.io.IOException;

import javax.annotation.Resource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Service; @Service
public class DefaultMessageProducer {
private Logger logger = LoggerFactory.getLogger(DefaultMessageProducer.class); @Resource(name = "rabbitTemplate")
RabbitTemplate rabbitTemplate; public void sendMessage(Object message) throws IOException {
logger.info("to send message:{}", message);
rabbitTemplate.convertAndSend("default_queue", message);
}
}

单元测试

ProducerMain.java

package com.gm.producer;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) // 使用junit4进行测试
@ContextConfiguration(locations = { "classpath:application.xml" }) // 加载配置文件
public class ProducerMain { private Logger logger = LoggerFactory.getLogger(ProducerMain.class); @Autowired
DirectMessageProducer directMessageProducer; @Autowired
TopicMessageProducer topicMessageProducer; @Autowired
DefaultMessageProducer defaultMessageProducer; @Test
public void send_messages() throws Exception {
directMessageProducer.sendMessage("我是directMessageProducer发出的消息");
topicMessageProducer.sendMessage("我是topicMessageProducer发出的消息");
defaultMessageProducer.sendMessage("我是defaultMessageProducer发出的消息"); while(true) { }
}
}

结果

RabbitMQ ——与Spring集成及exchange的direct、topic方式实现和简单队列实现的更多相关文章

  1. RabbitMQ入门教程(十六):RabbitMQ与Spring集成

    原文:RabbitMQ入门教程(十六):RabbitMQ与Spring集成 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https: ...

  2. RabbitMQ与spring集成,配置完整的生产者和消费者

    RabbitMQ与AMQP协议详解可以看看这个 http://www.cnblogs.com/frankyou/p/5283539.html 下面是rabbitMQ和spring集成的配置,我配置了二 ...

  3. 消息中间件系列四:RabbitMQ与Spring集成

    一.RabbitMQ与Spring集成  准备工作: 分别新建名为RabbitMQSpringProducer和RabbitMQSpringConsumer的maven web工程 在pom.xml文 ...

  4. RabbitMQ与Spring集成

    RabbitMQ服务端安装: https://blog.csdn.net/hzw19920329/article/details/53156015 与Spring集成 https://www.cnbl ...

  5. RabbitMQ入门学习系列(五) Exchange的Direct类型

    快速阅读 利用Exchange的Direct类型,实现对队列的过滤,消费者启动以后,输入相应的key值,攻取该key值对应的在队列中的消息 . 从一节知道Exchange有四种类型 Direct,To ...

  6. 消息队列RabbitMQ与Spring集成

    1.RabbitMQ简介 RabbitMQ是流行的开源消息队列系统,用erlang语言开发.RabbitMQ是AMQP(高级消息队列协议)的标准实现. 官网:http://www.rabbitmq.c ...

  7. rabbitmq 和Spring 集成 实现(一)

    1.增加pom.xml依赖 <!--rabbitmq消息队列依赖架包--> <dependency> <groupId>org.springframework.am ...

  8. RabbitMQ与Spring集成配置

    1.引入相关jar包 //RabbitMQ compile group: 'org.springframework.amqp', name: 'spring-rabbit', version: '1. ...

  9. 【RabbitMQ】三种类型交换器 Fanout,Direct,Topic(转)

    出处:https://blog.csdn.net/fxq8866/article/details/62049393 RabbitMQ服务器会根据路由键将消息从交换器路由到队列中,如何处理投递到多个队列 ...

随机推荐

  1. tf.expand_dims

    想要增加一维,可以使用tf.expand_dims(input, dim, name=None)函数 t = np.array(np.arange(1, 1 + 30).reshape([2, 3, ...

  2. Spring Aop 动态代理失效分析

    1. Spring Aop 原理 Spring Aop 通过动态代理创建代理对象,在调用代理对象方法前后做增强. 2. Transactional, Async 注解失效? 当在动态代理方法中调用当前 ...

  3. 帝国CMS编辑器粘贴Word图片

    图片的复制无非有两种方法,一种是图片直接上传到服务器,另外一种转换成二进制流的base64码 目前限chrome浏览器使用,但是项目要求需要支持所有的浏览器,包括Windows和macOS系统.没有办 ...

  4. Xcode编辑器之快捷键的使用

    一,快捷键图标 图标 键盘 ⌘ Command ⌃ Control ⌥ Option ⇧ Shift 二, 常用快捷键 文件快捷键 快捷键 键盘  描述 ⌘N  command + N 新文件 ⇧⌘N ...

  5. Xenu Link Sleuth 简单好用的链接测试工具

    XenuLink Sleuth 名词介绍 “Xenu链接检测侦探”是被广泛使用的死链接检测工具.可以检测到网页中的普通链接.图片.框架.插件.背景.样式表.脚本和java程序中的链接. 那么神马时候出 ...

  6. MySQL server has gone away 问题解决方法

    问题描述: SQLyog在执行大的sql文件时候,报错,报错日志显示2006 - MySQL server has gone away 解决办法: 在php.ini配置文件的[mysqld]节点下添加 ...

  7. python读取数据

    #读取一行数据,去掉头尾空格 line = sys.stdin.readline().strip() #line类型为字符串 #字符串变成列表 line = sys.stdin.readline(). ...

  8. Codeforces Round #585 (Div. 2) E. Marbles (状压DP)

    题目:https://codeforc.es/contest/1215/problem/E 题意:给你一个序列,你可以交换相邻的两个数,要达到一个要求,所有相同的数都相邻,问你交换次数最少是多少 思路 ...

  9. 关于CSS你应该知道的基础知识 - 样式应用篇

    上一篇简单总结了一下选择器,如果一个元素被多个选择器选中,元素的样式就会以级联方式被应用到.要搞清最终那个样式被应用到元素上了,首先要明白引用CSS代码的几种方式. CSS代码引用方式 如何应用CSS ...

  10. php heredoc的用法详解

    Heredoc技术,在正规的PHP文档中和技术书籍中一般没有详细讲述,只是提到了这是一种Perl风格的字符串输出技术.但是现在的一些论坛程序,和部分文章系统,都巧妙的使用heredoc技术,来部分的实 ...