分为生产者和消费者,生产者发送消息,消费者消费消息
生产者
package com.zh.rabbitMq.simple;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class Producer {
public static void main(String[] args){
//所有的中间件技术都是基于tcp/ip协议基础之上构建新的协议规范,只不过rabbitmq遵循的是amqp
//ip port
Connection connection = null;
Channel channel = null;
try {
//1. 创建连接工程
ConnectionFactory connectionFactory = new ConnectionFactory();
//这里写你rabbitmq的ip地址
connectionFactory.setHost("172.16.16.115");
connectionFactory.setPort(5672);
//账号
connectionFactory.setUsername("admin");
//密码
connectionFactory.setPassword("admin");
connectionFactory.setVirtualHost("/"); //设置虚拟访问节点
//2. 创建连接Connection
connection = connectionFactory.newConnection("生产者");
//3. 通过连接获取通道Channel
channel = connection.createChannel();
//4. 通过通道创建交换机,队列,绑定关系,路由key,发送消息,和接收消息
String queueName = "queue1";
//交换机的名称
String exchangeName = "direct_message_exchange";
// 交换机的类型 direct/topic/fanout/headers
String exchangeType = "direct";
/**
* 新建交换机
* @params1 交换机的名称
* @params2 交换机的类型
* @params3 是否持久化 false为不持久化 重启服务器 交换机就删除了 否则相反
*/
channel.exchangeDeclare(exchangeName,exchangeType,true);
/**
* 新建队列
* @params1 对列的名称
* @params2 是否要持久化 durable = false 所谓持久化消息是否存盘,如果false 非持久化 true是持久化? 非持久化会存盘吗 会存盘 但是重启服务就没有了
* @params3 排他性,是否独占独立
* @params4 是否自动删除,随着最后一个消费者消费完毕消息以后是否把队列自动删除
* @params5 携带一些附加参数
*/
channel.queueDeclare("queue5",true,false,false,null);
channel.queueDeclare("queue6",true,false,false,null);
channel.queueDeclare("queue7",true,false,false,null);
//队列绑定交换机
channel.queueBind("queue5",exchangeName,"order");
channel.queueBind("queue6",exchangeName,"order");
channel.queueBind("queue7",exchangeName,"course");
//5. 准备消息内容
String message = "hello sms";
//6. 发送消息给我们的队列queue
channel.basicPublish(exchangeName,"order",null,message.getBytes());
System.out.println("消息发送成功");
} catch (Exception e) {
e.printStackTrace();
} finally {
//7. 关闭通道
try {
channel.close();
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
//8. 关闭连接
try {
connection.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
消费者
package com.zh.rabbitMq.simple;
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class Consumer implements Runnable{
public static void main(String[] args) {
//这里图省事用的多线程获取的 也可以不用多线程
new Thread(new Consumer(),"queue5").start();
new Thread(new Consumer(),"queue6").start();
new Thread(new Consumer(),"queue7").start();
}
public void run(){
//所有的中间件技术都是基于tcp/ip协议基础之上构建新的协议规范,只不过rabbitmq遵循的是amqp
//ip port
Connection connection = null;
Channel channel = null;
try {
//1. 创建连接工程
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("172.16.16.115");
connectionFactory.setPort(5672);
connectionFactory.setUsername("admin");
connectionFactory.setPassword("admin");
connectionFactory.setVirtualHost("/"); //设置虚拟访问节点
//2. 创建连接Connection
connection = connectionFactory.newConnection("生产者");
//3. 通过连接获取通道Channel
channel = connection.createChannel();
//4. 通过通道创建交换机,队列,绑定关系,路由key,发送消息,和接收消息
String name = Thread.currentThread().getName();
channel.basicConsume(name, true, new DeliverCallback() {
public void handle(String s, Delivery delivery) throws IOException {
System.out.println(Thread.currentThread().getName() + "收到的消息式:" + new String(delivery.getBody(), "UTF-8"));
}
}, new CancelCallback() {
public void handle(String s) throws IOException {
System.out.println("接受失败了...........");
}
});
System.out.println("开始接受消息");
System.in.read();
} catch (Exception e) {
e.printStackTrace();
} finally {
//7. 关闭通道
try {
channel.close();
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
//8. 关闭连接
try {
connection.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
轮训分发和公平分发的生产者都跟上面的代码一样只有消费者有区别
默认就是轮训分法 所以上面的代码就是轮训分法的实现方式
公平分发
package com.zh.rabbitMq.work.lunxun;
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class Work2 {
public static void main(String[] args) {
//所有的中间件技术都是基于tcp/ip协议基础之上构建新的协议规范,只不过rabbitmq遵循的是amqp
//ip port
Connection connection = null;
Channel channel = null;
try {
//1. 创建连接工程
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("172.16.16.115");
connectionFactory.setPort(5672);
connectionFactory.setUsername("admin");
connectionFactory.setPassword("admin");
connectionFactory.setVirtualHost("/"); //设置虚拟访问节点
//2. 创建连接Connection
connection = connectionFactory.newConnection("生产者");
//3. 通过连接获取通道Channel
channel = connection.createChannel();
//4. 通过通道创建交换机,队列,绑定关系,路由key,发送消息,和接收消息
//这里设置每次消费几条消息 1代表每次消费一条消息 数字大小根据自己服务器配置磁盘等来定 公平分发此处必须设置
channel.basicQos(1);
//公平分发的队列需要是final关键词修饰的 故重新声明一下
final Channel finalChannel = channel;
//与轮训分法的区别 就是队列名之后的 布尔值 这里为false即公平分发 为true就是轮循
channel.basicConsume("queue1", false, new DeliverCallback() {
public void handle(String s, Delivery delivery) throws IOException {
// 关闭自动确认,改为手动确认消息 此处也是必须设置
finalChannel.basicAck(delivery.getEnvelope().getDeliveryTag(),false);
System.out.println("Work2-" + "收到的消息是:" + new String(delivery.getBody(), "UTF-8"));
}
}, new CancelCallback() {
public void handle(String s) throws IOException {
System.out.println("接受失败了...........");
}
});
System.out.println("work开始接受消息");
System.in.read();
} catch (Exception e) {
e.printStackTrace();
} finally {
//7. 关闭通道
try {
channel.close();
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
//8. 关闭连接
try {
connection.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}