私は別のシステムからxmlイベントを受け取り、特定のワークフローを使ってそれらを処理し、潜在的なエラーのリストをHTTP応答として返すWebサービスを持っています。 Guava's EventBusを使用して実装:Guava EventBus:イベントハンドラから結果を返す方法
イベント処理ワークフローには、いくつかのハンドラ(プリプロセッサ、存続とバリデータのは、言わせて)から構成されています。ハンドラは、互いにイベントを送信します。このような何か:バック出発点(のRequestHandler)へバリハンドラから深く処理結果を返す方法ので、ユーザは、HTTPレスポンスを受信することができます
public class RequestHandler {
@RequestMapping
public Errors handleRequest(String xmlData) {
eventBus.post(new XmlReceivedEvent(xmlData));
...
return errors; // how to get errors object from the last handler in chain ?
}
}
public class Preprocessor {
@Subscribe
public void onXmlReceived(XmlReceivedEvent event) {
// do some pre-processing
...
eventBus.post(new PreprocessingCompleteEvent(preprocessingResult));
}
}
public class Persister {
@Subscribe
public void onPreprocessingComplete(PreprocessingCompleteEvent event) {
// do some persistence stuff
...
eventBus.post(new PersistenceCompleteEvent(persistenceResult));
}
}
public class Validator {
@Subscribe
public void onPersistenceComplete(PersistenceCompleteEvent event) {
// do validation
...
eventBus.post(new ValidationCompleteEvent(errors)); // errors object created, should be returned back to the RequestHandler
}
}
問題がありますか?
は、私は2つのオプションを検討してください。
設定エラーが初期XmlReceivedEventに反対し、完全に処理した後、それを取得:
public class RequestHandler { @RequestMapping public Errors handleRequest(String xmlData) { XmlReceivedEvent event = new XmlReceivedEvent(xmlData); eventBus.post(event); ... return event.getErrors(); } }
ただし、その場合には、私が合格する必要がありますエラーは、Validatorで実際のデータで使用できるように、チェーン内の各イベントに対処します。
内部オブジェクト人口エラーで検証からValidationCompleteEventに要請ハンドラ購読します。
public class RequestHandler { private Errors errors; @RequestMapping public Errors handleRequest(String xmlData) { XmlReceivedEvent event = new XmlReceivedEvent(xmlData); eventBus.post(event); ... return this.errors; // ??? } @Subscribe public void onValidationComplete(ValidationCompleteEvent event) { this.errors = event.getErrors(); } }
しかし、残念ながら、のRequestHandlerは春ステートレスサービス(シングルトン)ですので、私はクラスフィールド内の任意のデータを保存しないようしたいと思います。
アイデアを気に入ってください。
ありがとうございます。しかし、他のすべてのアプリケーションコンポーネントへの参照を保持するようなGod-Objectを作成することを恐れています。本当にテストするのは難しいかもしれませんが、どう思いますか? – stoweesh
@stoweesh:私は知らない、あなたが描いたことから、それは私にとっては神の目的であるようには聞こえません。一般的なアプローチは、それが神の目的になるならば、それが論理的に一緒になって別のクラスに引き抜かれることを見つけることだろう。インターフェイスを使用してサービスを注入すると、偽の実装を使用して簡単にテストすることができます。 – ColinD