다른 시스템에서 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 응답을받을 수 있습니까?
나는 두 가지 옵션을 고려하십시오
설정 오류가 초기 XmlReceivedEvent에 반대하고 완전한 처리 한 후이를 검색 :
public class RequestHandler { @RequestMapping public Errors handleRequest(String xmlData) { XmlReceivedEvent event = new XmlReceivedEvent(xmlData); eventBus.post(event); ... return event.getErrors(); } }
그러나,이 경우에 내가 통과해야합니다 errors는 Validator에서 실제 데이터로 채울 수 있도록 체인의 각 이벤트에 반대합니다.
는 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를은 봄 비 저장 서비스 (싱글), 그래서 클래스 필드에 데이터를 저장하지 않도록하고 싶습니다.
아이디어가 있으면 감사하겠습니다.
감사합니다. 그러나 나는 다른 모든 응용 프로그램 구성 요소에 대한 참조를 보유하는 그러한 God-Object를 만드는 것을 두려워합니다. 정말 테스트하기가 어려울 수 있습니다. 어떻게 생각하십니까? – stoweesh
@stoweesh : 나는 당신이 묘사 한 것에서 그것은 나에게 하나님의 대상이 될 것 같지 않다는 것을 알지 못한다. 일반적인 접근 방법은 그것이 신이 될 때 논리적으로 합쳐져서 다른 클래스로 추출되는 것들을 찾는 것입니다. 인터페이스를 사용하고 서비스를 삽입하면 가짜 구현을 사용하여 쉽게 테스트 할 수 있습니다. – ColinD