RabbitMQ(4)--工作队列(work queues)

本文通过Java实现了一个工作队列模式的例子,其中包含生产者和两个消费者。生产者向队列发送30条消息,而消费者1和消费者2竞争消费这些消息。每个消费者在接收到消息后会进行5秒的处理,然后确认消息。消费者之间对消息的处理呈现竞争关系,一次只有一个消费者能处理消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

工作队列模式,如下图:

同simple queues相比,多了一个或一些消费者,即多个消费者共同消费同一个队列中的消息

应用场景:对于任务过重的情况下,使用工作队列可以提高任务处理的速度。

第1步、创建生产者生产消息

package com.wzy.product;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.wzy.com.wzy.utils.ConnectionUtil;
import com.wzy.com.wzy.utils.Constant;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 工作队列:生产者
 * */
public class Work_Producer {

    public static void main(String[] args) throws IOException, TimeoutException {
        //1.创建连接
        Connection connection= ConnectionUtil.getConn();
        //2.创建频道
        Channel channel=connection.createChannel();
        /**
         * 3.创建队列
         * 参数1:队列名称;参数2:是否为持久化队列
         * 参数3:是否独占本次连接;参数4:是在在不使用的时候自动删除队列
         * 参数5:队列其它参数
         * */
        channel.queueDeclare(Constant.WORK_QUEUE_NAME,true,false,false,null);
        //4.循环发送消息
        for(int i=1;i<=30;i++){
            //消息
            String message="hello,rabbitMQ! work模式:"+i;
            channel.basicPublish("",Constant.WORK_QUEUE_NAME,null,message.getBytes());
            System.out.println("已发送消息:"+message);
        }
        //5、关闭资源
        channel.close();
        connection.close();
    }
}

第2步、创建消费者1

package com.wzy.consumer;

import com.rabbitmq.client.*;
import com.wzy.com.wzy.utils.ConnectionUtil;
import com.wzy.com.wzy.utils.Constant;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 工作队列:消费者1
 * */
public class Work_Consumer1 {
    public static void main(String[] args) throws IOException, TimeoutException {
        //1.创建连接
        Connection connection= ConnectionUtil.getConn();
        //2.创建频道
        Channel channel=connection.createChannel();
        //3.创建队列
        channel.queueDeclare(Constant.WORK_QUEUE_NAME,true,false,false,null);
        //4.一次只能接收并处理一个消息
        channel.basicQos(1);
        //5.创建消费者,并设置消息处理
        DefaultConsumer consumer=new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                try{
                    //路由key
                    System.out.println("路由key为:"+envelope.getRoutingKey());
                    //交换机
                    System.out.println("交换机为:"+envelope.getExchange());
                    //消息id
                    System.out.println("消息id为:"+envelope.getDeliveryTag());
                    //收到的消息
                    System.out.println("消费者1接收到的消息为:"+new String(body,"utf-8"));
                    Thread.sleep(5000);
                    //确认消息
                    channel.basicAck(envelope.getDeliveryTag(),false);
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
        };
        //监听消息
        channel.basicConsume(Constant.WORK_QUEUE_NAME,false,consumer);
    }
}

第3步、创建消费者2

package com.wzy.consumer;

import com.rabbitmq.client.*;
import com.wzy.com.wzy.utils.ConnectionUtil;
import com.wzy.com.wzy.utils.Constant;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 工作队列:消费者1
 * */
public class Work_Consumer2 {
    public static void main(String[] args) throws IOException, TimeoutException {
        //1.创建连接
        Connection connection= ConnectionUtil.getConn();
        //2.创建频道
        Channel channel=connection.createChannel();
        //3.创建队列
        channel.queueDeclare(Constant.WORK_QUEUE_NAME,true,false,false,null);
        //4.一次只能接收并处理一个消息
        channel.basicQos(1);
        //5.创建消费者,并设置消息处理
        DefaultConsumer consumer=new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                try{
                    //路由key
                    System.out.println("路由key为:"+envelope.getRoutingKey());
                    //交换机
                    System.out.println("交换机为:"+envelope.getExchange());
                    //消息id
                    System.out.println("消息id为:"+envelope.getDeliveryTag());
                    //收到的消息
                    System.out.println("消费者2接收到的消息为:"+new String(body,"utf-8"));
                    Thread.sleep(5000);
                    //确认消息
                    channel.basicAck(envelope.getDeliveryTag(),false);
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
        };
        //监听消息
        channel.basicConsume(Constant.WORK_QUEUE_NAME,false,consumer);
    }
}

执行结果:

总结:消费者1和消费者2对同一个消息的关系是竞争的关系。都在相互竞争争夺消息.....

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值