上一篇文章介绍了windows环境下的安装和配置rabbitMQ,具体戳这边,一.windows环境下rabbit的的安装和配置。

  现在我们可以着手编写hello world程序了,一窥RabbitMQ的效用,从rabbitmq的官网的get start进入rabbitMQ文档学习区,即这个页面https://www.rabbitmq.com/getstarted.html。

  由于网上关于rabbitMQ的中文材料和教程不是很多,所以只好硬着头皮看官网文档了。

  可以看到官网主要从6个步骤来介绍学习轨迹,并且每个步骤均有多种编程语言的版本。由于本人采用的是java语言,所以就从一个java版本的hello world开始rabbitMQ的学习吧。

  一.Introduction(简介)

  1.可以将RabbitMQ理解为一个消息代理,它接收、存储、和分发数据信息。

  2.RabbitMQ主要由三个元素组成,producer(生产者),队列(queue),和消费者(Consumer).

  3.生产者生产消息,队列存储消息,消费者接收消息。他们之间的关系是多对多的,即多个生产者可以向一个队列中存放消息,多个消费者可以从一个队列中获取消息。

  4.值得注意的是,RabbitMQ代理器和生产者、消费者并不需要在同一个服务器上,他们可以是分布式的。

  二.hello world

  现在我们可以进入正题,用RabbitMQ来写一个hello world 的demo,以对RabbitMQ这个中间件有个直观的认识。

  在这个demo中,我们将编写两个类,一个是生产者类,一个是消费者类,生产者类负责发送一个简单的message,而消费者类负责接收这个消息并且打印出来。

  1.首先添加maven依赖包,如下。 

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

  2.新建Send类,如下所示。

  

package com.xdx.learn;import java.io.IOException;
import java.util.concurrent.TimeoutException;import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;public class Send {private final static String QUEUE_NAME="hello";public static void main(String[] args) throws IOException, TimeoutException {ConnectionFactory factory=new ConnectionFactory();factory.setHost("192.168.1.195");Connection connection=factory.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("[x] Sent '"+message+"'");channel.close();connection.close();}}

  运行上述代码,报错如下。

  这是因为我照抄官网的代码,官网的demo是基于本地的连接,而我是远程连接,所以必须显式地指定连接端口,用户名,密码之类的信息,修改上述代码,修改后如下。

  

import java.io.IOException;
import java.util.concurrent.TimeoutException;import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;public class Send {private final static String QUEUE_NAME="hello";public static void main(String[] args) throws IOException, TimeoutException {ConnectionFactory factory=new ConnectionFactory();factory.setHost("192.168.1.195");//服务器ipfactory.setPort(5672);//端口factory.setUsername("xdx");//登录名factory.setPassword("xxxxxx");//密码Connection connection=factory.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("[x] Sent '"+message+"'");channel.close();connection.close();}
}

  然后再运行,这次可以运行成功了。

  然后我们去RabbitMQ的管理后台,就可以看到队列中有一个queue了,名字就叫做hello。如下图所示。

  

  如果我再执行以下刚才那段代码,就会发现messages的数量又多了一个,如下所示。

  

  3.接下来是Recv.java类,用于接收消息,不同意发布消息的类,接收消息的类必须一直保持运行的状态,以便监听消息的到来。

  

package com.xdx.learn;import java.io.IOException;
import java.util.concurrent.TimeoutException;import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Envelope;public class Recv {private final static String QUEUE_NAME="hello";public static void main(String[] args) throws IOException, TimeoutException {//下面的配置与生产者相对应ConnectionFactory factory=new ConnectionFactory();factory.setHost("192.168.1.195");//服务器ipfactory.setPort(5672);//端口factory.setUsername("xdx");//登录名factory.setPassword("xxxx");//密码Connection connection=factory.newConnection();//连接Channel channel=connection.createChannel();//频道channel.queueDeclare(QUEUE_NAME, false, false, false, null);//队列System.out.println(" [*] Waiting for messages. To exit press CTRL+C");//defaultConsumer实现了Consumer,我们将使用它来缓存生产者发送过来储存在队列中的消息。当我们可以接收消息的时候,从中获取。Consumer consumer=new DefaultConsumer(channel){@Overridepublic 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 + "'");}};//接收到消息以后,推送给RabbitMQ,确认收到了消息。channel.basicConsume(QUEUE_NAME, true, consumer);}}

运行结果如下:

  此时我们再去RabbitMQ的控制台查看,发现hello队列中已经没有message了。

  注意到消费者的代码,有一个实现了DefaultConsumer接口的Consumer对象,去查看Consumer的源码,我们可以知道它的handleDelivery方法被一个一直存在的线程(该线程不是Connection所在的线程)调用,当有消息的时候,就会被执行。

以上就是一个简单的生产者和消费者的例子,其实RabbitMQ在这个过程中充当了一个消息存储器的角色,它负责接收,分配消息,而发送,接收消息的工作由我们编程来实现。经过这个例子,我们对RabbitMQ有了一个直观的简单的理解。更多的细节将在下面的文章中来学习。

转载于:https://www.cnblogs.com/roy-blog/p/8023791.html

二.java下使用RabbitMQ实现hello world相关推荐

  1. java连接rabbitmq_Mac / Windows 下安装 RabbitMQ

      Java大联盟 致力于最高效的Java学习 关注 什么是 RabbitMQ ? RabbitMQ 是采用 Erlang 语言实现 AMQP(Advanced Message Queuing Pro ...

  2. Net Core下使用RabbitMQ比较完备两种方案(虽然代码有点惨淡,不过我会完善)

    一.前言     上篇说给大家来写C#和Java的方案,最近工作也比较忙,迟到了一些,我先给大家补上C#的方案. 二.使用的插件     HangFire 一个开源的.NET任务调度框架,最大特点在于 ...

  3. Windows环境下安装RabbitMQ(官方文档中文版)

    安装RabbitMQ 软件提取 链接:https://pan.baidu.com/s/1bIqTqEf7b8bcGZ6_jSIccg  提取码:nnju 本文按照官方文档按步骤详细解读,废话不多说,下 ...

  4. Windows下当地RabbitMQ服务的安装

    Windows下本地RabbitMQ服务的安装 本文参考:刘若泽相关技术文档 当然这些内容页可以通过RabbitMQ官方网站获得. RabbitMQ配置说明手册 一.RaibbitMQ服务器配置 1. ...

  5. windows环境下搭建rabbitMQ开发环境

    2019独角兽企业重金招聘Python工程师标准>>> windows环境下搭建rabbitMQ开发环境 1.下载与安装 erlang rabbitmq 是使用erlang语言开发的 ...

  6. 20175333曹雅坤 实验二 Java面向对象程序设计

    实验二 Java面向对象程序设计 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计 ...

  7. java基本语句回文数实验_实验二 java基本数据类型与把持语句.doc

    实验二 java基本数据类型与把持语句.doc 还剩 4页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,喜欢就下载吧,价低环保! 内容要点: 5System.out.println(num ...

  8. 二-Java基础-作业-基础语法

    文章目录 前言 二-Java基础-环境搭建-Eclipse下载步骤和安装步骤2 二-Java基础-环境搭建-创建工程3 Java-环境搭建 总结 前言 # 二-Java基础-环境搭建-JDK-11.0 ...

  9. linux 看rabbit版本,Linux下安装rabbitMq

    Linux下安装rabbitMq 必须有Erlang环境------>>>Linux下安装Erlang 一.安装rabbitMq# cd /usr/local/ # yum inst ...

最新文章

  1. 【UML建模】机房中的UML图
  2. nodejs 获取post数据
  3. 中根遍历二叉查找树所得序列一定是有序序列_二叉搜索树(BST)
  4. linux 查看内存用量_正确计算linux系统内存使用率
  5. SpringBoot2.1.9 分布式锁ShedLock
  6. 如何使用async / await和Firebase数据库编写漂亮的Node.js API
  7. sql server 群集_SQL Server 2014 –安装群集实例–分步(2/3)
  8. 子慕谈设计模式系列(一)
  9. iOS开发之字典(NSDictionary)和JSON字符串(NSString)之间互转
  10. ASP.NET Core的路由[2]:路由系统的核心对象——Router
  11. 政企数字化转型怎么做?先从华为云WeLink “云签约”打个样儿
  12. 审计人员需要哪些计算机知识,审计人员应具备的知识与技能
  13. 如何在最短的时间内完成立春主题的公众号图文排版?
  14. Kibana常用搜索语法
  15. 基于循环神经网络的格兰杰因果网络重构
  16. python删除列表元素delete_Python3 tkinter基础 Listbox delete 删除单个、所有元素
  17. js计算当月有几周并显示对应的日期
  18. 系统集成项目管理工程师、信息系统项目管理师、PMP好考吗
  19. gitlab运行后修改存储位置
  20. C语言之三目运算符---学习笔记

热门文章

  1. JavaScript 函数循环、延时、节流、防抖
  2. Linux 字符设备驱动开发基础(六)—— VFS 虚拟文件系统解析
  3. [Linux] VIM 代码折叠
  4. [react] react组件间的通信有哪些?
  5. React开发(175):注意在回调里面重新渲染列表
  6. React开发(139):ant design学习指南之下载文件
  7. [vue] 说下$attrs和$listeners的使用场景
  8. [css] 使用rem的优缺点是什么?和使用百分比有什么区别?
  9. [vue-cli]vue-cli3你有使用过吗?它和2.x版本有什么区别?
  10. 前端学习(2856):简单秒杀系统学习之定时器循环显示