什么是MQ?什么是RabbitMQ?能做什么?简单理解一下?( 二 )

  • Routing(路由)
  • Topics(主题)
  • RPC(远程过程调用)
  • Publisher Confirms(发布者确认)
  • 环境要求:
    • JDK版本为15(1.8+即可)
    • amqp-client 5.10.0
    添加依赖:
    <!--ribbitMq--><dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.10.0</version></dependency>4.1 Work queues(工作队列)官方描述:
    工作队列(又名:任务队列)背后的主要思想是避免立即执行资源密集型任务,并且必须等待它完成 。相反,我们把任务安排在以后完成 。我们将任务封装为消息并将其发送到队列 。后台运行的工作进程将弹出任务并最终执行作业 。当您运行多个worker时,任务将在它们之间共享 。
    代码示例:
    生产者:
    1 public class NewTask { 23private static final String TASK_QUEUE_NAME = "task_queue"; 45public static void main(String[] args) throws Exception{ 67ConnectionFactory factory = new ConnectionFactory(); 89// 设置IP10factory.setHost("127.0.0.1");11 12// 设置端口号13factory.setPort(5672);14 15try (Connection connection = factory.newConnection();16Channel channel = connection.createChannel()){17channel.queueDeclare(TASK_QUEUE_NAME, true, false, false, null);18 19String message = String.join(" ", "four");20 21channel.basicPublish("", TASK_QUEUE_NAME,22MessageProperties.PERSISTENT_TEXT_PLAIN,23message.getBytes(StandardCharsets.UTF_8));24 25System.out.println(" [x] Sent '" + message + "'");26}27}28 }消费者:
    1 public class Worker { 23private static final String TASK_QUEUE_NAME = "task_queue"; 45public static void main(String[] args )throws Exception { 67ConnectionFactory factory = new ConnectionFactory(); 89// 设置IP10factory.setHost("127.0.0.1");11 12// 设置端口号13factory.setPort(5672);14 15final Connection connection = factory.newConnection();16final Channel channel = connection.createChannel();17 18channel.queueDeclare(TASK_QUEUE_NAME, true, false,false,null);19System.out.println(" [*] Waiting for messages. To exit press CTRL+C");20 21channel.basicQos(1);22 23DeliverCallback deliverCallback = (comsumerTag, delivery) ->{24String message = new String(delivery.getBody(), StandardCharsets.UTF_8);25 26System.out.println(" [x] Received '" + message + "'");27 28try {29doWork(message);30} finally {31System.out.println("[x] Done");32channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);33}34};35channel.basicConsume(TASK_QUEUE_NAME, false, deliverCallback, comsumerTag -> {});36}37 38private static void doWork(String task){39for (char ch : task.toCharArray()){40if(ch == '.'){41try {42Thread.sleep(1000);43} catch (InterruptedException e) {44Thread.currentThread().interrupt();45}46}47}48}49 }4.3 Publish/Subscribe(发布/订阅)官方描述:
    RabbitMQ消息传递模型中的核心思想是生产者从不将任何消息直接发送到队列 。实际上,生产者经常甚至根本不知道是否将消息传递到任何队列 。相反,生产者只能将消息发送到


    推荐阅读