Spring 整合 Disruptor 第一个版本

package com.eloancn.back.schedule.core.boom;

import com.eloancn.back.schedule.core.config.event.EventBusConfig;
import com.eloancn.back.schedule.core.model.ScheduleRecord;
import com.eloancn.back.schedule.core.schedule.CoreSchedule;
import com.eloancn.back.schedule.core.service.RecordQueryService;
import com.lmax.disruptor.RingBuffer;
import com.lmax.disruptor.dsl.Disruptor;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.nio.ByteBuffer;
import java.util.UUID;
import java.util.concurrent.*;

/**
 * @author famous
 */

@Component
public class ScheduleFocusConfig {

    private final static Logger logger = LoggerFactory.getLogger(ScheduleFocusConfig.class);

    private int bufferSize = 1024;

    private ScheduleFocusEventProducer scheduleFocusEventProducer;

    @Autowired
    private RecordQueryService recordQueryService;

    @Autowired
    private CoreSchedule coreSchedule;


    /**
     * • BlockingWaitStrategy: 对低延迟和吞吐率不像CPU占用那么重要
     * • BusySpinWaitStrategy: CPU使用率高,低延迟
     * • LiteBlockingWaitStrategy: BlockingWaitStrategy变种,实验性的
     * • PhasedBackoffWaitStrategy: Spins, then yields, then waits,不过还是适合对低延迟和吞吐率不像CPU占用那么重要的情况
     * • SleepingWaitStrategy: spin, then yield,然后sleep(LockSupport.parkNanos(1L))在性能和CPU占用率之间做了平衡。
     * • TimeoutBlockingWaitStrategy: sleep一段时间。 低延迟。
     * • YieldingWaitStrategy: 使用spin, Thread.yield()方式
     *
     * @return
     */
    @PostConstruct
    private void ScheduleFocusConfig() {
        ScheduleFocusEventFactory factory = new ScheduleFocusEventFactory();
        Disruptor<ScheduleFocusEvent> disruptor = new Disruptor<>(factory, bufferSize, new CustomThreadFactory());
        System.out.println(coreSchedule);
        ScheduleFocusEventHandler handler=new ScheduleFocusEventHandler(coreSchedule);
        disruptor.handleEventsWith(handler);
        disruptor.start();
        RingBuffer<ScheduleFocusEvent> ringBuffer = disruptor.getRingBuffer();
        scheduleFocusEventProducer=new ScheduleFocusEventProducer(ringBuffer);
    }

    public void sendAsyncEmail(ScheduleRecord sc) {
        scheduleFocusEventProducer.publish(sc);
    }

    private class CustomThreadFactory implements ThreadFactory {
        @Override
        public Thread newThread(Runnable r) {
            Thread t = new Thread(r);
            t.setName(UUID.randomUUID().toString());
            t.setUncaughtExceptionHandler(new ScheduleFocusConfig.MyUncaughtExceptionHandler());
            return t;
        }
    }

    private class CustomRejectedExecutionHandler implements RejectedExecutionHandler {
        @Override
        public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
            logger.info("线程池缓冲队列超出范围抛弃");
        }
    }

    private class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
        @Override
        public void uncaughtException(Thread t, Throwable e) {
            logger.error("线程池异常捕获打印:{}", ExceptionUtils.getFullStackTrace(e));
        }
    }

}



package com.eloancn.back.schedule.core.boom;

import com.eloancn.back.schedule.core.model.ScheduleRecord;
import com.eloancn.back.schedule.core.schedule.CoreSchedule;

/**
 * @author famous
 *
 */
public class ScheduleFocusEvent {

    private ScheduleRecord scheduleRecord;


    public void set(ScheduleRecord scheduleRecord) {
        this.scheduleRecord = scheduleRecord;
    }

    public ScheduleRecord getScheduleRecord() {
        return scheduleRecord;
    }

}

package com.eloancn.back.schedule.core.boom;

import com.eloancn.back.schedule.core.model.ScheduleRecord;
import com.lmax.disruptor.EventFactory;

/**
 * @author pat
 */
public class ScheduleFocusEventFactory implements EventFactory<ScheduleFocusEvent> {

    @Override
    public ScheduleFocusEvent newInstance() {
        return new ScheduleFocusEvent();
    }
}

package com.eloancn.back.schedule.core.boom;

import com.eloancn.back.schedule.core.model.ScheduleRecord;
import com.eloancn.back.schedule.core.schedule.CoreSchedule;
import com.eloancn.back.schedule.core.service.RecordQueryService;
import com.lmax.disruptor.EventHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * @author famous
 *
 */
public class ScheduleFocusEventHandler implements EventHandler<ScheduleFocusEvent>{

    private CoreSchedule coreSchedule;

    ScheduleFocusEventHandler(CoreSchedule coreSchedule){
        this.coreSchedule=coreSchedule;
    }
    /**
     *
     * @param event
     * @param sequence
     * @param endOfBatch
     * @throws Exception
     */
    @Override
    public void onEvent(ScheduleFocusEvent event, long sequence, boolean endOfBatch) throws Exception {
        System.out.println(111);
        System.out.println(coreSchedule);
        System.out.println(222);
        System.out.println(event.getScheduleRecord().getId());
        coreSchedule.doSchedule(event.getScheduleRecord());
    }
}

package com.eloancn.back.schedule.core.boom;

import com.eloancn.back.schedule.core.model.ScheduleRecord;
import com.eloancn.back.schedule.core.schedule.CoreSchedule;
import com.lmax.disruptor.RingBuffer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * @author famous
 */
public class ScheduleFocusEventProducer {

    private RingBuffer<ScheduleFocusEvent> ringBuffer;

    ScheduleFocusEventProducer(RingBuffer<ScheduleFocusEvent> ringBuffer) {
        this.ringBuffer = ringBuffer;
    }

    public void publish(ScheduleRecord scheduleRecord) {
        long sequence = ringBuffer.next();  // Grab the next sequence
        try {
            ScheduleFocusEvent event = ringBuffer.get(sequence); // Get the entry in the Disruptor
            event.set(scheduleRecord);
        } finally {
            ringBuffer.publish(sequence);
        }
    }
}

 

转载于:https://my.oschina.net/payzheng/blog/1559385

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值