Rabbitmq异步发布(简单demo)

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值