RabbitMQ(work工作模式)

一、Work模式中有两种模式

1.轮询模式的分发Round-Robin:一个消费者一台哦,按均分配
2.公平分配:根据消费者能力进行公平分发,按劳分配

二、轮询模式的分发Round-Robin

特点:该模式接受消息是当有多个消费者时,消息的分配是一个消费者一条,直至信息消费完成。

RabbitMQ界面设置


生产者

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 生产者
 */
public class Producer {

    public static void main(String[] args) throws IOException, TimeoutException {
        //所有的中间件技术都是基于TCP/IP协议基础构建的协议规范,rabbitmq遵循的是ampq协议
        //1.创建连接工厂
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("127.0.0.1");
        connectionFactory.setUsername("guest");
        connectionFactory.setPassword("guest");
        connectionFactory.setPort(5672);
        connectionFactory.setVirtualHost("/");
        //2.创建连接Connection
        Connection connection = connectionFactory.newConnection();
        //3.通过连接获取通道channel
        Channel channel = connection.createChannel();
       //4.准备发送的消息内容
        String msg="hello lunxun";
        for (int i = 0; i < 10; i++) {
            msg+=i;
            //发送消息给队列
            channel.basicPublish("","q1",null,msg.getBytes());
            System.out.println("生产成功");
        }
        //7.关闭通道
        channel.close();
        //8.关闭连接
        connection.close();

    }
}

work1

import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class work1 {
    public static void main(String[] args) throws IOException, TimeoutException {
        //1.创建连接工厂
        ConnectionFactory connectionFactory = new ConnectionFactory();
        //2.设置连接属性
        connectionFactory.setHost("127.0.0.1");
        connectionFactory.setUsername("guest");
        connectionFactory.setPassword("guest");
        connectionFactory.setPort(5672);
        connectionFactory.setVirtualHost("/");
        //3.从连接工厂中获取连接
        Connection connection = connectionFactory.newConnection();
        //4.从连接中获取信道channel
        Channel channel = connection.createChannel();
        //设置服务质量
        channel.basicQos(1);

        channel.basicConsume("q1", true, new DeliverCallback() {
            @Override
            public void handle(String s, Delivery delivery) throws IOException {
                System.out.println("work1收到的消息是:" + new String(delivery.getBody(), "utf-8"));
            }
        }, new CancelCallback() {
            @Override
            public void handle(String consumerTag) throws IOException {

            }
        });
        System.out.println("work1开始接受消息:");
        System.in.read();

        //7.关闭通道
        channel.close();
        //8.关闭连接
        connection.close();
    }
}

work2

import com.rabbitmq.client.*;

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

public class work2 {
    public static void main(String[] args) throws IOException, TimeoutException {
        //1.创建连接工厂
        ConnectionFactory connectionFactory = new ConnectionFactory();
        //2.设置连接属性
        connectionFactory.setHost("127.0.0.1");
        connectionFactory.setUsername("guest");
        connectionFactory.setPassword("guest");
        connectionFactory.setPort(5672);
        connectionFactory.setVirtualHost("/");
        //3.从连接工厂中获取连接
        Connection connection = connectionFactory.newConnection();
        //4.从连接中获取信道channel
        Channel channel = connection.createChannel();
        //设置服务质量
        channel.basicQos(1);

        channel.basicConsume("q1", true, new DeliverCallback() {
            @Override
            public void handle(String s, Delivery delivery) throws IOException {
                System.out.println("work2收到的消息是:" + new String(delivery.getBody(), "utf-8"));
            }
        }, new CancelCallback() {
            @Override
            public void handle(String consumerTag) throws IOException {

            }
        });
        System.out.println("work2开始接受消息:");
        System.in.read();

        //7.关闭通道
        channel.close();
        //8.关闭连接
        connection.close();
    }
}

结果

work1和work2各五条

三、公平分发

1.改自动应答改为手动应答
2.指标定义出来:qos=1  ;//不设置qos ,qos默认为轮询分发;1代表一次性从队列中取出一条消息
```
channel.basicQos(1);
channel.basicConsume("q1", false, new DeliverCallback() {
            @Override
            public void handle(String s, Delivery delivery) throws IOException {
                System.out.println("我喊:" + new String(delivery.getBody(), "utf-8"));
                //这是手动应答
                channel.basicAck(delivery.getEnvelope().getDeliveryTag(),false);
            }
        }, new CancelCallback() {
            @Override
            public void handle(String consumerTag) throws IOException {

            }
        });
```
posted @ 2021-05-18 22:09  一名初学者  阅读(374)  评论(0)    收藏  举报