Disruptor多个消费者不重复处理生产者发送的消息的demo
来源:互联网 发布:java ssi框架 编辑:程序博客网 时间:2024/06/05 03:41
上一篇介绍的一个生产者向ringbuffer发送了10条消息,每个消费者都会把这个10个消息消费一遍,但是我们还有一种需求就是要让多个消费者不重复消费消息,下面这个简单demo实现了此功能:
创建一个消息的生产者类:
package Disruptor2;import com.lmax.disruptor.RingBuffer;import Disruptor.TradeTransaction;public class Producer {private RingBuffer<TradeTransaction> ringBuffer;public Producer(RingBuffer<TradeTransaction> ringBuffer) {this.ringBuffer = ringBuffer;}public void onData() {// 可以把ringBuffer看做一个事件队列,那么next就是得到下面一个事件槽long sequence = ringBuffer.next();try {} finally {System.out.println("生产者发送了一条消息");ringBuffer.publish(sequence);}}}
package Disruptor2;import com.lmax.disruptor.WorkHandler;import Disruptor.TradeTransaction;public class Consumer implements WorkHandler<TradeTransaction>{@Overridepublic void onEvent(TradeTransaction event) throws Exception {// TODO Auto-generated method stubSystem.out.println("消费者C1消费了一条消息");}}
创建一个IntEventExceptionHandler类:
package Disruptor2;import org.apache.log4j.Logger;import com.lmax.disruptor.ExceptionHandler;public class IntEventExceptionHandler implements ExceptionHandler {private static final Logger logger = Logger.getLogger(IntEventExceptionHandler.class);public void handleEventException(Throwable ex, long sequence, Object event) {logger.error("handleEventException", ex);}public void handleOnStartException(Throwable ex) {logger.error("handleOnStartException", ex);}public void handleOnShutdownException(Throwable ex) {logger.error("handleOnShutdownException", ex);}}
编写一个测试类:
package Disruptor2;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import com.lmax.disruptor.EventFactory;import com.lmax.disruptor.RingBuffer;import com.lmax.disruptor.SequenceBarrier;import com.lmax.disruptor.WaitStrategy;import com.lmax.disruptor.WorkerPool;import com.lmax.disruptor.YieldingWaitStrategy;import com.lmax.disruptor.dsl.ProducerType;import Disruptor.TradeTransaction;public class Disruptor2 {public static void main(String[] args) {Long time = System.currentTimeMillis();RingBuffer<TradeTransaction> ringBuffer;Producer producer = null;// 创建缓冲池ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());// 创建工厂EventFactory<TradeTransaction> factory = new EventFactory<TradeTransaction>() {@Overridepublic TradeTransaction newInstance() {return new TradeTransaction();}};// 创建bufferSize ,也就是RingBuffer大小,必须是2的N次方int ringBufferSize = 1024 * 1024; //WaitStrategy YIELDING_WAIT = new YieldingWaitStrategy();// 创建ringBufferringBuffer = RingBuffer.create(ProducerType.MULTI, factory, ringBufferSize, YIELDING_WAIT);SequenceBarrier barriers = ringBuffer.newBarrier();// 创建10个消费者来处理同一个生产者发的消息(这10个消费者不重复消费消息)Consumer[] consumers = new Consumer[10];for (int i = 0; i < consumers.length; i++) {consumers[i] = new Consumer();}WorkerPool<TradeTransaction> workerPool = new WorkerPool<TradeTransaction>(ringBuffer, barriers,new IntEventExceptionHandler(), consumers);ringBuffer.addGatingSequences(workerPool.getWorkerSequences());workerPool.start(executor);producer = new Producer(ringBuffer);for (int i = 0; i < 10; i++) {producer.onData();}//executor.shutdown();System.out.println("花费时间 :" + (System.currentTimeMillis() - time));}}
测试结果如下:
生产者发送了一条消息
生产者发送了一条消息
生产者发送了一条消息
生产者发送了一条消息
生产者发送了一条消息
生产者发送了一条消息
生产者发送了一条消息
生产者发送了一条消息
生产者发送了一条消息
生产者发送了一条消息
消费者C1消费了一条消息
消费者C1消费了一条消息
消费者C1消费了一条消息
消费者C1消费了一条消息
消费者C1消费了一条消息
消费者C1消费了一条消息
消费者C1消费了一条消息
消费者C1消费了一条消息
消费者C1消费了一条消息
花费时间 :146
消费者C1消费了一条消息
由结果可以看出来,一共生成了10个消费者用于消费生产者产生的消息,每一条消息只消费了一次
阅读全文
0 1
- Disruptor多个消费者不重复处理生产者发送的消息的demo
- Disruptor多个消费者独立处理生产者消息的简单demo
- disruptor demo(一) 使用原生API创建一个简单的生产者和消费者
- Disruptor多生产者、多消费者
- Napajs demo-多个生产者/消费者
- RabbitMQ消息通信,生产者发送消息给指定的消费者的消息队列
- kafka生产者和消费者的javaAPI demo
- spring+activemq配置多个生产者,多个消费者并发处理消息
- spring JMS、activemq中消费者收不到生产者发送的消息的原因解析
- 多个生产者与多个消费者的问题
- java多线程之--多的生产者与多个消费者
- 生产者消费者--多个线程出现的问题
- 生产者消费者--多个线程出现的问题
- 生产者消费者模型--修改多个线程的情况
- disruptor 多个消费者 但是只消费一次 有时候会有这样的需求
- 一个生产者一个消费者的无锁队列,多个生产者多个消费者的无锁队列
- RabbitMQ消息通信,一个生产者和多个消费者
- 通过wait和notify实现的生产者消费者demo【转载】
- 监听VideoView的暂停和播发
- ThinkPHP中execute和query方法的区别
- 使用BeanUtil封装带日期的对象
- HDU-2159 FATE (二维背包)
- 关于ajax的相关小结
- Disruptor多个消费者不重复处理生产者发送的消息的demo
- gradle项目与maven项目互转
- SpringMVC返回数据中文乱码问题浅析
- 设计模式:抽象工厂模式(Abstract Factory)
- 微信小程序开发(二)图片上传
- android 点击快捷方式提示未安装程序的解决
- 正则表达式——详细讲解平衡组
- 搜索-G
- xutils3 批量文件上传