2012-04-25 4 views
3

다른 시스템에서 XML 이벤트를 수신하고 특정 워크 플로를 사용하여 처리 한 웹 서비스가 있으며 HTTPS 응답으로 잠재적 오류 목록을 다시 보냅니다. Guava's EventBus를 사용하여 구현 :Guava EventBus : 이벤트 처리기에서 결과를 반환하는 방법

이벤트 처리 워크 플로우는 여러 핸들러 (처리기,Persister검사기의 말을하자)로 구성되어 있습니다. 핸들러는 서로 이벤트를 보냅니다. 이런 식으로 뭔가 :

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 
    } 
} 

문제는 다음과 같습니다 방법 시작점 (RequestHandler를)로 다시 검사기 핸들러에서 깊이 처리 결과을 반환하므로 사용자는 HTTP 응답을받을 수 있습니까?

나는 두 가지 옵션을 고려하십시오

  1. 설정 오류가 초기 XmlReceivedEvent에 반대하고 완전한 처리 한 후이를 검색 :

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

그러나,이 경우에 내가 통과해야합니다 errors는 Validator에서 실제 데이터로 채울 수 있도록 체인의 각 이벤트에 반대합니다.

  1. RequestHandler를로 채워진 에러 검사기로부터 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은 이벤트 포스터가 알지 못하거나 구독자가 무엇인지 신경 쓰지 않고 구독자에게 이벤트를 게시 할 수 있도록 특별히 고안되었습니다. 따라서 구독자의 이벤트 포스터에 결과를 반환 할 수 없습니다.

전처리 기, persister 및 유효성 검사기를 주입하고 직접 메소드를 호출하는 것과 같이 훨씬 간단한 작업을 수행해야하는 것처럼 들립니다.

+0

감사합니다. 그러나 나는 다른 모든 응용 프로그램 구성 요소에 대한 참조를 보유하는 그러한 God-Object를 만드는 것을 두려워합니다. 정말 테스트하기가 어려울 수 있습니다. 어떻게 생각하십니까? – stoweesh

+0

@stoweesh : 나는 당신이 묘사 한 것에서 그것은 나에게 하나님의 대상이 될 것 같지 않다는 것을 알지 못한다. 일반적인 접근 방법은 그것이 신이 될 때 논리적으로 합쳐져서 다른 클래스로 추출되는 것들을 찾는 것입니다. 인터페이스를 사용하고 서비스를 삽입하면 가짜 구현을 사용하여 쉽게 테스트 할 수 있습니다. – ColinD

관련 문제