• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Y-wee
博客园    首页    新随笔    联系   管理     

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("消息发送成功");
        }

    }

}
记得快乐
posted @ 2021-12-26 20:33  Y-wee  阅读(43)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3