rabbitMQ消息轮训
- 抽取工具类
package utils;
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 RabbitMqUtils {
//得到一个连接的channel
public static Channel getChannel() throws IOException, TimeoutException {
//创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
//工厂ip 链接mQ队列
factory.setHost("124.220.3.19");
//用户名
factory.setUsername("root");
//密码
factory.setPassword("root");
//创建链接
Connection connection = factory.newConnection();
//获取信道
Channel channel = connection.createChannel();
return channel;
}
}
消费者代码
package two;
import com.rabbitmq.client.CancelCallback;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;
import utils.RabbitMqUtils;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* 这是一个工作线程 (相当于消费者)
*/
public class Worker01 {
//队列的名称
public static final String QUEUE_NAME = "hello";
//接收消息
public static void main(String[] args) throws IOException, TimeoutException {
Channel channel = RabbitMqUtils.getChannel();
//消息的接收
//声明_接收消息
DeliverCallback deliverCallback = (consumerTag, message) -> {
System.out.println("接收到的消息" + new String(message.getBody()));
};
//取消消息时的回调
CancelCallback cancelCallback = consumerTag -> {
System.out.println(consumerTag + "消息者取消消费接口回调逻辑");
};
/**
* 消费者消费消息
* 1.消费哪个队列
* 2.消费之后是否要自动应答 true自动 false手动
* 3.消费未成功的回调
* 4.消费者取消消费回调
*/
System.out.println("C2_等待接收消息......");
channel.basicConsume(QUEUE_NAME, true, deliverCallback, cancelCallback);
}
}
生产者代码
package two;
import com.rabbitmq.client.Channel;
import utils.RabbitMqUtils;
import java.io.IOException;
import java.util.Scanner;
import java.util.concurrent.TimeoutException;
/**
* 生产者 发送大量的消息
*/
public class Task01 {
//队列的名称
public static final String QUEUE_NAME = "hello";
//发送大量的消息
public static void main(String[] args) throws IOException, TimeoutException {
Channel channel = RabbitMqUtils.getChannel();
//队列的声明
/**
* 生成一个队列
* 1.队列名称
* 2.队列消息是否持久化(磁盘)默认存在内存上
* 3.该队列是否只供一个消费者进行消费 true是共享
* 4.是否自动删除 ,最后一个消费者断开后是否自动删除 true是删除
* 5. 其他参数
*/
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
//从控制台中接收信息
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String message = scanner.next();
/**
* 发送一个消息
* 1.发送到哪个交换机
* 2.路由的Key值是那个 本次是队列的名称
* 3.其他参数信息
* 4.发送消息的消息体
*/
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
System.out.println("发送消息完成:" + message);
}
}
}
运行结果
-
生产者发送消息
-
消费者1
-
消费者2
手动应答
- 睡眠工具类
package utils;
public class SleepUtils {
public static void sleep(int second) {
try {
Thread.sleep(1000 * second);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
- 生产者类
package three;
import com.rabbitmq.client.Channel;
import utils.RabbitMqUtils;
import java.io.IOException;
import java.util.Scanner;
import java.util.concurrent.TimeoutException;
/**
* 生产者 发送大量的消息
* 手动应答时是不丢失的 放回队列重新消费
*/
public class Task02 {
//队列的名称
public static final String TASK_QUEUE_NAME = "ack_queue";
//发送大量的消息
public static void main(String[] args) throws IOException, TimeoutException {
Channel channel = RabbitMqUtils.getChannel();
//队列的声明
/**
* 生成一个队列
* 1.队列名称
* 2.队列消息是否持久化(磁盘)默认存在内存上
* 3.该队列是否只供一个消费者进行消费 true是共享
* 4.是否自动删除 ,最后一个消费者断开后是否自动删除 true是删除
* 5. 其他参数
*/
channel.queueDeclare(TASK_QUEUE_NAME, false, false, false, null);
//从控制台中接收信息
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String message = scanner.next();
/**
* 发送一个消息
* 1.发送到哪个交换机
* 2.路由的Key值是那个 本次是队列的名称
* 3.其他参数信息
* 4.发送消息的消息体
*/
channel.basicPublish("", TASK_QUEUE_NAME, null, message.getBytes("UTF-8"));
System.out.println("发送消息完成:" + message);
}
}
}
- 消费者1
package three;
import com.rabbitmq.client.CancelCallback;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;
import utils.RabbitMqUtils;
import utils.SleepUtils;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* 应答
*/
public class Worker03 {
//队列的名称
public static final String TASK_QUEUE_NAME = "ack_queue";
//接收消息
public static void main(String[] args) throws IOException, TimeoutException {
Channel channel = RabbitMqUtils.getChannel();
System.out.println("C1_等待接收消息_时间较短......");
/**
* 消费者消费消息
* 1.消费哪个队列
* 2.消费之后是否要自动应答 true自动 false手动
* 3.消费未成功的回调
* 4.消费者取消消费回调
*/
//消息的接收
//声明_接收消息
DeliverCallback deliverCallback = (consumerTag, message) -> {
SleepUtils.sleep(1);
System.out.println("接收到的消息" + new String(message.getBody()));
//手动应答
/**
* 1.消息的标记 tag
* 2.是否批量应答
*/
channel.basicAck(message.getEnvelope().getDeliveryTag(),false);
};
//取消消息时的回调
CancelCallback cancelCallback = consumerTag -> {
System.out.println(consumerTag + "消息者取消消费接口回调逻辑");
};
boolean autoAck = false;
channel.basicConsume(TASK_QUEUE_NAME, autoAck, deliverCallback, cancelCallback);
}
}
- 消费者2
package three;
import com.rabbitmq.client.CancelCallback;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;
import utils.RabbitMqUtils;
import utils.SleepUtils;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class Worker04 {
//队列的名称
public static final String TASK_QUEUE_NAME = "ack_queue";
//接收消息
public static void main(String[] args) throws IOException, TimeoutException {
Channel channel = RabbitMqUtils.getChannel();
System.out.println("C2_等待接收消息_时间较长......");
/**
* 消费者消费消息
* 1.消费哪个队列
* 2.消费之后是否要自动应答 true自动 false手动
* 3.消费未成功的回调
* 4.消费者取消消费回调
*/
//消息的接收
//声明_接收消息
DeliverCallback deliverCallback = (consumerTag, message) -> {
SleepUtils.sleep(30);
System.out.println("接收到的消息" + new String(message.getBody()));
//手动应答
/**
* 1.消息的标记 tag
* 2.是否批量应答
*/
channel.basicAck(message.getEnvelope().getDeliveryTag(),false);
};
//取消消息时的回调
CancelCallback cancelCallback = consumerTag -> {
System.out.println(consumerTag + "消息者取消消费接口回调逻辑");
};
boolean autoAck = false;
channel.basicConsume(TASK_QUEUE_NAME, autoAck, deliverCallback, cancelCallback);
}
}
- 运行结果