Java 如何在自动连接的Web服务中维护状态?
我有一个如下的设计问题:我想执行几个soap Web服务,其中每个响应都依赖于前者。 当获得所有响应时,我想验证所有获得的数据,然后基于它构建一些输出,并从数据库更新中发布 因此,我创建了一个Java 如何在自动连接的Web服务中维护状态?,java,spring,web-services,design-patterns,Java,Spring,Web Services,Design Patterns,我有一个如下的设计问题:我想执行几个soap Web服务,其中每个响应都依赖于前者。 当获得所有响应时,我想验证所有获得的数据,然后基于它构建一些输出,并从数据库更新中发布 因此,我创建了一个TemplateFacade方法来包装所有要执行的Web服务。问题:我显然必须在方法调用之间保留响应。这将是一个问题,因为根据定义,自动连线服务应该是无状态的,并且是单例的 那么,如何将注入用于必须保持某种状态的服务(至少在Executor.execute()终止之前) 你能推荐一种更好的设计方法吗 @Co
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(..);
}
}
要在多个web服务之间共享状态,您可以在绑定到用户的会话中使用PersonState进行跟踪。我建议使用加密或哈希来保护信息 验证完成后,可以在会话中保留PersonState。当buildOutput启动时,您可以获取PersonState对象并继续执行逻辑等等 保持PersonState具有较小的内存占用非常重要。如果有大量数据,您可以创建一个stateObject,它将具有下一步所需的状态。e、 在验证结束时,您可以创建、构建状态对象并将其放入会话中。生成将从会话中获取对象并继续 但我不确定是否真的有必要跟踪状态,并在两个web服务调用中进行跟踪。更好的解决方案是将所有逻辑部分移动到另一层,并将web服务用作业务/流程层的窗口 编辑: 还有一个解决方案可以帮助您,即每个步骤的响应可以包含下一步所需的必要状态。e、 validateResponse包含personState,它可以通过某种方式传递给构建