rabbitmq工作模式


rabbitmq工作模式

一个生产者发送消息给多个消费者

工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务,而不得不等待它完成。相反我们安排任务在之后执行。我们把任务封装为消息并将其发送到队列。在后台运行的工作进程将弹出任务并最终执行作业。当有多个工作线程时,这些工作线程将一起处理这些任务

代码实现

消费者

package com.yl.workqueue;

import com.rabbitmq.client.CancelCallback;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DeliverCallback;
import com.yl.util.RabbitConstant;
import com.yl.util.RabbitUtils;

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

/**
 * 消息消费者
 *
 * @author Y-wee
 */
public class Consumer {

    public static void main(String[] args) throws IOException, TimeoutException {
        Connection connection = RabbitUtils.getConnection();
        Channel channel = connection.createChannel();
        // 不公平分发,取消轮询机制,谁先处理完就把未处理的消息分配给谁,能者多劳(默认是轮询)
        channel.basicQos(1);

        channel.queueDeclare(RabbitConstant.QUEUE_WORK, false, false, false, null);

        // 通过传参模拟多个消费者
        System.out.println("消费者"+args[0]+"开始工作");

        DeliverCallback deliverCallback = (consumerTag, message) -> {
            System.out.println("接收到消息:"+new String(message.getBody()));
            channel.basicAck(message.getEnvelope().getDeliveryTag(),false);
        };

        CancelCallback cancelCallback = (consumerTag) -> {
            System.out.println("消费失败");
        };

        channel.basicConsume(RabbitConstant.QUEUE_WORK, false, deliverCallback, cancelCallback);
    }

}

RabbitUtils是笔者自定义的一个工具类,用来获取连接

RabbitConstant是笔者自定义的一个常量类,里面存储了队列名和交换机名

生产者

package com.yl.workqueue;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.yl.util.RabbitConstant;
import com.yl.util.RabbitUtils;

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

/**
 * 消息生产者
 *
 * @author Y-wee
 */
public class Provider {

    public static void main(String[] args) throws IOException, TimeoutException {
        Connection connection = RabbitUtils.getConnection();
        Channel channel = connection.createChannel();
        channel.queueDeclare(RabbitConstant.QUEUE_WORK, false, false, false, null);

        // 通过控制台多次输入模拟发送多条消息
        System.out.println("请输入要发送的消息:");
        Scanner scanner=new Scanner(System.in);
        while (scanner.hasNext()){
            String message=scanner.next();
            channel.basicPublish("", RabbitConstant.QUEUE_WORK, null, message.getBytes());

            System.out.println("消息发送成功");
        }

    }

}