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 {
}
});
```

浙公网安备 33010602011771号