第四章 第一个rabbitmq程序
rabbitmq消息发送模型
要素:
- 生产者
- 消费者
- 交换器:生产者将消息发送到交换器
- 队列:交换器通过某种路由规则绑定到指定队列,将消息加入队列,消费者从队列消费消息
前提:
引入rabbitmq的java客户端jar包
<!-- import rabbitmq/amqp-client -->
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>3.5.6</version>
</dependency>
一、消息生产者
1、代码:
package com.xxx.producer; 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 HelloWorldProducer {
private static final String QUEUE_NAME = "helloQueue";
private static final String EXCHANGE_NAME = "helloExchange"; public static void main(String[] args) throws IOException, TimeoutException {
ConnectionFactory factory = new ConnectionFactory();// 建立连接工厂
factory.setHost("192.168.20.238");// 设置rabbitmq服务器地址
factory.setPort(5672);// 设置rabbitmq服务器端口
factory.setUsername("zhaojigang");
factory.setPassword("wangna");
factory.setVirtualHost("zhaojigangvhost"); Connection connection = factory.newConnection();// 建立连接
Channel channel = connection.createChannel();// 建立信道 /**
* queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments)
* durable:队列是否持久化
* exclusive:当最后一个消费者取消订阅时,是否自动删除
* autoDelete:只有当前应用程序才能够消费队列消息(场景:限制一个队列只有一个消费者)
* arguments:other properties (construction arguments) for the queue
*/
channel.queueDeclare(QUEUE_NAME, false, false, false, null);// 创建队列(如果队列不存在,创建;如果存在,什么都不做)
/**
* exchangeDeclare(String exchange, String type, boolean durable, boolean autoDelete, Map<String, Object> arguments)
* exchange:交换器名字
* type:3种类型 direct/fanout/topic
*/
channel.exchangeDeclare(EXCHANGE_NAME, "direct", false, false, null); for (int i = 0; i < 10; i++) {
String msg = "helloworld_" + i;// 创建消息
/**
* basicPublish(String exchange, String routingKey, BasicProperties props, byte[] body)
* exchange:交换器
* routingKey:路由键
* props:other properties for the message - routing headers etc
* body:消息体
*/
channel.basicPublish(EXCHANGE_NAME, QUEUE_NAME, null, msg.getBytes());// 发布消息
System.out.println("发送消息:msg-->" + msg);
} channel.close();// 关闭信道
connection.close();// 关闭连接
}
}
2、步骤:
- 创建并设置连接工厂
- host、port、username、password、vhost
- 值得注意的是,一定要现在rabbitmq server上把username和password设置好,并且开启该用户在指定vhost上的权限,才可以设置连接工厂成功
- 创建连接
- 创建信道
- 创建队列
- 创建交换器
- 创建(创建之后也可以配置消息)并发送消息
- 关闭信道
- 关闭连接
3、注意点:
queueDeclare方法:如果队列不存在,创建;如果存在,什么都不做
basicPublish:发布消息到指定的交换器,并制定路由规则(用于消费者部分的绑定操作)
二、消息消费者
1、代码:
package com.xxx.consumer; 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.Envelope;
import com.rabbitmq.client.AMQP.BasicProperties; /**
* 消息消费者
*/
public class HelloWorldConsumer {
private final static String QUEUE_NAME = "helloQueue";
private static final String EXCHANGE_NAME = "helloExchange"; public static void main(String[] args) throws IOException, TimeoutException {
ConnectionFactory factory = new ConnectionFactory();// 建立连接工厂
factory.setHost("192.168.20.238");// 设置rabbitmq服务器地址
factory.setPort(5672);// 设置rabbitmq服务器端口
factory.setUsername("zhaojigang");
factory.setPassword("wangna");
factory.setVirtualHost("zhaojigangvhost"); Connection connection = factory.newConnection();// 建立连接
Channel channel = connection.createChannel();// 建立信道 /**
* Note that we declare the queue here, as well.
* Because we might start the receiver before the sender,
* we want to make sure the queue exists before we try to consume messages from it.
*/
channel.queueDeclare(QUEUE_NAME, false, false, false, null);// 创建队列(如果队列不存在,创建;如果存在,什么都不做)
channel.exchangeDeclare(EXCHANGE_NAME, "direct", false, false, null);
/**
* queueBind(String queue, String exchange, String routingKey)
*/
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, QUEUE_NAME);
Consumer consumer = new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag,
Envelope envelope,
BasicProperties properties,
byte[] body) throws IOException {
String msg = new String(body,"UTF-8");
System.out.println("接收消息:msg-->" + msg);
}
}; /**
* basicConsume(String queue, boolean autoAck, Consumer callback)
* autoAck true if the server should consider messages acknowledged once delivered;
* false if the server should expect explicit acknowledgements
* 这里启动一个consume,该consume会不断的接收消息,如果此处用while(true)包起来的话,就会不断的启动consume
*/
channel.basicConsume(QUEUE_NAME, true, consumer);
// channel.close();// 关闭信道
// connection.close();// 关闭连接
}
}
2、步骤:
- 创建并设置连接工厂
- host、port、username、password、vhost
- 创建连接
- 创建信道
- 创建队列
- 创建交换器
- 通过路由规则绑定队列和交换器
- 创建消息处理函数
- 从队列获取消息并消费消息(根据消息处理函数)
三、测试
1、启动rabbitmq服务器
2、启动消费者进程
3、启动生产者进程
4、查看console即可或者查看rabbitmq的webUI
第四章 第一个rabbitmq程序的更多相关文章
- C#语言————第一章 第一个C#程序
第一章 第一个C#程序 ******************C#程序*************** ①:建立项目:文件-->新建-->项目-->c#-->控制台程 ...
- Pro ASP.NET MVC –第二章 第一个MVC程序
学习一个软件开发框架的最有效的方式就是了解并使用它.在本章,你将会创建一个简单基于ASP.NET MVC Framework的数据-实体应用程序.我们会该程序划分成若干小块,每次介绍一个部分,以便你能 ...
- C#第一章 第一个C#程序
第一个C#程序 namespace 是C#中组织代码的方式,它的作用那个类似java中的包 using 在Java中作用如果导入其他包 应该是用import关键字而在C#中应使用using关键字来引用 ...
- 从零开始学习Hadoop--第2章 第一个MapReduce程序
1.Hadoop从头说 1.1 Google是一家做搜索的公司 做搜索是技术难度很高的活.首先要存储很多的数据,要把全球的大部分网页都抓下来,可想而知存储量有多大.然后,要能快速检索网页,用户输入几个 ...
- 金三银四背后,一个 Android 程序员的面试心得
回顾一下自己这段时间的经历,九月份的时候,公司通知了裁员,我匆匆忙忙地出去面了几家,但最终都没有拿到offer,我感觉今年的寒冬有点冷.到十二月份,公司开始第二波裁员,我决定主动拿赔偿走人.后续的面试 ...
- 《C++ Without Fear》 第1章 第一个C++程序
机器码,CPU的“母语”,每条计算机指令就是一个由1和0构成的独一无二的组合(或代码). endl是“endl line”的缩写,所以它应该念作“end ELL”而不是“end ONE”.
- 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...
- 从安装Mac OS X虚拟机到第一个IOS程序
对于纯粹地抄这种行为是比较抵触的,别人已经写得挺好的东西没必要又去写一遍,但如果不写经验来看下次再做时自己又要重复百度筛选一遍,所以还是要记一记. 之前要获取IOS静态库的版本,但一直以来没有Mac没 ...
- “全栈2019”Java第四章:创建第一个Java程序
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
随机推荐
- html5+css3 手机屏幕的适配css
*{ margin:0;padding:0;outline:0}a{ text-decoration:none}body,html{ font-size:20px;font-family:'Micro ...
- win7 fiddler报“Creation of the root certificate was not successful”的问题
cd "C:\Program Files (x86)\Fiddler2" makecert.exe -r -ss my -n "CN=DO_NOT_TRUST_Fiddl ...
- select 1 from dual
begin 2018年7月14日15:06:29 select 1 from dual Oracle下的select 1 from dual 今天在看公司代码的时候,发现有这一句SQL: select ...
- 组装者模式在React Native项目中的一个实战案例
前言 在实际的开发中,如果遇到多个组件有一些共性,我们可以提取一个BaseItem出来,然后在多个组件中进行复用,一种方式是通过继承的方式,而今天我们要说的是另一种方式--组装者模式. 什么是组装者模 ...
- Failed to resolve: com.android.support:design:25.4.0
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 错误:(27, 13) Failed to resolve: com.android.s ...
- hdu 4676 Sum Of Gcd 莫队+phi反演
Sum Of Gcd 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4676 Description Given you a sequence of ...
- js取float型小数点后x位数的方法
js中取小数点后两位方法最常用的就是四舍五入函数了,前面我介绍过js中四舍五入一此常用函数,这里正好用上,下面我们一起来看取float型小数点后两位一些方法总结 以下我们将为大家介绍 JavaScri ...
- SecureCRT 如何改变对话框--每行输入字符数的多少
通过设置Logical columns的大小,选中Retain size an font来改变每行输入字符数的多少 1.设置Session Options–>Terminal–>Emula ...
- Content portal for Pocketables Tasker articles
http://www.pocketables.com/2013/03/overview-of-pocketables-tasker-articles.html I write a lot about ...
- [Asp.Net web api]基于自定义Filter的安全认证
摘要 对第三方开放的接口,处于安全的考虑需要对其进行安全认证,是否是合法的请求.目前在项目中也遇到这种情况,提供的接口因为涉及到客户铭感数据,所以在调用的时候,不能直接暴露,需要有一个认证的机制.所以 ...