一、概述

前面学过ActiveMQ。ActiveMQ主要是实现的JMS规范,而RabbitMQ就是AMQP的一个具体实现。

RabbitMQ里面有几个概念:生产者、消费者、消息、交换器、路由键、队列、绑定、虚拟主机

1.生产者角度

  生产者产生数据,然后根据指定交换器和路由键将数据发送到消息队列RabbitMQ。为了保证交换器的存在,我们每次在初始化生产者的时候都要尝试去创建一个交换器。

  交换器总共有4种类型:

  1. direct 路由键完全匹配
  2. fanout 消息广播,将忽略路由键
  3. topic 通过“*”和“#”的通配符进行绑定。注意:”.”将路由键分为了几个标识符,“*”匹配1个,“#”匹配一个或多个
  4. headers 和direct类似,很少使用

2.消费者角度

  消费者主要就是获取并消费数据,因此需要创建一个队列,同时需要创建一个交换器(交换器在消费者和生产者都可以创建),然后将队列和交换器通过路由键进行绑定。最后就可以根据队列进行数据的消费了。

二、Java代码

1.pom.xml

<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>4.0.2</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>

2.生产者代码

package cn.duanjt;

import java.io.IOException;
import java.util.concurrent.TimeoutException; import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory; /**
* 生产者
* @author 段江涛
* @date 2018-11-30
*/
public class Productor {
public static void main(String[] args) throws IOException, TimeoutException {
String ROUTE_KEY = "rabbitmq-duanjt";// 路由键名称
String EXCHANGE_NAME = "exchange-duanjt";// 交换器名称 ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.23.24");
factory.setPort(5672);
factory.setUsername("admin");
factory.setPassword("admin");
factory.setVirtualHost("/");//虚拟主机,可通过控制台查看 //创建连接和信道
Connection conn = factory.newConnection();
Channel channel = conn.createChannel(); // 创建一个交换器,参数为:交互器名称和交换器类型
// 注意:其实这个交换器只需要声明一次就可以,但是由于无法保证交换器已经存在了,所以我们每次都要声明
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT); for (int i = 0; i < 5; i++) {
String msg = "Hello world.I love you forever ===>" + i;
// 发布消息,需要参数:交换器,路由键。最后一个参数为消息内容
// 注意:RabbitMQ的消息类型只有一种,那就是byte[]
channel.basicPublish(EXCHANGE_NAME, ROUTE_KEY, null, msg.getBytes("utf-8")); System.out.println("send:" + msg);
} //关闭信道和连接
channel.close();
conn.close();
}
}

3.消费者代码

package cn.duanjt;

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.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.BuiltinExchangeType; public class Consumer {
public static void main(String[] args) throws IOException, TimeoutException {
String QUEUE_NAME = "queue-duanjt";// 队列名称
String ROUTE_KEY = "rabbitmq-duanjt";// 路由键名称
String EXCHANGE_NAME = "exchange-duanjt";// 交换器名称 ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.23.24");
factory.setPort(5672);
factory.setUsername("admin");
factory.setPassword("admin");
factory.setVirtualHost("/"); Connection conn = factory.newConnection();
Channel channel = conn.createChannel();
// 创建一个队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// 创建交换器
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);
// 将队列和交换器通过路由键进行绑定
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTE_KEY); //开始消费,第二个参数表示自动确认
channel.basicConsume(QUEUE_NAME, true, new DefaultConsumer(channel) {
// 当消息到达时执行回调方法
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body) throws IOException {
String message = new String(body, "utf-8");
System.out.println("[Receive]:" + message);
}
}); }
}

注意:

1.为了保证交换器的存在,所以消费者和生产者都要创建,因为不知道是消费者先启动还是生产者先启动

2.可以通过http://ip:15672 查看交换器、路由键和队列之间的关系

3.一个连接(Connection)可以创建多个信道(Channel)。每个信道也可以在独立的一个线程里面

4.一个队列可以有多个消费者,这种情况下,消息将在消费者之间进行轮询

Java 访问RabbitMQ的更多相关文章

  1. java访问修饰符

    了解面向对象思想的同学们,都知道"封装"这一基本特征,如何正确运用访问修饰符,恰恰能体现出封装的好坏. java访问修饰符有四个: 1)public:访问权限最高,其修饰的类.类变 ...

  2. [THINKING IN JAVA]访问权限控制

    6 访问权限控制 6.1 包:库单元 package.import.import *.import static: 修改classpath环境变量可以将自己写的类库添加至环境变量并在任何java程序中 ...

  3. java 访问 usb

    java 要访问 usb 设备,通常要自己写c/c++代码,然后再用 java 访问这些组件,以达到控制usb设备的目的.但现在有一个开源组件 libusb 帮我们做好了访问usb设备的封装(包括wi ...

  4. Java访问USB设备

    最近在用Java访问RDing设备,使用的是Java HID API.使用过程中发现一个问题,由于是嵌入式小白,不知道如何向USB设备发送report.于是想到可以看看自带的软件如何访问USB的.找到 ...

  5. java访问权限的问题

    java访问权限的问题 java 访问权限 修饰符 背景: 关于java中的四种访问修饰符,public ,default ,protected ,private的作用范围本以为很熟悉了,但碰到了这样 ...

  6. Hadoop(五)搭建Hadoop与Java访问HDFS集群

    前言 上一篇详细介绍了HDFS集群,还有操作HDFS集群的一些命令,常用的命令: hdfs dfs -ls xxx hdfs dfs -mkdir -p /xxx/xxx hdfs dfs -cat ...

  7. java访问权限修饰符

    作用域 当前类 同一package 子孙类 其他package public √ √ √ √ protected √ √ √ × friendly √ √ × × private √ × × × ja ...

  8. MinerQueue.java 访问队列

    MinerQueue.java 访问队列 package com.iteye.injavawetrust.miner; import java.util.HashSet; import java.ut ...

  9. 论Java访问权限控制的重要性

    人在什么面前最容易失去抵抗力? 美色,算是一个,比如说西施的贡献薄就是忍辱负重.以身报国.助越灭吴:金钱,算是另外一个,我们古人常说“钱乃身外之物,生不带来死不带去”,但我们又都知道“有钱能使鬼推磨” ...

随机推荐

  1. dubbo环境搭建与tomcat集成、DEMO示例、常见问题(最完整版本、带管理控制台、监控中心、zookeeper)

    以windows为例,linux基本相同,开发环境一般linux,个人环境一般windows(如果不开额外vm的话). 示例以dubbo官方自带demo为例子,进行整合和稍加修改测试. 0.dubbo ...

  2. Android开发发布真机调试

    使用真机测试原因: 1. 模拟器启动慢,真机测试速度较快 2. 有些程序在真机测试才有效,模拟器存在bug,结果要以真机为标准 连接方法: 1.设置手机为开发者模式(设置->关于手机->连 ...

  3. 03:git常见报错解决方法

    1.1 git常见报错解决方法 1.warning: LF will be replaced by CRLF in .idea/workspace.xml. 参考博客:https://www.cnbl ...

  4. 基于opencv和QT的摄像头采集代码( GoQTtemplate3持续更新)

    在Linux操作系统上,编写带界面的图像处理程序,选择opencv+QT是一种很好的选择.GoQTtemplate3是我为编写Linux下图像处理程序实现的框架,希望能够为大家解决Linux环境下桌面 ...

  5. \n和\r区别

    转载:https://www.cnblogs.com/hq233/p/6389234.html 符号    ASCII码      意义\n        10        换行NL\r       ...

  6. VC++使用MapFileAndCheckSum完成自检测

    转载:https://blog.csdn.net/lekonpeng/article/details/4150464 当我们完成一个工程,编译成可执行文件后,一般是不希望这个可执行文件被人改动的,那么 ...

  7. 第一次参加acm区域赛

    什么,这周天就要去参加acm焦作赛,简直不敢相信.从大一暑假七月份中旬到今天十一月23日,加入acm将近四个多月的时间,如今到了检验自己的时候了.aaaaaaaaaa.乌拉,必胜.打印个模板,在跑个步 ...

  8. Python 处理 CSV/EXCEL 表格文件

    只想说,数据挖掘工作,80%时间都花在处理数据上了,这句话真不假! 最近和小伙伴组了个队参加数据分析比赛,记录下我处理 csv 文件的一些步骤吧: 修改csv文件 可以用csv模块1,官方文档2 im ...

  9. POJ 1486 Sorting Slides(二分图完全匹配必须边)题解

    题意:给你n张照片的范围,n个点的坐标,问你能唯一确定那几个点属于那几张照片,例如样例中4唯一属于A,2唯一属于C,1唯一属于B,3唯一属于C 思路:进行二分图完全匹配,怎么判断唯一属于?匹配完之后删 ...

  10. 初识Java框架

    Spring boot>spring>spring mvc SSH:struts2+spring+hibernate SSM(SSH的改进): (过去)spring+struts2+MyB ...