03 rabbitmq之Work queues

rabbitmq有多种工作模式,这一节我们将阐述它的Work queues的用法。

1、前提约束

  • 已经完成rabbitmq的第一个简单的测试程序
    https://www.jianshu.com/p/77bfc4fe5a1a
  • 2、操作步骤
    我们马上要测试的rabbitmq的工作模式如下:
    Work queues
  • 在src/main/java文件夹下创建包net.wanho.rabbitmq.workqueues
  • 在net.wanho.rabbitmq.workqueues创建Worker.java
package net.wanho.rabbitmq.workqueues;

import com.rabbitmq.client.*;

import java.io.IOException;

public class Worker {

    public static void main(String[] argv) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setUsername("guest");
        factory.setPassword("guest");
        factory.setHost("localhost");
        factory.setHost("localhost");
        final Connection connection = factory.newConnection();
        final Channel channel = connection.createChannel();
        String queueName = "task_queue";
        channel.queueDeclare(queueName, true, false, false, null);

        DefaultConsumer consumer = new DefaultConsumer(channel) {
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                //交换机
                String exchange = envelope.getExchange();
                //路由key
                String routingKey = envelope.getRoutingKey();
                //消息id
                long deliveryTag = envelope.getDeliveryTag();
                //消息内容
                String msg = new String(body, "utf-8");
                System.out.println("receive message:" + msg);
            }
        };

        /*** 监听队列String queue, boolean autoAck,Consumer callback *
         * 参数明细
         * 1、队列名称
         * 2、是否自动回复,
         * 设置为true为表示消息接收到自动向mq回复接收到了,mq接收到回复会删除消息,
         * 设置为false则需要手动回复
         * 3、消费消息的方法,消费者接收到消息后调用此方法
         * */
        channel.basicConsume(queueName, true, consumer);
    }
}
  • 在net.wanho.rabbitmq.workqueues创建NewTask.java
package net.wanho.rabbitmq.workqueues;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.MessageProperties;

public class NewTask {

    public static void main(String[] argv) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setUsername("guest");
        factory.setPassword("guest");
        factory.setHost("localhost");
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
        String queueName = "task_queue";
        channel.queueDeclare(queueName, true, false, false, null);

        String message = "task";

        channel.basicPublish("", queueName,
                MessageProperties.PERSISTENT_TEXT_PLAIN,
                message.getBytes("UTF-8"));
        System.out.println("send" + message);
    }
}
  • 测试
    先启动一个Worker,再启动一个Worker,再启动NewTask,始终只有一个Worker能收到消息。
    以上就是我们完成的rabbitmq的work queues模式的测试。这个模式其实与第一个demo是一致的。
posted @ 2020-03-17 21:24  张力的程序园  阅读(195)  评论(0)    收藏  举报