2012-04-25 5 views
3

私は別のシステムから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つのオプションを検討してください。

  1. 設定エラーが初期XmlReceivedEventに反対し、完全に処理した後、それを取得:

    public class RequestHandler { 
    
        @RequestMapping 
        public Errors handleRequest(String xmlData) { 
         XmlReceivedEvent event = new XmlReceivedEvent(xmlData); 
         eventBus.post(event); 
         ... 
         return event.getErrors(); 
        } 
    } 
    

ただし、その場合には、私が合格する必要がありますエラーは、Validatorで実際のデータで使用できるように、チェーン内の各イベントに対処します。

  1. 内部オブジェクト人口エラーで検証から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は春ステートレスサービス(シングルトン)ですので、私はクラスフィールド内の任意のデータを保存しないようしたいと思います。

アイデアを気に入ってください。

答えて

9

このようなワークフローが必要な場合は、Guava EventBusを使用しないでください。 EventBusは、イベントポスターがイベントのポスターを知らない、または気にすることなく、イベントを購読者に投稿できるようにするためのものです。

プリプロセッサ、ペリスタ、バリデーターを注入し、そのメソッドを直接呼び出すような、もっと簡単な操作をしなければいけないように聞こえます。

+0

ありがとうございます。しかし、他のすべてのアプリケーションコンポーネントへの参照を保持するようなGod-Objectを作成することを恐れています。本当にテストするのは難しいかもしれませんが、どう思いますか? – stoweesh

+0

@stoweesh:私は知らない、あなたが描いたことから、それは私にとっては神の目的であるようには聞こえません。一般的なアプローチは、それが神の目的になるならば、それが論理的に一緒になって別のクラスに引き抜かれることを見つけることだろう。インターフェイスを使用してサービスを注入すると、偽の実装を使用して簡単にテストすることができます。 – ColinD

関連する問題