RabbitMq-work模式

下面展示一些 内联代码片

public class WorkTest {
    private static String queryname="WORK";
    @Test
    public void publish() throws IOException, TimeoutException {
        //获取connection
        Connection connection = RabbitMQUtil.getconnection();
        //创建channel
        Channel channel = connection.createChannel();
        String msg="Hellow-Work!";
        //参数1:queue - 指定队列的名称
        //参数2:durable - 当前队列是否需要持久化(true)
        //参数3:exclusive - 是否排外(conn.close() - 当前队列会被自动删除,当前队列只能被一个消费者消费)
        //参数4:autoDelete - 如果这个队列没有消费者在消费,队列自动删除
        //参数5:arguments - 指定当前队列的其他信息
        channel.queueDeclare(queryname,true,false,false,null);
        for (int i=0;i<100;i++){
             channel.basicPublish("",queryname,null,(i+msg).getBytes());

        }
        //ps:exchange是不会帮你将消息持久化到本地 ,Queue才会帮你持久化信息
        System.out.println("生产者发布消息成功");
        //释放资源
        channel.close();
        connection.close();
    }
    @Test
    public void consums1() throws IOException, TimeoutException {
        //获得连接对象
        Connection connection = RabbitMQUtil.getconnection();
        //创建channel
        Channel channel = connection.createChannel();
        channel.queueDeclare(queryname,true,false,false,null);
        //1 指定当前消费者,一次消费多少个消息   没有过来的消息  还在队列中保存  这样设置  不会造成消息丢失
        //   因为 假如不指定 一次消费一条消息  就有可能有多条消息 到达消费者  此时消费者一旦宕机  到达消费者的消息也就丢了
        // 所以 消息 从队列 到 消费者 一次来一条  免得 过来多条  消息在半路丢了
         channel.basicQos(1);    //  不要 一次性的把消息都给消费者     容易丢失  一次给一条 安全

        //4. 开启监听Queue

        DefaultConsumer consumer = new DefaultConsumer(channel){
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,byte[] body) throws IOException {
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("消费者1号接受的消息:"+new String(body,"UTF-8"));
                //2. 手动ack
                // 参数1   long类型  标识队列中哪个具体的消息     参数2:boolean 类型 是否开启多个消息同时确认
                //channel.basicAck(envelope.getDeliveryTag(),false);
                // 处理完了消息  手动确认一下  队列再删除这个消息   这种机制保证消息永不丢失
                // 队列给消费者 一条消息  消费者收到消息 处理完了之后 手动确认,  确认了之后  队列才把消息删除 保证消息永不丢失
                // 而且 消费者 确认一个消息  队列发送一个消息  消费者确认的快  队列发送的快   能者多劳
                channel.basicAck(envelope.getDeliveryTag(),false);
            }

        };
        //指定手动ack
        channel.basicConsume(queryname,false,consumer);
        System.out.println("消费者1开始监听队列");
        System.in.read();
        //释放资源
        channel.close();
        connection.close();

    }
    @Test
    public void consume2() throws IOException, TimeoutException {
        //1. 获取连接对象
        Connection connection = RabbitMQUtil.getconnection();
        //2. 创建channel
        Channel channel = connection.createChannel();
        //3. 声明队列-HelloWorld
        //参数1:queue - 指定队列的名称
        //参数2:durable - 当前队列是否需要持久化(true)
        //参数3:exclusive - 是否排外(conn.close() - 当前队列会被自动删除,当前队列只能被一个消费者消费)
        //参数4:autoDelete - 如果这个队列没有消费者在消费,队列自动删除
        //参数5:arguments - 指定当前队列的其他信息
        channel.queueDeclare(queryname,true,false,false,null);


        //1 指定当前消费者,一次消费多少个消息
        channel.basicQos(1);

        //4. 开启监听Queue
        DefaultConsumer consumer = new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("消费者2号接收到消息:" + new String(body,"UTF-8"));
                //2. 手动ack
                // 参数1   long类型  标识队列中哪个具体的消息     参数2:boolean 类型 是否开启多个消息同时确认
                channel.basicAck(envelope.getDeliveryTag(),false);
            }
        };
        //参数1:queue - 指定消费哪个队列
        //参数2:autoAck - 指定是否自动ACK (true,接收到消息后,会立即告诉RabbitMQ)
        //参数3:consumer - 指定消费回调
        //3. 指定手动ack
        channel.basicConsume(queryname,false,consumer);
        System.out.println("消费者2开始监听队列!");
        // System.in.read();
        System.in.read();
        //5. 释放资源
        channel.close();
        connection.close();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值