1、什么是RabbitMQ

  MQ(Message Queue):消息队列,是服务端设计的一个可以存储大量消息的队列,并提供客户端操作队列的方法:生产队列(向队列中添加数据)、消费队列(从队列中取数据)。RabbitMQ就是基于消息队列的一个典型应用。RabbitMQ除了普通的生产消费功能,还有一些高级功能:公平分发 ,轮询分发,路由模式,通配符模式,发布订阅,队列持久化。

2、java实现RabbitMQ的连接

2.1、RabbitMQ客户端jar包

<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>4.0.2</version>
</dependency>

2.2、java连接RabbitMQ工具类

public class ConnectionUtil
{
private static Logger logger = Logger.getLogger(ConnectionUtil.class); public static Connection getConnection()
{
try
{
Connection connection = null;
//定义一个连接工厂
ConnectionFactory factory = new ConnectionFactory();
//设置服务端地址(域名地址/ip)
factory.setHost("127.0.0.1");
//设置服务器端口号
factory.setPort(5672);
//设置虚拟主机(相当于数据库中的库)
factory.setVirtualHost("/");
//设置用户名
factory.setUsername("admin");
//设置密码
factory.setPassword("888888");
connection = factory.newConnection();
return connection;
}
catch (Exception e)
{
return null;
}
}
}

2.3、简单的生产者-消费者模式

  下图取自于官方网站(RabbitMQ)的生产消费模式的工作图

P:消息的生产者

C:消息的消费者

红色:队列

生产者将消息发送到队列,消费者从队列中获取消息。

2.4、生产者(Send)

public class Send
{
//队列名称
private static final String QUEUE_NAME = "test_simple_queue"; public static void main(String[] args)
{
try
{
//获取连接
Connection connection = ConnectionUtil.getConnection();
//从连接中获取一个通道
Channel channel = connection.createChannel();
//声明队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
String message = "This is simple queue";
//发送消息
channel.basicPublish("", QUEUE_NAME, null, message.getBytes("utf-8"));
System.out.println("[send]:" + message);
channel.close();
connection.close();
}
catch (IOException | TimeoutException e)
{
e.printStackTrace();
}
}
} 运行结果:
[send]:This is simple queue

2.5、消费者(Receive)

public class Receive
{
//队列名称
private static final String QUEUE_NAME = "test_simple_queue"; public static void main(String[] args)
{
try
{
//获取连接
Connection connection = ConnectionUtil.getConnection();
//从连接中获取一个通道
Channel channel = connection.createChannel();
//声明队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
//定义消费者
DefaultConsumer consumer = 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);
}
};
//监听队列
channel.basicConsume(QUEUE_NAME, true, consumer);
}
catch (IOException | ShutdownSignalException | ConsumerCancelledException e)
{
e.printStackTrace();
}
}
} 运行结果:
[Receive]:This is simple queue

总结:简单的生产者-消费者模式实现了生产者向队列里生产数据,消费者启动后可以一直监听队列,不断的从队列里取出数据。

注意:本文仅代表个人理解和看法哟!和本人所在公司和团体无任何关系!

RabbitMQ学习第一记:用java连接RabbitMQ的更多相关文章

  1. RabbitMQ学习笔记三:Java实现RabbitMQ之与Spring集成

    搭建好maven项目环境,加入RabbitMQ依赖包 <dependency> <groupId>org.springframework.amqp</groupId> ...

  2. RabbitMQ学习笔记二:Java实现RabbitMQ

    本地安装好RabbitMQ Server后,就可以在Java语言中使用RabbitMQ了. RabbitMQ是一个消息代理,从"生产者"接收消息并传递消息至"消费者&qu ...

  3. 官网英文版学习——RabbitMQ学习笔记(一)认识RabbitMQ

    鉴于目前中文的RabbitMQ教程很缺,本博主虽然买了一本rabbitMQ的书,遗憾的是该书的代码用的不是java语言,看起来也有些不爽,且网友们不同人学习所写不同,本博主看的有些地方不太理想,为此本 ...

  4. (转) RabbitMQ学习之helloword(java)

    http://blog.csdn.net/zhu_tianwei/article/details/40835555 amqp-client:http://www.rabbitmq.com/java-c ...

  5. Java连接RabbitMQ之创建连接

    依赖包: <dependencies> <dependency> <groupId>junit</groupId> <artifactId> ...

  6. 用java连接RabbitMQ

    pom.xml <dependencies> <dependency> <groupId>junit</groupId> <artifactId& ...

  7. (转)RabbitMQ学习之路由(java)

    http://blog.csdn.net/zhu_tianwei/article/details/40887755 参考:http://blog.csdn.NET/lmj623565791/artic ...

  8. (转) RabbitMQ学习之工作队列(java)

    http://blog.csdn.net/zhu_tianwei/article/details/40887717 参考:http://blog.csdn.NET/lmj623565791/artic ...

  9. RabbitMQ的安装和使用Python连接RabbitMQ

    绪论 这里的环境使用的是Mac OS X系统,所有的配置和使用都是基于Mac OS X 和Python 2.7 以及对应的pika库的. RabbitMQ的安装和配置 安装部分 #brew insta ...

随机推荐

  1. 【Linux】- Systemd 实战篇

    转自:阮一峰的网络日志 一.开机启动 对于那些支持 Systemd 的软件,安装的时候,会自动在/usr/lib/systemd/system目录添加一个配置文件. 如果你想让该软件开机启动,就执行下 ...

  2. 并发编程之Android中AsyncTask使用详解(四)

    更多Android高级架构进阶视频免费学习请点击:[https://space.bilibili.com/474380680] 在Android中我们可以通过Thread+Handler实现多线程通信 ...

  3. 《深入理解Java虚拟机》-(实战)boolean类型在虚拟机中是如何处理的

    这里先引出Java的8大基本类型.直接上图吧. 可以看到,除了boolean和char类型之外,越往下的类型的值域是包含以上的值域的.因此,从上面的基本类型转换成下面的基本类型,无需强制转换.关于它们 ...

  4. LCA的 Trajan 算法

    参考博客 参考博客 根据博客的模拟,就可以知道做法和思想. 现在就是实现他. 例题 :hdu  2586  题意:m 个询问,x  到  y  的距离,我们的思想就是求出:x到根的距离+y到根的距离- ...

  5. 【HDUOJ】1257 最少拦截系统

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1257 题意:经典题. 题解:最长上升子序列. 代码: #include <iostream> ...

  6. python的三种特性

    1.封装 什么时候用函数? 各个函数之间是独立的且无共用的数据. 什么时候用类? 函数之间是相关的,且有共用的数据,则可以使用类来封装. 所谓的封装: (1)使用构造方法将内容封装到 对象 中. (2 ...

  7. AForge.Video.FFMPEG库几个注意事项

    同事开发过程中,读写摄像头遇到的问题. 在录制和取消反复切换就会报内存越界的错误,这是由于open和close没有线程同步造成的. 参考如下文章得到了解决思路,最后Open和Close用一个静态锁解决 ...

  8. jsonp的实现原理

    jsonp的实现原理 由于浏览器的安全性(同源策略)限制,不允许AJAX访问协议不同或域名不同或端口号不同的数据接口: 可以通过动态创建script标签的方式,把script标签的src属性指向数据接 ...

  9. C#编程入门--MYSQLHELPER

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...

  10. 随笔记录 shell脚本相关内容 2019-8-26

    字符串截取: 假设变量为var=http://www.hao.com/123.htm1. # 号截取,删除左边字符,保留右边字符.echo ${var#*//}其中 var 是变量名,# 号是运算符, ...