別のシステムから xml イベントを受信し、特定のワークフローを使用してそれらを処理し、潜在的なエラーのリストを HTTP 応答として返す Web サービスがあります。
イベント処理ワークフローは、 Guava の EventBusを使用して実装されたいくつかのハンドラー (たとえば、 Preprocessor、Persister、およびValidator ) で構成されます。ハンドラは互いにイベントを送信します。このようなもの:
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
}
}
問題は、処理結果をValidatorハンドラーから開始点 ( RequestHandler ) に深く戻して、ユーザーが HTTP 応答を受信できるようにする方法です。
次の 2 つのオプションを検討します。
エラー オブジェクトを最初の XmlReceivedEvent に設定し、処理の完了後に取得します。
public class RequestHandler { @RequestMapping public Errors handleRequest(String xmlData) { XmlReceivedEvent event = new XmlReceivedEvent(xmlData); eventBus.post(event); ... return event.getErrors(); } }
ただし、その場合、チェーン内の各イベントにエラー オブジェクトを渡して、Validatorが実際のデータを入力できるようにする必要があります。
RequestHandlerを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は Spring のステートレス サービス (シングルトン) であるため、クラス フィールドにデータを保存することは避けたいと考えています。
どんなアイデアでも大歓迎です。