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);
}

1002

被折叠的 条评论
为什么被折叠?



