RabbitMQ入门-从HelloWorld开始

从读者的反馈谈RabbitMQ

昨天发完《RabbitMQ入门-初识RabbitMQ》,我陆陆续续收到一些反馈。鉴于部分读者希望结合实例来讲

  1. 期待下篇详细,最好结合案例。谢谢!
  2. 哪都好,唯一缺点就是不支持原生ha,配置起来太复杂
  3. ...

上篇主要介绍了什么RabbitMQ,RabbitMQ能用来做什么,一些有关RabbitMQ的基本概念,同时还简单介绍了两种RabbitMQ的分发消息的模型。
从这篇起,我们将改变原来的思路,针对每种模型详细讲解,并结合代码实例了解各个模型的原理和使用场景。
Hello World模型

上篇已经简单介绍过

  • 该模型由三要素组成:P(Producer)、Q(Queue)和C(Consumer)

  • P负责发送消息,Q负责存储消息,C负责消费消息

  • 消息可以在RabbitMQ或者你的应用中传递流动,但是却只能存储在Queue中

  • Queue可以接受多个发送者发送来的消息,也可以供多个消费者消费

实例

###准备工作

首先需要本地或者远程有一个RabbitMQ的服务,具体安装搭建可以网上找资料,类似于一个tomcat服务器

添加Jar包,推荐使用Maven管理jar包的方式,只需要添加依赖到pom.xml文件中就ok

  1. <dependency>
  2. <groupId>com.rabbitmq</groupId>
  3. <artifactId>amqp-client</artifactId>
  4. <version>4.0.2</version>
  5. </dependency>

发送端

  1. package com.ximalaya.openapi.rabbitmq.helloworld;
  2. import com.rabbitmq.client.Channel;
  3. import com.rabbitmq.client.Connection;
  4. import com.rabbitmq.client.ConnectionFactory;
  5. import java.util.concurrent.TimeoutException;
  6. /**
  7. * Created by jackie on 17/8/2.
  8. */
  9. public class Send {
  10. private final static String QUEUE_NAME = "hello.august";
  11. public static void main(String[] argv)
  12. throws java.io.IOException, TimeoutException {
  13. ConnectionFactory connectionFactory = new ConnectionFactory();
  14. connectionFactory.setHost("192.168.3.161");
  15. Connection connection = connectionFactory.newConnection();
  16. Channel channel = connection.createChannel();
  17. channel.queueDeclare(QUEUE_NAME, false, false, false, null);
  18. String message = "hello world";
  19. channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
  20. System.out.println("send message: " + message);
  21. channel.close();
  22. connection.close();
  23. }
  24. }
  • 首先创建一个ConnectFactory,并指定服务所在的ip地址,如果你的RabbitMQ启在本机,那setHost就可以写成setHost("localhost")

  • 从连接工厂中拿到一个连接并创建一个Channel

  • 再声明一个队列Queue,表示消息要发到哪个Queue里面

  • 定义要发送的消息message,并通过basicPublish进行消息发送

  • 最后关闭Channel和Connection的连接

运行这段代码后,我们可以看到在Queue(hello.august)中已经有了一个message,说明消息已经发送到Queue上了。

注意这是RabbitMQ的管理界面,我们可以通过这个管理应用,查看这个message的详细信息,在该页面底部有一个Get message的选项,点击我们可以得到刚刚发送的消息的详情

接收端

  1. package com.ximalaya.openapi.rabbitmq.helloworld;
  2. import com.rabbitmq.client.*;
  3. import java.io.IOException;
  4. import java.util.concurrent.TimeoutException;
  5. /**
  6. * Created by jackie on 17/8/2.
  7. */
  8. public class Recv {
  9. private final static String QUEUE_NAME = "hello.august";
  10. public static void main(String[] args) throws IOException, TimeoutException {
  11. ConnectionFactory connectionFactory = new ConnectionFactory();
  12. connectionFactory.setHost("192.168.3.161");
  13. Connection connection = connectionFactory.newConnection();
  14. Channel channel = connection.createChannel();
  15. channel.queueDeclare(QUEUE_NAME, false, false, false, null);
  16. Consumer consumer = new DefaultConsumer(channel) {
  17. @Override
  18. public void handleDelivery(String consumerTag, Envelope envelope,
  19. AMQP.BasicProperties properties, byte[] body)
  20. throws IOException {
  21. String message = new String(body, "UTF-8");
  22. System.out.println(" [x] Received '" + message + "'");
  23. }
  24. };
  25. channel.basicConsume(QUEUE_NAME, true, consumer);
  26. }
  27. }

大部分代码和发送端相同,在最后有一个Consumer,其主要用于监听指定ip的RabbitMQ服务上,指定的Queue上的消息。一旦发现有消息,则进行消费。
有一点需要注意,接收端同样声明了一个Queue,这是为什么呢?因为完全会出现一种情况,就是发送端还没有启动,但是接收端已经启动了,这时候要监听消息需要确保Queue已经存在。经过自己测试发现,如果这个Queue不存在则会创建一个同名的Queue,如果已经存在则使用存在的Queue。
这里将接收端的Queue name改为“hello11111”,运行前我们进入管理应用发现没有这个Queue

当运行完接收端的程序后,我们再次查找名为”hello11111”的Queue,就已经存在了

我们把接收端的Queue名称改为与发送端一致,这时候运行程序,我们看下面的动态图片

可以发现Queue中存储的消息有1变为0,即被消费者消费了。
至此,我们了解了RabbitMQ中的Hello World的模型。

HelloWorld RabbitMQ的更多相关文章

  1. RabbitMQ学习总结 第二篇:快速入门HelloWorld

    目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...

  2. RabbitMQ学习总结 第三篇:工作队列Work Queue

    目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...

  3. RabbitMQ学习总结 第一篇:理论篇

    目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...

  4. RabbitMQ学习总结 第四篇:发布/订阅 Publish/Subscribe

    目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...

  5. RabbitMQ学习总结 第五篇:路由Routing

    目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...

  6. RabbitMQ学习总结 第六篇:Topic类型的exchange

    目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...

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

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

  8. 分布式事务最终一致性-CAP框架轻松搞定

    前言 对于分布式事务,常用的解决方案根据一致性的程度可以进行如下划分: 强一致性(2PC.3PC):数据库层面的实现,通过锁定资源,牺牲可用性,保证数据的强一致性,效率相对比较低. 弱一致性(TCC) ...

  9. 【RabbitMQ】HelloWorld

    初识RabbitMQ RabbitMQ是一个消息代理人.它的主要目的很简单:接受并推送消息.我们可以将它理解为一个邮局:当你邮寄一封邮件到邮箱里,可以非常确定邮递员会将它送到收件人手中.打这种比方来将 ...

随机推荐

  1. CISP/CISA 每日一题 19

    CISSP 每日一题(答)What determines how often an audit should be performed? Risk     What policy requires u ...

  2. mybatis中整合ehcache缓存框架的使用

    mybatis整合ehcache缓存框架的使用 mybaits的二级缓存是mapper范围级别,除了在SqlMapConfig.xml设置二级缓存的总开关,还要在具体的mapper.xml中开启二级缓 ...

  3. js进阶 13-5 jquery队列动画如何实现

    js进阶 13-5 jquery队列动画如何实现 一.总结 一句话总结:同一个jquery对象,直接写多个animate()就好. 1.什么是队列动画? 比如说先左再下,而不是左下一起走 2.怎么实现 ...

  4. amazeui学习笔记--css(HTML元素2)--代码Code

    amazeui学习笔记--css(HTML元素2)--代码Code 一.总结 1.行内代码:code标签<code> 2.代码片段:pre标签<pre> 3.限制代码块高度:添 ...

  5. t_user is not mapped [from t_user as u where u.loginname = :loginname and u.password =:password]

    转自:https://blog.csdn.net/u010876380/article/details/52714539 错误: Struts Problem Report Struts has de ...

  6. 软件——关于C,typedef

    1;;写博客能让我慢下来,仔细思考 1;;这篇博客大多摘自网上 1;; 不管实在C还是C++代码中,typedef这个词都不少见,当然出现频率较高的还是在C代码中.typedef与#define有些相 ...

  7. UVA 10125 - Sumsets(POJ 2549) hash

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  8. 推荐一款稳定快速免费的前端开源项目 CDN 加速服务

    前面学习到什么是CDN,全称是Content Delivery Network,即内容分发网络.CDN的通俗理解就是网站加速,CPU均衡负载. CDN的基本思路是尽可能避开互联网上有可能影响数据传输速 ...

  9. 【BZOJ 3238】[Ahoi2013]差异

    [链接]h在这里写链接 [题意]     还有更简洁的题目描述吗/xk [题解]     对于lenti+lentj这一部分,比较好处理.     可以弄一个前缀和.     然后O(N)扫描一遍. ...

  10. NIO 入门(转)

    NIO 入门 Greg Travis2003 年 11 月 17 日发布 分享此页面 WeiboGoogle+用电子邮件发送本页面 20 在开始之前 关于本教程 新的输入/输出 (NIO) 库是在 J ...