我有一个设计问题如下:我想执行几个soap webservices,其中每个响应都取决于前者。 获得所有响应后,我想验证所有获得的数据,然后根据它构建一些输出,并从DB更新发出。
因此,我创建了一个TemplateFacade
方法,它包装了所有要执行的Web服务。问题:我显然必须坚持方法调用之间的响应。这将是有问题的,因为根据定义,自动服务应该是无国籍的并且是单身人士。
那么我如何使用注入必须维持某种状态的服务(至少在Executor.execute()
终止之前)?
你能推荐一种更好的设计方法吗?
@Component
class Executor {
@Autowired
TemplateFacade template;
public void execute() {
template.run();
template.validate();
template.buildOutput();
template.updateDatabase();
}
}
@Service
class TemplateFacade {
//service classes wrapping webservice soap execution logic
@Autowired
PersonSoap personSoap;
@Autowired
CarSsoap carSoap;
@Autowired
ServiceDao dao;
private WebserviceRsp personRsp, carRsp;
void run() {
personRsp = personSoap.invoke();
//process response and prepare CarSoapXML accordingly, then send
carRsp = carSoap.invoke();
}
//the following methods will all
void validate() {
//validate both responses
}
void buildOutput() {
//create system out based on responses
}
void updateDatabase() {
dao.update(..);
}
}
答案 0 :(得分:1)
要在多个Web服务之间共享状态,您可以在与用户关联的会话中使用PersonState跟踪。我建议使用加密或散列来保护信息。
验证完成后,您可以在会话中保留PersonState。当buildOutput启动时,您可以获取PersonState对象并继续使用逻辑等等。
重要的是,让PersonState保持较小的内存占用量。包含大量数据,您可以创建一个stateObject,它将具有下一步所需的状态。例如在验证结束时,您可以创建BuildState对象并将其放入会话中。 build将从会话中获取对象并继续。
但我不确定是否真的有必要跟踪状态并在2个Web服务调用中执行此操作。更好的解决方案是将所有逻辑部件移动到另一个层,并将Web服务用作业务/流程层的窗口。
编辑:
可能对您有用的另一个解决方案是,每个步骤的响应可能包含下一步所需的必要状态。例如validateResponse包含personState,可以以某种方式为构建传递。