disruptor入门例子:
package com.taobao.eagleeye.rt.storm;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import com.taobao.eagleeye.digest.handler.DigestJob;
import com.taobao.eagleeye.digest.handler.DigesterWorkerHanlder;
import com.taobao.eagleeye.disruptor.EventHandler;
import com.taobao.eagleeye.disruptor.RingBuffer;
import com.taobao.eagleeye.disruptor.dsl.Disruptor;
import com.taobao.tlog.util.NamedThreadFactory;
public class Test {
private static final int RING_BUFFER_SIZE = 8;
public static void main(String[] args) {
ExecutorService es = new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>(),new NamedThreadFactory("disruptor-process"));
Disruptor<DigestJob> disruptor = new Disruptor<DigestJob>(DigestJob.EVENT_FACTORY, RING_BUFFER_SIZE, es);
DigesterWorkerHanlder[] workers = new DigesterWorkerHanlder[12];
disruptor.handleEventsWith(new EventHandler<DigestJob>() {
@Override
public void onEvent(DigestJob event, long sequence, boolean endOfBatch) throws Exception {
System.out.println("event=" + event);
Thread.sleep(10000);
}
});
RingBuffer<DigestJob> ringBuffer = disruptor.start();
while (true) {
long seq = ringBuffer.next();
DigestJob job = ringBuffer.get(seq);
job.context = null;
ringBuffer.publish(seq);
System.out.println("emit..."+seq);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
package com.taobao.tlog.runtime;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import com.taobao.tlog.disruptor.EventFactory;
import com.taobao.tlog.disruptor.EventHandler;
import com.taobao.tlog.disruptor.RingBuffer;
import com.taobao.tlog.disruptor.WorkHandler;
import com.taobao.tlog.disruptor.dsl.Disruptor;
public class ActorTest {
static class ActorHandler implements
WorkHandler<String>,
EventHandler<String> {
@Override
public void onEvent(String event, long sequence, boolean endOfBatch) throws Exception {
onEvent(event);
}
@Override
public void onEvent(String event) throws Exception {
System.out.println(event);
throw new RuntimeException("fuck");
}
}
public static void main(String[] args) {
ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat(
"Action" + "-thread-%d").build();
EventFactory<String> EVENT_FACTORY = new EventFactory<String>() {
@Override
public String newInstance() {
return new String();
}
};
ExecutorService es = Executors.newCachedThreadPool(namedThreadFactory);
Disruptor<String> disruptor = new Disruptor<String>(EVENT_FACTORY, 8, es);
disruptor.handleEventsWith(new ActorHandler());
RingBuffer<String> ringBuffer = disruptor.start();
long seq = ringBuffer.next();
String k = ringBuffer.get(seq);
k = "test";
ringBuffer.publish(seq);
}
}