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程序的更多相关文章

  1. C#语言————第一章 第一个C#程序

    第一章    第一个C#程序 ******************C#程序***************     ①:建立项目:文件-->新建-->项目-->c#-->控制台程 ...

  2. Pro ASP.NET MVC –第二章 第一个MVC程序

    学习一个软件开发框架的最有效的方式就是了解并使用它.在本章,你将会创建一个简单基于ASP.NET MVC Framework的数据-实体应用程序.我们会该程序划分成若干小块,每次介绍一个部分,以便你能 ...

  3. C#第一章 第一个C#程序

    第一个C#程序 namespace 是C#中组织代码的方式,它的作用那个类似java中的包 using 在Java中作用如果导入其他包 应该是用import关键字而在C#中应使用using关键字来引用 ...

  4. 从零开始学习Hadoop--第2章 第一个MapReduce程序

    1.Hadoop从头说 1.1 Google是一家做搜索的公司 做搜索是技术难度很高的活.首先要存储很多的数据,要把全球的大部分网页都抓下来,可想而知存储量有多大.然后,要能快速检索网页,用户输入几个 ...

  5. 金三银四背后,一个 Android 程序员的面试心得

    回顾一下自己这段时间的经历,九月份的时候,公司通知了裁员,我匆匆忙忙地出去面了几家,但最终都没有拿到offer,我感觉今年的寒冬有点冷.到十二月份,公司开始第二波裁员,我决定主动拿赔偿走人.后续的面试 ...

  6. 《C++ Without Fear》 第1章 第一个C++程序

    机器码,CPU的“母语”,每条计算机指令就是一个由1和0构成的独一无二的组合(或代码). endl是“endl line”的缩写,所以它应该念作“end ELL”而不是“end ONE”.

  7. 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...

  8. 从安装Mac OS X虚拟机到第一个IOS程序

    对于纯粹地抄这种行为是比较抵触的,别人已经写得挺好的东西没必要又去写一遍,但如果不写经验来看下次再做时自己又要重复百度筛选一遍,所以还是要记一记. 之前要获取IOS静态库的版本,但一直以来没有Mac没 ...

  9. “全栈2019”Java第四章:创建第一个Java程序

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

随机推荐

  1. mysql 触发器(Trigger)简明总结和使用实例

    一,什么触发器 1,个人理解触发器,从字面来理解,一触即发的一个器,简称触发器(哈哈,个人理解),举个例子吧,好比天黑了,你开灯了,你看到东西了.你放炮仗,点燃了,一会就炸了.2,官方定义触发器(tr ...

  2. 华三IRF的配置

    https://blog.csdn.net/VictoryKingLIU/article/details/79255901 拓扑结构 1 配置成员编号(重启) 2 配置成员优先级(大的主设备) 3 配 ...

  3. c#程序员机试题

    一.题目: 有一数组: int[] arr = new int[] { 48,1,3,55,15,29,12,33,26,41,56,32}; 1.求出最大值 2.按每个数字的10位数分组(说明:0~ ...

  4. Linux驱动之IIC总线

    <作用> 电子设备中有很多IIC设备之间需要进行相互通信,这样就产生了IIC总线,常用来实现设备之间的数据通信.   <IIC总线结构> IIC总线只有两条线,一条是串行数据线 ...

  5. PHP 笔记——面向对象编程知识点

    类是属性和方法的集合,是面向对象编程方式的核心和基础,通过类可以将零散的用于实现某项功能的代码进行有效管理. 类是由class关键字.类名和成员组成的,类名不区分大小写. 在类中定义常量使用关键字 c ...

  6. [CF1053C]Putting Boxes Together(线段树)

    http://codeforces.com/blog/entry/62013 两个结论: 1.一定有一个箱子不用动. 2.不动的箱子一定是加权前缀和为S/2的那个. 1显然,2由1易得. 于是问题变为 ...

  7. 浅谈期望的线性性(可加性)【CodeForces280c】【bzoj3036】【bzoj3143】

    [pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=63399955 向大(hei)佬(e)势力学(di ...

  8. BZOJ 1588: [HNOI2002]营业额统计 双向链表

    BZOJ 1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 512 MBSubmit: 9619  Solved: 3287 题目连接 ht ...

  9. BZOJ 1012: [JSOI2008]最大数maxnumber 单调队列/线段树/树状数组/乱搞

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 4750  Solved: 2145[Submi ...

  10. Codeforces Round #287 (Div. 2) B. Amr and Pins 水题

    B. Amr and Pins time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...