二.java下使用RabbitMQ实现hello world

  上一篇文章介绍了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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/415110.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工作180:前端是业务需求理解

1做一个系统之前 要明确数据的一个处理流程 才能避免做返工操作

docker centos ssh

1、创建一个容器 docker run -d -p 18022:22 -p 18000:8000 --privileged -v /Users/caowei/share:/share --name yf c17f22223248 /usr/sbin/init 2、进入容器 docker exec -it 39550a9d4610 /bin/bash 3、安装openssh和openssh-server yum install -y passwd openssh op…

Android自定义view详解,使用实例,自定义属性,贝塞尔曲线

//只会触发执行onDraw方法&#xff0c;只会改变绘制里面的内容,条目的绘制 invalidate(); //只会触发执行onDraw方法&#xff0c;但是可以在子线程中刷新 postInvalidate(); //view的布局参数改变之后刷新&#xff0c;比如view的宽度和高度都修改了&#xff0c;只能通过reques…

前端学习(2679):安装mysql_front

mysql front安装与使用教程 2020-04-10 11:32 更新mysql front一种小巧的管理Mysql的应用工具&#xff0c;那么这个工具该如何安装和使用呢&#xff1f;一起来看看吧。 一&#xff0c;mysql前端下载&#xff1a; mysql front下载地址&#xff1a;点击下载 二&#xff0c;mysql前…

Android RecyclerView 向上偏移解决、添加自定义分割线,瀑布流,ScrollView嵌套RecyclerView滑动卡顿

向上偏移解决 android:focusableInTouchMode"true" android:focusable"true" android:fillViewport"true" 卡顿解决方法 recyclerViewwg.setHasFixedSize(true); recyclerViewwg.setNestedScrollingEnabled(false); 删除条目&#xff1a; l…

前端学习(2678):懂代码之表格BaseTable编辑操作

第一步:编辑操作 <template slot-scope"scope"><el-buttontype"text"icon"el-icon-edit"click"handleEdit(scope.$index, scope.row)">编辑</el-button></template> 第二步 进行编辑处理 // 编辑操作handle…

工作182:表格渲染

<el-table :data"tableData" style"width: 100%" border> <!-- <el-table-column label"id" prop"1" align"center"></el-table-column>--><!--渲染账号名称--><el-table-column l…

Android 集成支付宝支付,支付宝支付2.0

成功起调支付宝支付 下载支付sdk复制到libs文件夹下并add as library&#xff1a;https://docs.open.alipay.com/54/104509 1、首先申请支付宝 企业账户 链接&#xff1a;https://memberprod.alipay.com/account/reg/enterpriseIndex.htm 备注&#xff1a;企业账户是以邮箱申…

docker centos node nginx

1、docker pull centos:centos8 2、进入容器 docker run -it centos:centos8 /bin/bash 3、安装git yum install -y git 4、安装nvm git clone https://github.com/creationix/nvm.git source nvm/nvm.sh 5、修改环境变量 vi ~/.bash_profile 加入source nvm/nvm.sh 更新 sour…

Appium——api常用函数

appium常用函数介绍&#xff1a;获取页面信息&#xff1a;1、 def get_current_activity(cls, driver):获取当前页面的activity:param driver::return:return driver.current_activity2、 def get_current_pagesource(cls, driver):获取当前页面源码:param driver::return: 返回…

工作183:动态渲染数据 数据在数字字典里面

1接口调用 /*调用接口*/created() {/*动态渲染content_type接口*/getAction("/dict/list",{dict_code:"content_type"}).then(res>{this.content_typeres.data})/*动态渲染*/getAction("/dict/list",{dict_code:"resource_type"})…

Android 集成微信支付详解

打包后才能起调支付 微信支付成功起调 微信skd下载&#xff1a;https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter11_1 签名APK下载&#xff1a;https://open.weixin.qq.com/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android.apk 1、首先到微信.…

工作184:自定义事件

1子组件 mongo.vue <template><button click"eat">按钮</button> </template><script> export default {created() {this.$on("eat", function(fruit) {console.log("子组件接收自己发射的事件");});},methods:…

cesium label 显示隐藏到地底下

今天在写label的时候&#xff0c;发现高度为0时&#xff0c;label显示不全&#xff0c;影响用户体验&#xff0c;代码如下&#xff1a; window.labelEntity viewer.entities.add({label: {show: false,showBackground: true,font: "14px monospace",horizontalOrigi…

工作186:实际案例解决vue+el-element二级联动,选项选择后不显示的问题

1组件 <el-form-item label"所属部门" :label-width"formLabelWidth"><select-form change"DepartmentList" v-model"form.department_id" /></el-form-item><!-- <el-form-item prop"business_module&…

Render errors:One or more layouts are missing the layout_width or layout_height attributes

Render errors:One or more layouts are missing the layout_width or layout_height attributes 2017年05月25日 11:55:19 邹奇 阅读数&#xff1a;4207 标签&#xff1a; android studioxmlRendererrorsattributes 更多 个人分类&#xff1a; 安卓开发技术学习 版权声明&a…

工作187:表单校验规则

第一种常用方式&#xff1a;表单上加rules&#xff5b;object&#xff5d; <el-form class"apply-form first-form" :model"formData" :rules"rule" ref"form"><el-form-item label"姓名" prop"visitorName&…

AndroidStudio关联svn并上传代码到svn服务器上,更换域名

SVN安装选项 到下图位置选择【command line client tools】前面的下拉框&#xff0c;选择【Will be installed on local hard drive】&#xff0c;一直下一步知道安装完成即可。 打开AndroidStudio&#xff0c;按CtrlShifS快捷键&#xff0c;进入Settings设置页面。如上图所示…

docker安装postgres

1、拉取 postgres镜像 docker pull postgres2、开启容器 docker run --name Postgres-0 -e POSTGRES_PASSWORDpassword -d -p 5432:5432 postgres:latest3、打开命令行 docker exec -it Postgres-0 bash4、切换为管理员用户 psql -U postgres5、查看用户 \du6、继续创建数…