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. vscode 配置import @ 路径提示及代码智提

    1.安装插件:Path Intellisense 2.配置: "path-intellisense.mappings": { "@": "${work ...

  2. 【基础知识】C#数据库中主键类型的选择

    主键在数据库中占有很大的地位,对于表的关联性,和数据的唯一识别性有重要的作用: 1,在C#开发中,Int自增字段和Guid(数据库中是uniqueidentifier类型)可设置为主键: 1>G ...

  3. dSploitzANTI渗透教程之修改MAC地址与Wifi监听器

    dSploitzANTI渗透教程之修改MAC地址与Wifi监听器 dSploitzANTI基本配置 渗透测试是一种安全性较大的工作.所以,在实施渗透测试之前进行一些简单设置.如修改MAC地址.了解网络 ...

  4. 表单验证插件validate

    http://www.runoob.com/jquery/jquery-plugin-validate.html <!DOCTYPE html> <html lang="e ...

  5. Java实现杨辉三角形

    Java实现杨辉三角形 一.源代码:YFTriangle.java package cn.com.zfc.day009; import java.util.Scanner; /** * 打印杨辉三角形 ...

  6. BZOJ.3771.Triple(母函数 FFT 容斥)

    题目链接 \(Description\) 有\(n\)个物品(斧头),每个物品价值不同且只有一件,问取出一件.两件.三件物品,所有可能得到的价值和及其方案数.\((a,b),(b,a)\)算作一种方案 ...

  7. Mysql 千万级快速查询|分页方案

    1.简单的 直接查主键id SELECT id FROM tblist WHERE LIMIT 500000,10 2对于有where 条件,又想走索引用limit的,必须创建一个索引,将where  ...

  8. 【洛谷】2602: [ZJOI2010]数字计数【数位DP】

    P2602 [ZJOI2010]数字计数 题目描述 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 输入输出格式 输入格式: 输入文件中仅包含一行两个整数a ...

  9. Nginx负载均衡的五种策略

    nginx可以根据客户端IP进行负载均衡,在upstream里设置ip_hash,就可以针对同一个C类地址段中的客户端选择同一个后端服务器,除非那个后端服务器宕了才会换一个. nginx的upstre ...

  10. spring---aop(5)---Spring AOP的配置的背后的配置

    写在前面 Spring AOP中Pointcut,dvice 和 Advisor三个概念 1)切入点 Pointcut 在介绍Pointcut之前,有必要先介绍 Join Point(连接点)概念. ...