如何在自动装配的Web服务中维护状态?

时间:2014-03-04 09:42:24

标签: java spring web-services design-patterns

我有一个设计问题如下:我想执行几个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(..);
    }
}

1 个答案:

答案 0 :(得分:1)

要在多个Web服务之间共享状态,您可以在与用户关联的会话中使用PersonState跟踪。我建议使用加密或散列来保护信息。

验证完成后,您可以在会话中保留PersonState。当buildOutput启动时,您可以获取PersonState对象并继续使用逻辑等等。

重要的是,让PersonState保持较小的内存占用量。包含大量数据,您可以创建一个stateObject,它将具有下一步所需的状态。例如在验证结束时,您可以创建BuildState对象并将其放入会话中。 build将从会话中获取对象并继续。

但我不确定是否真的有必要跟踪状态并在2个Web服务调用中执行此操作。更好的解决方案是将所有逻辑部件移动到另一个层,并将Web服务用作业务/流程层的窗口。

编辑:

可能对您有用的另一个解决方案是,每个步骤的响应可能包含下一步所需的必要状态。例如validateResponse包含personState,可以以某种方式为构建传递。