我在我的 Web 应用程序中使用 LMAX 中断器,它接受 http 请求参数并将它们处理到环形缓冲区。3 个事件处理程序处理和处理数据,最后一个将其保存到数据库中。当 servlet 被实例化时,初始化一次 ringbuffer。这是正确的吗?
public void init() throws ServletException {
Disruptor<CampaignCode> disruptor = new Disruptor<CampaignCode>(
CampaignCode.FACTORY, 1024, Executors.newCachedThreadPool());
EventHandler<CampaignCode> campaignDetailsLoader = new CampaignDetailsLoaderEvent();
EventHandler<CampaignCode> templateEvent = new TemplateBuildEvent();
EventHandler<CampaignCode> codeGenerator = new CodeGenerationEventHandler();
EventHandler<CampaignCode> campaignSaveEventHandler= new CampaignSaveEventHandler();
disruptor.handleEventsWith(templateEvent, campaignDetailsLoader).then(
codeGenerator).then(campaignSaveEventHandler);
this.ringBuffer = disruptor.start();
}
在这里,我将值直接放入 ringbuffer
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String campaignId = request.getParameter("campaignId");
String campaignType = request.getParameter("campaignType");
if (campaignId != null && !campaignId.isEmpty()) {
long sequence = ringBuffer.next();
CampaignCode campaign = ringBuffer.get(sequence);
campaign.setCampaignId(Long.parseLong(campaignId));
campaign.setCampaignType(campaignType);
ringBuffer.publish(sequence);
}
}
事件处理程序
public class CampaignDetailsLoaderEvent implements EventHandler<CampaignCode> {
@Override
public void onEvent(CampaignCode event, long sequence, boolean endOfBatch)
throws Exception {
//load details from db and process
// udpate values to the event object
}
}
public class TemplateBuildEvent implements EventHandler<CampaignCode> {
@Override
public void onEvent(CampaignCode event, long sequence, boolean endOfBatch)
throws Exception {
// find the template of this type
// set template to the event object
}
}
public class CodeGenerationEventHandler implements EventHandler<CampaignCode> {
@Override
public void onEvent(CampaignCode event, long sequence, boolean endOfBatch)
throws Exception {
// generate custom dsl code and execute it
// update the output to the event object
//next handler will save it the db
}
}
public class CampaignSaveEventHandler implements EventHandler<CampaignCode> {
@Override
public void onEvent(CampaignCode event, long sequence, boolean endOfBatch)
throws Exception {
// save the details to db
// done!
}
}
这是发布到环形缓冲区的正确方法吗?我需要同步“ringBuffer”对象吗?前 2 个事件并行运行,然后是第 3 个事件。当我有快速的发布者和缓慢的消费者时,我应该如何处理这个问题?我正在使用disruptor 3.1.1,我在web 环境中找不到很好的disruptor 使用示例。一个简单的代码实现,如果你做过,会帮助我理解很多!