从读者的反馈谈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的模型。

如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!如果您想持续关注我的文章,请扫描二维码,关注JackieZheng的微信公众号,我会将我的文章推送给您,并和您一起分享我日常阅读过的优质文章。

RabbitMQ入门-从HelloWorld开始的更多相关文章

  1. RabbitMQ入门-高效的Work模式

    扛不住的Hello World模式 上篇<RabbitMQ入门-从HelloWorld开始>介绍了RabbitMQ中最基本的Hello World模型.正如其名,Hello World模型 ...

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

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

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

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

  4. 消息中间件 RabbitMQ 入门篇

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

  5. RabbitMQ入门到进阶(Spring整合RabbitMQ&SpringBoot整合RabbitMQ)

    1.MQ简介 MQ 全称为 Message Queue,是在消息的传输过程中保存消息的容器.多用于分布式系统 之间进行通信. 2.为什么要用 MQ 1.流量消峰 没使用MQ 使用了MQ 2.应用解耦 ...

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

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

  7. RabbitMQ入门-消息订阅模式

    消息派发 上篇<RabbitMQ入门-消息派发那些事儿>发布之后,收了不少反馈,其中问的最多的还是有关消息确认以及超时等场景的处理. 楼主,有遇到消费者后台进程不在,但consumer连接 ...

  8. RabbitMQ入门-Topic模式

    上篇<RabbitMQ入门-Routing直连模式>我们介绍了可以定向发送消息,并可以根据自定义规则派发消息.看起来,这个Routing模式已经算灵活的了,但是,这还不够,我们还有更加多样 ...

  9. RabbitMQ入门与使用篇

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

随机推荐

  1. ionic 项目中添加modal的步骤流程

    1.首先在templates文件夹下面定义一个新页面,xxx.html,template文件夹在空项目里面是没有的,需要手动添加一个,放在WWW文件夹下面. <ion-modal-view> ...

  2. openfire极限优化

    日志优化   默认是 用info 级别,最好不用openfire原生的打日志方式.   离线消息用存储不打回方式,不要用打回方式   xmpp.offline.type=store_and_drop ...

  3. 微服务架构:基于微服务和Docker容器技术的PaaS云平台架构设计(微服务架构实施原理)

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 基于微服务架构和Docker容器技术的PaaS云平台建设目标是给我们的开发人员提供一套服务快速开发.部署.运维管理.持续开发持续集成的流程 ...

  4. Codewars练习笔记·1 - 6.23

    Codewars地址:https://www.codewars.com/ 笔记资料来源:JavaScript高级程序设计. 欢迎和大家一起来讨论~   基础练习(1):   我的解答为: class ...

  5. 《JavaScript高级程序设计》笔记二

    第二章 在HTML中使用JavaScript 要想把JavaScript放到网页中,就必须涉及到Web的核心语言HTML.向HTML页面中插入JavaScript的主要方法,就是使用<scrip ...

  6. 推荐几款.NET客户端开源报表图

    如果你正在开发客户端报表图相关的应用,除了.NET自带的控件,你还可以考虑使用以下几个控件库. [OxyPlot] OxyPlot是一个支持.NET的跨平台绘图库.你可以在很多平台上使用它,如WPF, ...

  7. ReactiveCocoa源码解析(四) Signal中的静态属性静态方法以及面向协议扩展

    上篇博客我们聊了Signal的几种状态.Signal与Observer的关联方式以及Signal是如何向关联的Observer发送事件的.本篇博客继续上篇博客的内容,来聊一下Signal类中静态的ne ...

  8. Example007关闭窗口时关闭父窗口

    <!--实例007关闭窗口时刷新父窗口--> <!DOCTYPE html> <html lang="en"> <head> < ...

  9. openssl ca(签署和自建CA)

    用于签署证书请求.生成吊销列表CRL以及维护已颁发证书列表和这些证书状态的数据库.因为一般人无需管理crl,所以本文只介绍openssl ca关于证书管理方面的功能. 证书请求文件使用CA的私钥签署之 ...

  10. 构建混合应用方式之WCF中继

    使用VPN或者ER服务建立云服务和本地服务网络通道来搭建混合应用的方式,需要网络设备的配合和比较复杂的网络配置,所以不是特别的方便.如果是不希望对本地网络环境做修改,而只是服务层面的混合,那么可以使用 ...