RabbitMQ入门-从HelloWorld开始

从读者的反馈谈RabbitMQ

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

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

上篇主要介绍了什么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

<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>4.0.2</version>
</dependency>

发送端

package com.ximalaya.openapi.rabbitmq.helloworld;

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

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

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

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

  • 最后关闭Channel和Connection的连接

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

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

接收端

package com.ximalaya.openapi.rabbitmq.helloworld;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException; /**
* Created by jackie on 17/8/2.
*/
public class Recv {
private final static String QUEUE_NAME = "hello.august"; public static void main(String[] args) throws IOException, TimeoutException {
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("192.168.3.161");
Connection connection = connectionFactory.newConnection(); Channel channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null); 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(" [x] Received '" + message + "'");
}
}; channel.basicConsume(QUEUE_NAME, true, consumer);
}
}

大部分代码和发送端相同,在最后有一个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. Unity实现发送QQ邮件功能

    闲来无聊,用Unity简单实现了一个发送邮件的功能,希望与大家互相交流互相进步,大神勿喷,测试的是QQ邮件用到的是MailMessage类和SmtpClient类首先如果发送方使用的是个人QQ邮箱账号 ...

  2. 【习题 7-10 Uva11214】Guarding the Chessboard

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 迭代加深搜索. 可以想见最后深度不会很深吧.. 然后皇后之间互相攻击到是允许的.. 就这样 [代码] /* 1.Shoud it u ...

  3. Shiro学习总结(4)——Shrio登陆验证实例详细解读

    最终效果如下: 工程整体的目录如下: Java代码如下: 配置文件如下: 页面资源如下: 好了,下面来简单说下过程吧! 准备工作: 先建表: [sql] view plain copy drop ta ...

  4. 洛谷——P1540 机器翻译

    https://www.luogu.org/problem/show?pid=1540#sub 题目背景 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 题目描述 这个翻译软件的 ...

  5. upf1

    创建supply net,两种方法 1. creat_supply_net VDD -domain PD_B 2. creat_supply_net VDD

  6. Java ThreadLocal Example(java中的ThreadLocal例子)

    Java ThreadLocal is used to create thread local variables. We know that all threads of an Object sha ...

  7. 字符集和编码II: fat/msdos/vfat (文件名乱码的问题)

    具体到文件名乱码的问题,需要明确两点 第一,文件名作为一个字符串,需要被编码后存入文件系统: 第二,Linux内核无非是个特殊的应用程序,它读取文件名,再把文件名以编码后的形式传递出去. 但Linux ...

  8. Android ViewGroup使用小结

    ViewGroup定义 在api中是这么描写叙述ViewGroup的:A ViewGroup is a special view that can contain other views. 依据意思我 ...

  9. 关于fatfs生成的wav文件是空,大小是0的问题

    绝大多数是因为打开错误 调试的时候,编写程序的时候 要记得res=f_open() 要有返回值res的设置

  10. 解读Java中BigDecimal.ZERO.compareTo()的返回值含义

    Java compareTo() 用法 例如: public static void main(String[] args) {     BigDecimal bnum1, bnum2; bnum1 ...