Web アプリケーションで LMAX ディスラプターを使用しています。これは、http 要求パラメーターを受け取り、それらをリングバッファーに処理します。3 つのイベント ハンドラーがデータを処理および処理します。最後のデータはデータベースに保存されます。サーブレットがインスタンス化されるときに、リングバッファを一度初期化します。これは正しいですか?
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();
}
ここで、値をリングバッファに直接入れます
@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 番目のイベントが実行されます。パブリッシャーが速く、コンシューマーが遅い場合、これをどのように処理すればよいですか? 私はディスラプター 3.1.1 を使用していますが、Web 環境でのディスラプターの適切な使用例が見つかりませんでした。簡単なコードの実装があれば、これを理解するのに大いに役立ちます!