前提是在rabbitmq中web可视化管理界面增加管理用户root,增加虚拟库/ems,以下代码方可运行成功
docker中安装rabbiMQ
docker pull rabbitmq:3-management
在docker中启动rabbitMQ命令:
docker run -d --hostname my-rabbit --name rabbit -p 15672:15672 -p 5672:5672 rabbitmq:3-management
首先学习直连模型(一对1模型):
rabbitMQ之消息发送方:
package com.example.rabbitmq;
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 TestSendMessage {
public static void main(String[] args) {
ConnectionFactory connectionFactoryfactory=new ConnectionFactory();
connectionFactoryfactory.setHost("192.168.142.128");
connectionFactoryfactory.setPort(5672);
connectionFactoryfactory.setVirtualHost("/ems");
connectionFactoryfactory.setUsername("root");
connectionFactoryfactory.setPassword("root");
Connection connection;
try {
//获取链对象
connection = connectionFactoryfactory.newConnection();
//获取链接通道
Channel channel=connection.createChannel();
//参数1.为队列名称,没有创建,后面自动创建
//参数2用来定义队列是否要持久化,true持久化,false为不持久化
//参数3.exclusive是否独占队列,true独占队列,false不独占
//参数4.autoDelete:是否在队列消费完成后自动删除队列,true自动删除,false不自动删除
//参数5.额外附加参数
channel.queueDeclare("hello", false, false, false, null);
//参数1交换机名称,参数2队列名称,参数3.传递消息额外设置,参数4:消息的具体内容
channel.basicPublish("", "hello", null, "hello rabbitmq".getBytes());
channel.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TimeoutException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
消费者代码
//参数
//参数1.为队列名称,没有创建,后面自动创建
//参数2用来定义队列是否要持久化,true持久化,false为不持久化
//参数3.exclusive是否独占队列,true独占队列,false不独占
//参数4.autoDelete:是否在队列消费完成后自动删除队列,true自动删除,false不自动删除
//参数5.额外附加参数
channel.basicQos(1); //保证通道里面只有一条消息被处理,防止数据多条的时候丢失
channel.queueDeclare("work",true,false,false,null);
//参数1交换机名称,参数2队列名称,参数3.传递消息额外设置,参数4:消息的具体内容
channel.basicConsume("work", false,new DefaultConsumer(channel) {
public void handleDelivery(String consumeTag,Envelope envelope,AMQP.BasicProperties properties,byte[] body) throws IOException {
System.out.println("我是接受者二="+new String(body));
//参数1.确认队列中的具体消息;参数2:是否开启多个消息同时确定
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
channel.basicAck(envelope.getDeliveryTag(), false);
}
第二种是可以把消费者在复制一个。