java-rabbitmq-官网实例02
来源:互联网 发布:淘宝网桌面图标 编辑:程序博客网 时间:2024/05/16 19:18
java-rabbitmq-官网实例02
描述:
1.定义持久化队列,发送持久化消息,消息接受者需要手动应答,MQ才会删除队列中的消息
2.使用 channel.basicQos() 设置多个消费者时,消息将平均分发
运行:
D2_NewTask.main(); //生产者
D2_Worker.main(); //消费者
描述:
1.定义持久化队列,发送持久化消息,消息接受者需要手动应答,MQ才会删除队列中的消息
2.使用 channel.basicQos() 设置多个消费者时,消息将平均分发
运行:
D2_NewTask.main(); //生产者
D2_Worker.main(); //消费者
package com.example.tutorials;import com.rabbitmq.client.Channel;import com.rabbitmq.client.Connection;import com.rabbitmq.client.ConnectionFactory;import com.rabbitmq.client.MessageProperties;import java.util.Scanner;/** * 1.定义持久化队列,发送持久化消息,消息接受者需要手动应答,MQ才会删除队列中的消息 * 2.使用 channel.basicQos() 设置多个消费者时,消息将平均分发 * @create 2017-08-29 * amqp-client 4.2.0 **/public class D2_NewTask { private static final String TASK_QUEUE_NAME = "task_queue"; /** * 生产者, Work queues * @param argv * @throws Exception */ public static void main(String[] argv) throws Exception { ConnectionFactory factory = new ConnectionFactory(); //设置登录账号 factory.setHost(ServerInfo.host); factory.setPort(ServerInfo.port); factory.setUsername(ServerInfo.uName); factory.setPassword(ServerInfo.uPwd); //链接服务器 Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); //定义一个队列 boolean duiable=true;//队列持久化 boolean exclusive = false;//排他队列 boolean autoDelete=false;//没有consumer时,队列是否自动删除 channel.queueDeclare(TASK_QUEUE_NAME, duiable, exclusive, autoDelete, null); //发送消息 System.out.println("输入要发送的消息,退出输入 x "); String message = ""; do{ Scanner scanner = new Scanner(System.in); message = scanner.next(); channel.basicPublish("", TASK_QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN,//设置消息持久化 message.getBytes("UTF-8")); System.out.println(" [x] Sent '" + message + "'"); }while(!"x".equals(message)); channel.close(); connection.close(); }}
package com.example.tutorials;import com.rabbitmq.client.*;import java.io.IOException;/** * 1.定义持久化队列,发送持久化消息,消息接受者需要手动应答,MQ才会删除队列中的消息 * 2.使用 channel.basicQos() 设置多个消费者时,消息将平均分发 * @create 2017-08-29 * amqp-client 4.2.0 **/public class D2_Worker { private static final String TASK_QUEUE_NAME = "task_queue"; /** * 消费者, Work queues * @param argv * @throws Exception */ public static void main(String[] argv) { //多个消费者,指定了相同名称的队列,向队列发送消失时,消息将推送给随机一个消费者消费。可以 调用channel.basicQos(1) 设置后,消息将以轮询的形式推送到每个消费者 //启动两个线程,模拟消费者 new Thread(new Runnable() { @Override public void run() { try { startConsumer("consumer_01"); } catch (Exception e) { e.printStackTrace(); } } }).start(); new Thread(new Runnable() { @Override public void run() { try { startConsumer("consumer_02"); } catch (Exception e) { e.printStackTrace(); } } }).start(); } /** * 启动一个消费者 * @param consumerName * @throws Exception */ public static void startConsumer(final String consumerName) throws Exception { ConnectionFactory factory = new ConnectionFactory(); //设置登录账号 factory.setHost(ServerInfo.host); factory.setPort(ServerInfo.port); factory.setUsername(ServerInfo.uName); factory.setPassword(ServerInfo.uPwd); //链接服务器 final Connection connection = factory.newConnection(); final Channel channel = connection.createChannel(); //定义一个队列 boolean duiable=true;//持久化 boolean exclusive = false;//排他队列 boolean autoDelete=false;//没有consumer时,队列是否自动删除 channel.queueDeclare(TASK_QUEUE_NAME, duiable, exclusive, autoDelete, null); System.out.println(" [*] Waiting for messages. To exit press CTRL+C"); //平均分发消息,有多个消费者时,消息将以轮询方式接收到消息 channel.basicQos(1); final Consumer consumer = new DefaultConsumer(channel) { @Override public void handleConsumeOk(String consumerTag) { super.handleConsumeOk(consumerTag); System.out.println(" ["+consumerName+"] 已经注册成功! "); System.out.println("----------------------------------------------"); } @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { String message = new String(body, "UTF-8"); System.out.println("----------------------------------------------"); System.out.println(" ["+consumerName+"] Received '" + message + "'"); try { doWork(message);//消费消息 } finally { System.out.println(" ["+consumerName+"] Done"); //手动发送应答,使消息在队列中被删除 channel.basicAck(envelope.getDeliveryTag(), false); } } }; //启动消费者,接收消息 boolean autoAck=false;//自动应答,true=自动发送应答;false=手动发送应答; channel.basicConsume(TASK_QUEUE_NAME, autoAck, consumer); } /** * 模拟延时消费消息 * @param task */ private static void doWork(String task) { for (char ch : task.toCharArray()) { if (ch == '.') { try { Thread.sleep(1000); } catch (InterruptedException _ignored) { Thread.currentThread().interrupt(); } } } }}
阅读全文
0 0
- java-rabbitmq-官网实例02
- java-rabbitmq-官网实例01
- java-rabbitmq-官网实例03
- java-rabbitmq-官网实例04
- java-rabbitmq-官网实例05
- java-rabbitmq-官网实例06
- java的RabbitMQ 实例
- RabbitMQ Java 实例
- 简单Java实例rabbitMQ
- rabbitmq的java调用实例
- RabbitMQ环境配置,java实例
- RabbitMQ 入门指南(Java)带实例
- RabbitMQ与java、Spring结合实例详细讲解
- java调用rabbitmq消息队列发送和接收消息实例
- RabbitMQ与java、Spring结合实例详细讲解
- RabbitMQ与java、Spring结合实例详细讲解
- RabbitMQ与java、Spring结合实例详细讲解
- RabbitMQ与java、Spring结合实例详细讲解
- RecyclerView使用GridLayoutManager导致间隙变大的问题
- Spring 整合 struts2
- Goldbach`s Conjecture
- 普通IO模拟i2c总线
- 数据库内连接与外连接
- java-rabbitmq-官网实例02
- Axure安装
- IO流之对象序列化(Serializable接口和Externalizable接口)
- 关于EditText点击enter键会出现换行的解决方式
- matlab中批量读取图像序列并进行简单目标跟踪
- Sublime Text 3 快捷键汇总
- XCode8新的功能
- ipv4 地址段 笔记
- ArcGIS Server创建集群