概念:RabbitMQ是一款开源的消息中间件系统,由erlang开发,是AMQP的实现。

架构图大概如上。

broker是消息队列的服务器,比如在linux上,我们安装的rabbitmq就是一个broker,可以通过url+username+password连接。

每个消息服务器可以创建多个vhost,默认的vhost是“/”,linux中通过rabbitmqctl add_vhost <vhost> 创建vhost,再给指定用户授权即可。

生产者首先通过创建channel与broker连接,类似于创建一个会话,这样可以与消息主机通信发送消息。

消息生产者将消息发送到定义的exchange上,exchange通过不同的转发路由规则将消息转发到相应的队列,消费者选择一个队列监听,如果有多个消费者监听同一个队列,默认是轮询方式,保证每个连接有相同的收到消息的概率。

一个简单的rabbitmq程序:

public class Producer {
private static final String TEST_VHOST = "testvhost";
private static final String TEST_QUEUE_NAME = "task_queue"; private static Connection connection;
private static Channel channel; public static void main(String[] args) throws IOException, TimeoutException, RabbitmqConnectionException {
try {
//create connectionFactory with host, username, password, vhost.
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setUsername("test");
connectionFactory.setPassword("test");
connectionFactory.setHost("localhost");
connectionFactory.setVirtualHost(TEST_VHOST);
//get connection from connectionFactory
connection = connectionFactory.newConnection();
//create an session to communicate with mq host
channel = connection.createChannel();
//declare a queue(if not exists, create it)
channel.queueDeclare(TEST_QUEUE_NAME, true, false, false, null);
String message = "Hello world";
System.out.println("sending message : " + message);
//publish message to the declaring queue
channel.basicPublish("", TEST_QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());
}catch (Exception e) {
throw new RabbitmqConnectionException("Error connection");
} finally {
channel.close();
connection.close();
} }
}

  

public class Consumer {
private static final String TEST_VHOST = "testvhost";
private static final String TEST_QUEUE_NAME = "task_queue"; public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setVirtualHost(TEST_VHOST);
factory.setUsername("test");
factory.setPassword("test");
final Connection connection = factory.newConnection();
final Channel channel = connection.createChannel(); //declaring a queue to listen
channel.queueDeclare(TEST_QUEUE_NAME, true, false, false, null);
System.out.println("Waiting for messages..."); //a piece message per time
channel.basicQos(1); final com.rabbitmq.client.Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
String message = new String(body, "UTF-8"); System.out.println("Received : '" + message + "'");
channel.basicAck(envelope.getDeliveryTag(), false);
}
};
channel.basicConsume(TEST_QUEUE_NAME, false, consumer);
}
}

 在spring中:

<!-- spring-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"
xmlns:mvc="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <description>rabbitmq 连接服务配置</description> <mvc:component-scan base-package="com.battery.rabbitMq"/> <!-- 连接配置 -->
<rabbit:connection-factory id="rabbit-connectionFactory" host="${mq.host}" username="${mq.username}" password="${mq.password}" port="${mq.port}" virtual-host="${mq.vhost}"/> <rabbit:admin connection-factory="rabbit-connectionFactory"/> <!-- spring template声明,注入到类中,用于将消息发送到指定队列-->
<rabbit:template exchange="test-mq-fanout" id="ssoTemplate" connection-factory="rabbit-connectionFactory" message-converter="jsonMessageConverter" /> <!-- 消息对象json转换类 -->
<bean id="jsonMessageConverter" class="org.springframework.amqp.support.converter.Jackson2JsonMessageConverter" /> <!-- 声明一个消息队列(
durable:是否持久化
exclusive: 仅创建者可以使用的私有队列,断开后自动删除
auto_delete: 当所有消费客户端连接断开后,是否自动删除队列) -->
<rabbit:queue id="test_queue" name="test_queue" durable="true" auto-delete="false" exclusive="false" /> <!-- 定义交换机
rabbit:direct-exchange:定义exchange模式为direct,意思就是消息与一个特定的路由键完全匹配,才会转发。
rabbit:binding:设置消息queue匹配的key
-->
<rabbit:fanout-exchange name="test-mq-fanout" auto-declare="true" durable="true" auto-delete="false" id="test-mq-fanout">
<rabbit:bindings>
<rabbit:binding queue="test_queue"/>
</rabbit:bindings>
</rabbit:fanout-exchange> <!-- 消费者配置 --> <!-- 队列监听类 -->
<bean id="queueListener" class="com.battery.rabbitMq.QueueListener"/> <!-- 监听容器配置 -->
<rabbit:listener-container connection-factory="rabbit-connectionFactory" acknowledge="manual">
<rabbit:listener queues="test_queue" ref="queueListener" method="onMessage"/>
</rabbit:listener-container> </beans>

@Service
public class MQProducerImpl implements MQProducer { @Autowired
private RabbitTemplate rabbitTemplate; private final static Logger LOGGER = LoggerFactory.getLogger(MQProducerImpl.class); /**
* convertAndSend:将Java对象转换为消息发送到匹配Key的交换机中Exchange,由于配置了JSON转换,这里是将Java对象转换成JSON字符串的形式。
* 原文:Convert a Java object to an Amqp Message and send it to a default exchange with a specific routing key.
**/
@Override
public void sendDataToQueue(Object object) {
try {
rabbitTemplate.convertAndSend(object);
} catch (Exception e) {
LOGGER.error(e.getMessage());
}
}
}
@Component
public class QueueListener implements ChannelAwareMessageListener { private static Logger logger = LoggerFactory.getLogger(QueueListener.class); @Override
public void onMessage(Message message, Channel channel) throws Exception {
try {
String ackMessage = new String(message.getBody(), "utf-8");
System.out.print(ackMessage);
logger.debug("接收到:" + new String(message.getBody(), "utf-8"));
} catch (Exception e) {
System.out.print(e.getMessage());
}
}
}
 

  

javaweb消息中间件——rabbitmq入门的更多相关文章

  1. 消息中间件 RabbitMQ 入门篇

    消息中间件 RabbitMQ 入门篇 五月君 K8S中文社区 今天   作者:五月君,来源:Nodejs技术栈 从不浪费时间的人,没有工夫抱怨时间不够.—— 杰弗逊 RabbitMQ 是一套开源(MP ...

  2. 消息中间件——RabbitMQ(五)快速入门生产者与消费者,SpringBoot整合RabbitMQ!

    前言 本章我们来一次快速入门RabbitMQ--生产者与消费者.需要构建一个生产端与消费端的模型.什么意思呢?我们的生产者发送一条消息,投递到RabbitMQ集群也就是Broker. 我们的消费端进行 ...

  3. 2.RABBITMQ 入门 - WINDOWS - 生产和消费消息 一个完整案例

    关于安装和配置,见上一篇 1.RABBITMQ 入门 - WINDOWS - 获取,安装,配置 公司有需求,要求使用winform开发这个东西(消息中间件),另外还要求开发一个日志中间件,但是也是要求 ...

  4. RabbitMQ入门与使用篇

    介绍 RabbitMQ是一个由erlang开发的基于AMQP(Advanced Message Queue)协议的开源实现.用于在分布式系统中存储转发消息,在易用性.扩展性.高可用性等方面都非常的优秀 ...

  5. [转]RabbitMQ入门教程(概念,应用场景,安装,使用)

    原文地址:https://www.jianshu.com/p/dae5bbed39b1 RabbitMQ 简介 RabbitMQ是一个在AMQP(Advanced Message Queuing Pr ...

  6. .NET 环境中使用RabbitMQ RabbitMQ与Redis队列对比 RabbitMQ入门与使用篇

    .NET 环境中使用RabbitMQ   在企业应用系统领域,会面对不同系统之间的通信.集成与整合,尤其当面临异构系统时,这种分布式的调用与通信变得越发重要.其次,系统中一般会有很多对实时性要求不高的 ...

  7. 消息中间件——RabbitMQ(六)理解Exchange交换机核心概念!

    前言 来了解RabbitMQ一个重要的概念:Exchange交换机 1. Exchange概念 Exchange:接收消息,并根据路由键转发消息所绑定的队列. 蓝色框:客户端发送消息至交换机,通过路由 ...

  8. 消息中间件——RabbitMQ(七)高级特性全在这里!(上)

    前言 前面我们介绍了RabbitMQ的安装.各大消息中间件的对比.AMQP核心概念.管控台的使用.快速入门RabbitMQ.本章将介绍RabbitMQ的高级特性.分两篇(上/下)进行介绍. 消息如何保 ...

  9. 消息中间件——RabbitMQ(八)高级特性全在这里!(下)

    前言 上一篇消息中间件--RabbitMQ(七)高级特性全在这里!(上)中我们介绍了消息如何保障100%的投递成功?,幂等性概念详解,在海量订单产生的业务高峰期,如何避免消息的重复消费的问题?,Con ...

随机推荐

  1. Kotlin中的object 与companion object的区别

    之前写了一篇Kotlin中常量和静态方法的文章,最近有人提出一个问题,在companion object中调用外部的成员变量会调用不到,这才意识到问题,本篇文章会带着这个疑问来解决问题. 一. obj ...

  2. javascript中back(-1)和go(-1)的区别

    javascript中back(-1)和go(-1)的区别 一.总结 一句话总结: 数据 history.back(-1):直接返回当前页的上一页,数据全部消息,是个新页面 history.go(-1 ...

  3. 如何写一篇好的技术博客or技术文档(转链接)

    如何写一篇好的技术文档http://yunli.blog.51cto.com/831344/168352 程序员怎样才能写出一篇好的博客或者技术文章?http://www.zhihu.com/ques ...

  4. Java网络编程和NIO详解2:JAVA NIO一步步构建IO多路复用的请求模型

    Java网络编程与NIO详解2:JAVA NIO一步步构建IO多路复用的请求模型 知识点 nio 下 I/O 阻塞与非阻塞实现 SocketChannel 介绍 I/O 多路复用的原理 事件选择器与 ...

  5. PHP与Java集成开发详解(一)

    很久以前,有人从www上看到看到天空上一个很亮的亮点,它就是Java语言,与此同时,在另一个地方一位梦想家也看到了一个亮点,它就是PHP. 时间一天天过去,这两个亮点也变得越来越亮,很快,它们受到了编 ...

  6. poj3666&&bzoj1592

    题解: 和bzoj1367差不多 然后a[i]-i不用加 然后我再另一个地方加了这句话 然后poj ac,bzoj wa poj数据水啊 代码: #include<cstdio> #inc ...

  7. Google Web Designer打开白屏问题的解决方案

    Google Web Designer是谷歌出品的一个可视化的  HTML5  网页和广告的设计开发工具  Google Web Designer . 官网地址:https://www.google. ...

  8. Scrum立会报告+燃尽图 07

    作业要求[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2289] 版本控制:https://git.coding.net/liuyy08 ...

  9. SpringDataJPA最佳实践(一)简介

    在团队中使用SpringDataJPA有一段时间了,也踩过一些坑,这里记录一下学习历程. 1.简介 Spring Data是什么 Spring Data是一个用于简化数据库访问,并支持云服务的开源框架 ...

  10. Jmeter-Logic Controllers(逻辑控制器)

    Critical Section Controller(临界区控制器) 参考:http://www.cnblogs.com/yanzhe/p/7729984.html ForEach Controll ...