工作模式说明
Work Queues与入门程序的简单模式相比,多了一个或一些消费端,多个消费端共同消费同一个队列中的消息。
应用场景:对于 任务过重或任务较多情况使用工作队列可以提高任务处理的速度。
代码部分
消息生产者
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 Wrok_hello {
public static void main(String[] args) throws IOException, TimeoutException {
//创建连接工程
ConnectionFactory connectionFactory = new ConnectionFactory();
//设置参数
connectionFactory.setHost("127.0.0.1");
connectionFactory.setPort(5672);
connectionFactory.setUsername("wujian");
connectionFactory.setPassword("wujian");
connectionFactory.setVirtualHost("/itcast");
//创建连接
Connection connection = connectionFactory.newConnection();
//创建Channel
Channel channel = connection.createChannel();
/** public com.rabbitmq.client.AMQP.Queue.DeclareOk queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments)
queue 队列的名称
durable 是否持久化,当mq重启之后还在
exclusive 是否独占,只有一个消费者监听这个队列
当connection 关闭的时候删除这个队列
autoDelete 是否自动删除,没有消费者的时候删除
arguments 参数
}*/
//创建队列
channel.queueDeclare("hello_word",true,false,false,null);
// 发送消息
/**public void basicPublish(String exchange, String routingKey, BasicProperties props, byte[] body) throws IOException {
exchange 交换机名称,简单模式下的交换机会默认使用 ""
routingKey 路由名称
props 配置信息
body 消息体
*/
for (int i = 0 ;i<10;i++) {
String messages="我发送了了消息 "+i;
channel.basicPublish("", "work_quques", null, messages.getBytes());
}
channel.close();
connection.close();
}
}
消费者1
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class ConsumerWorkQueueMain {
public static void main(String[] args) throws IOException, TimeoutException {
ConnectionFactory factory = new ConnectionFactory();
factory.setPort(5672);
factory.setHost("127.0.0.1");
factory.setVirtualHost("/itcast");
factory.setUsername("wujian");
factory.setPassword("wujian");
Connection connection =factory.newConnection();
Channel channel =connection.createChannel();
/** public com.rabbitmq.client.AMQP.Queue.DeclareOk queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments)
queue 队列的名称
durable 是否持久化,当mq重启之后还在
exclusive 是否独占,只有一个消费者监听这个队列
当connection 关闭的时候删除这个队列
autoDelete 是否自动删除,没有消费者的时候删除
arguments 参数
}*/
// 如果没有这个队列会创建,有则不会创建
channel.queueDeclare("work_quques",true,false,false,null);
/** String basicConsume(String queue, boolean autoAck, Consumer callback)
* queue 队列名称
* autoAck 是否自动确认 消费者收到消息之后自动给生产者说一声收到了
* callback 回调函数
* */
DefaultConsumer consumer = new DefaultConsumer(channel) {
// 这个是一个回调方法,当收到消息之后会自动执行该方法
/****
* consumerTag 标识 编号
* envelope 获取一些信息例如交换机 key,路由
* properties 配置信息
* body 数据
*/
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
super.handleDelivery(consumerTag, envelope, properties, body);
// System.out.println("标识:" + consumerTag);
// System.out.println("一些信息" + envelope.getExchange());
// System.out.println("这个是路由,其实是队列名称" + envelope.getRoutingKey());
// System.out.println("消息序号" + envelope.getDeliveryTag());
// System.out.println("配置信息:" + properties);
System.out.println("消息" + new String(body));
}
};
channel.basicConsume("work_quques",true,consumer);
}
}
消费者2
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class ConsumerWorkQueueMain1 {
public static void main(String[] args) throws IOException, TimeoutException {
ConnectionFactory factory = new ConnectionFactory();
factory.setPort(5672);
factory.setHost("127.0.0.1");
factory.setVirtualHost("/itcast");
factory.setUsername("wujian");
factory.setPassword("wujian");
Connection connection =factory.newConnection();
Channel channel =connection.createChannel();
/** public com.rabbitmq.client.AMQP.Queue.DeclareOk queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments)
queue 队列的名称
durable 是否持久化,当mq重启之后还在
exclusive 是否独占,只有一个消费者监听这个队列
当connection 关闭的时候删除这个队列
autoDelete 是否自动删除,没有消费者的时候删除
arguments 参数
}*/
// 如果没有这个队列会创建,有则不会创建
channel.queueDeclare("work_quques",true,false,false,null);
/** String basicConsume(String queue, boolean autoAck, Consumer callback)
* queue 队列名称
* autoAck 是否自动确认 消费者收到消息之后自动给生产者说一声收到了
* callback 回调函数
* */
DefaultConsumer consumer = new DefaultConsumer(channel) {
// 这个是一个回调方法,当收到消息之后会自动执行该方法
/****
* consumerTag 标识 编号
* envelope 获取一些信息例如交换机 key,路由
* properties 配置信息
* body 数据
*/
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
super.handleDelivery(consumerTag, envelope, properties, body);
// System.out.println("标识:" + consumerTag);
// System.out.println("一些信息" + envelope.getExchange());
// System.out.println("这个是路由,其实是队列名称" + envelope.getRoutingKey());
// System.out.println("消息序号" + envelope.getDeliveryTag());
// System.out.println("配置信息:" + properties);
System.out.println("消息" + new String(body));
}
};
channel.basicConsume("work_quques",true,consumer);
}
}
在一个队列中如果有多个消费者,那么消费者之间对于同一个消息的关系是竞争的关系