代码地址:https://github.com/heidaodageshiwo/ZqRabbitMq
生产者1个
package org.example.Work;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.MessageProperties;
import java.io.IOException;
import org.example.RabbitMQUtils;
import org.junit.Test;
/**
* java类简单作用描述
*
* @ProjectName: rabbitmq
* @Package: org.example.Work
* @ClassName: Provider1
* @Description: java类作用描述
* @Author: zhangq
* @CreateDate: 2020-12-10 18:06
* @UpdateUser: zhangq
* @UpdateDate: 2020-12-10 18:06
* @UpdateRemark: The modified content
* @Version: 1.0 *
*/
public class Provider1 {
@Test
public void sendmessage() throws IOException {
//获取连接对象
Connection connection= RabbitMQUtils.getConnection();
//获取连接中通道
Channel channel = connection.createChannel();
//通道绑定对应消息队列
//参数1 队列名称如果队列不存在则自动创建
//参数2 用来定义队列特性是否要持久化 true持久化
//参数3 是否是独占队列 true 独占
//参数4 消费者消费完消息是否自动删除队列 true自动删除
//参数5 额外参数
channel.queueDeclare("work",true,false,false,null);
//发布消息
//参数1 交换机名称 参数2队列名称 参数3参数 参数4 消息的具体内容
// channel.basicPublish("","hello",null,"张强测试".getBytes());
for (int i = 0; i < 10; i++) {
channel.basicPublish("","work", MessageProperties.PERSISTENT_TEXT_PLAIN,("张强测试work:"+i).getBytes());
}
RabbitMQUtils.closeConnectionFactory(channel, connection);
}
}
消费者1:
package org.example.Work;
import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import java.io.IOException;
import org.example.RabbitMQUtils;
/**
* java类简单作用描述
*
* @ProjectName: rabbitmq
* @Package: org.example.Work
* @ClassName: consum1
* @Description: java类作用描述
* @Author: zhangq
* @CreateDate: 2020-12-10 18:08
* @UpdateUser: zhangq
* @UpdateDate: 2020-12-10 18:08
* @UpdateRemark: The modified content
* @Version: 1.0 *
*/
public class consum1 {
public static void main(String[] args) throws IOException {
Connection connection = RabbitMQUtils.getConnection();
Channel channel = connection.createChannel();
channel.queueDeclare("work",true,false,false,null);
channel.basicConsume("work",true, new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties,
byte[] body) throws IOException {
System.out.println("消费者-1:"+new String(body));
}
});
}
}
消费者2:
package org.example.Work;
import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import java.io.IOException;
import org.example.RabbitMQUtils;
/**
* java类简单作用描述
*
* @ProjectName: rabbitmq
* @Package: org.example.Work
* @ClassName: consum1
* @Description: java类作用描述
* @Author: zhangq
* @CreateDate: 2020-12-10 18:08
* @UpdateUser: zhangq
* @UpdateDate: 2020-12-10 18:08
* @UpdateRemark: The modified content
* @Version: 1.0 *
*/
public class consum2 {
public static void main(String[] args) throws IOException {
Connection connection = RabbitMQUtils.getConnection();
Channel channel = connection.createChannel();
channel.queueDeclare("work",true,false,false,null);
channel.basicConsume("work",true, new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties,
byte[] body) throws IOException {
System.out.println("消费者-2:"+new String(body));
}
});
}
}
顺序:先启动 2个消费者,在启动生产者看效果:(看出来是平均消费)
看出来是平均消费的:
如果消费者1消费的慢,消费者2消费的快 ;则需要实现能者多劳模式:
.RabbitMQ中消息确认机制和能者多劳的实现:
消费者1:
package org.example.Work;
import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import java.io.IOException;
import org.example.RabbitMQUtils;
/**
* java类简单作用描述
*
* @ProjectName: rabbitmq
* @Package: org.example.Work
* @ClassName: consum1
* @Description: java类作用描述
* @Author: zhangq
* @CreateDate: 2020-12-10 18:08
* @UpdateUser: zhangq
* @UpdateDate: 2020-12-10 18:08
* @UpdateRemark: The modified content
* @Version: 1.0 *
*/
public class consum1 {
public static void main(String[] args) throws IOException {
Connection connection = RabbitMQUtils.getConnection();
Channel channel = connection.createChannel();
channel.basicQos(1);//每一次只能消费一个消息
channel.queueDeclare("work", true, false, false, null);
//autoAck 置位 false
channel.basicConsume("work", false, new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties,
byte[] body) throws IOException {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("消费者-1:" + new String(body));
//手动确认 false每次确认一个
channel.basicAck(envelope.getDeliveryTag(),false);
}
});
}
}
消费者2:
package org.example.Work;
import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import java.io.IOException;
import org.example.RabbitMQUtils;
/**
* java类简单作用描述
*
* @ProjectName: rabbitmq
* @Package: org.example.Work
* @ClassName: consum1
* @Description: java类作用描述
* @Author: zhangq
* @CreateDate: 2020-12-10 18:08
* @UpdateUser: zhangq
* @UpdateDate: 2020-12-10 18:08
* @UpdateRemark: The modified content
* @Version: 1.0 *
*/
public class consum2 {
public static void main(String[] args) throws IOException {
Connection connection = RabbitMQUtils.getConnection();
Channel channel = connection.createChannel();
channel.basicQos(1);//每一次只能消费一个消息
channel.queueDeclare("work",true,false,false,null);
channel.basicConsume("work",false, new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties,
byte[] body) throws IOException {
System.out.println("消费者-2:"+new String(body));
//手动确认 false每次确认一个
channel.basicAck(envelope.getDeliveryTag(),false);
}
});
}
}
主要改动:
顺序:先启动 2个消费者,在启动生产者看效果:(看出来是不是平均消费)
这就实现了能者多劳