Pom
<dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>5.8.0</version> </dependency>
工具类
Host UserName paw 记得更改为自己的 public class RabbtiUtil { public static Channel getChannel() throws IOException, TimeoutException { ConnectionFactory factory = new ConnectionFactory(); factory.setHost("***.***.*.***"); factory.setUsername("test"); factory.setPassword("123"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); return channel; } }
写个main方法
//批量发消息的个数 public static final int message = 100; public static void main(String[] args) throws Exception { //1.异步批量确认 发布100个异步确定消息,耗时6ms Confirm.publishInthows(); }
//异步发布确认 public static void publishInthows()throws Exception{ Channel channel = RabbtiUtil.getChannel(); //队列声明 String quer = UUID.randomUUID().toString(); channel.queueDeclare(quer,false,false,false,null); //开启发布确认 channel.confirmSelect(); /** * 线程安全有序的一个哈希表 适用高并发情况 *1.轻松的将序号与消息进行关联 * 2.轻松的批量删除条目 只要给到序号 * */ ConcurrentSkipListMap<Long,String> outstandingConfirms= new ConcurrentSkipListMap<>(); //消息确认成功回调函数 ConfirmCallback confirmCallback = (long var1, boolean var3)->{ if (var3){ //2.删除已经确认的消息 ConcurrentNavigableMap<Long, String> NavigableMap = outstandingConfirms.headMap(var1); NavigableMap.clear(); }else { outstandingConfirms.remove(var1); } System.out.println("确认的消息" + var1 ); }; //消息失败成功回调函数d /** * 1.消息的标记 * 2.是否为批量确认 */ ConfirmCallback confirmCallback1= (long var1, boolean var3)->{ //3.打印一下未确认的消息 String s = outstandingConfirms.get(var1); System.out.println("未确认的消息是"+s + "======未确认的消息" + var1 ); }; //消息监听 成功与失败 异步通知 /** * 1.监听那些消息成功了 * 2.监听那些消息失败了 */ channel.addConfirmListener(confirmCallback,confirmCallback1); //开始时间 long currentTimeMillis = System.currentTimeMillis(); //批量发送 for (int i = 0; i < message; i++) { String message = "消息" +i; channel.basicPublish("",quer,null,message.getBytes()); //1.此处记录下所以要发送的消息 消息总和 outstandingConfirms.put(channel.getNextPublishSeqNo(),message); } //结束时间 long end = System.currentTimeMillis(); System.out.println("发布" +message+ "个异步确定消息,耗时" +(end-currentTimeMillis)+ "ms");
消费者
这里链接工厂可以用上面的工具类(本人懒直接粘贴了)
public static void main(String[] args) throws IOException, TimeoutException {
//创建连接工厂、
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("***.***.*.***");
factory.setUsername("test");
factory.setPassword("123");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
//声明 接受消息
DeliverCallback deliverCallback = (String var1, Delivery var2)->{
System.out.println(new String(var2.getBody()));
};
//取消消息回调
CancelCallback cancelCallback = (String var1)->{
System.out.println("消息消费被中断");
};
/***
* 消费者消费消息
* 1.消费那个队列
* 2.消费成功之后是否要自动应答 true 自动应答 false手动应答
* 3.消费者未成功消费的回调
* 4.消费者取消消费的回调
*/注意由于之前是使用uuid生成的队列,自己可以定义一个拿来使用。MQ上可以找到对应的名称进行消费
channel.basicConsume("01eb1cac-475b-4b70-9cb1-a647d88b26a4",true,deliverCallback,cancelCallback);
}