一、文章简介
在本教程的这一部分中,我们将用Java编写两个程序。发送单个消息的生产者和接收消息并打印出来的消费者。我们将介绍Java API中的一些细节。
本文我们将创建一个生产者一个消费者,模拟通信。
二、引入配置文件、编写配置类
<!--rabbitmq消息队列-->
<dependency>
<groupId>com.wwj</groupId>
<artifactId>rabbit-mq</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
rabbitmq:
host: 127.0.0.1
port: 5672
virtual-host: srb-host
username: admin
password: 123456
三、使用模板
创建生产者代码
//创建连接mq的连接工厂对象
ConnectionFactory connectionFactory = new ConnectionFactory();
//设置连接rabbitmq的主机
connectionFactory.setHost("192.168.200.130");
//设置端口号
connectionFactory.setPort(5672);
//设置连接哪个虚拟主机
connectionFactory.setVirtualHost("/ems");
//设置访问虚拟主机的用户名和密码
connectionFactory.setUsername("ems");
connectionFactory.setPassword("123");
Connection connection = connectionFactory.newConnection();
//创建通道
Channel channel = connection.creatChannel();
/*
* 通道绑定对应的消息队列
* 参数一:queue 队列名称,如果队列不存在自动创建
* 参数二:durable 用来定义队列特性是否要持久化 true 持久化队列 false 不持久化
* 参数三:exclusive 是否独占队列 true 独占 false 不独占
* 参数四:autoDelete 是否在消费完成后自动删除队列, true 自动删除 false 不自动删除
* 参数五:arguments 额外附加参数
*/
channel.queueDeclare("hello",false,false,false,null);
/*
*发布消息
* 参数1; exchange 交换机名称
* 参数2: routinqKey 队列名称
* 参数3:传递消息额外设置
* 参数4:消息的具体内容
*/
channel.basicPublish("","hello",null,"hello rabbitmq".getBytes());
//将队列中的消息持久化
channel.basicPublish("","hello", MessageProperties.PERSISTENT_TEXT_PLAIN,"hello rabbitmq".getBytes());
创建消费者代码
//创建连接mq的连接工厂对象
ConnectionFactory connectionFactory = new ConnectionFactory();
//设置连接rabbitmq的主机
connectionFactory.setHost("192.168.200.130");
//设置端口号
connectionFactory.setPort(5672);
//设置连接哪个虚拟主机
connectionFactory.setVirtualHost("/ems");
//设置访问虚拟主机的用户名和密码
connectionFactory.setUsername("ems");
connectionFactory.setPassword("123");
Connection connection = connectionFactory.newConnection();
//创建通道
Channel channel = connection.creatChannel();
/*
* 通道绑定对应的消息队列
* 参数一:queue 队列名称,如果队列不存在自动创建
* 参数二:durable 用来定义队列特性是否要持久化 true 持久化队列 false 不持久化
* 参数三:exclusive 是否独占队列 true 独占 false 不独占
* 参数四:autoDelete 是否在消费完成后自动删除队列, true 自动删除 false 不自动删除
* 参数五:arguments 额外附加参数
*/
channel.queueDeclare("hello",false,false,false,null);
/*
*消费消息
* 参数1:消费那个队列的消息 队列名称
* 参数2:开始消息的自动确认机制
* 参数3:消费时的回调接口
*/
channel.basicConsume("hello",true,new DefaultConsumer(channel){
//最后一个参数:消息队列中取出的消息
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("new String(body) = "+new String(body));
}
});
四、工作队列
工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务,而不得不等待它完成。相反我们安排任务在之后执行。我们把任务封装为消息并将其发送到队列。在后台运行的工作进程将弹出任务并最终执行作业。当有多个工作线程时,这些工作线程将一起处理这些任务。当存在工作队列,两个消费者是竞争的关系,所以一个消息发送给哪个消费者是不确定的。