Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在自动连接的Web服务中维护状态?_Java_Spring_Web Services_Design Patterns - Fatal编程技术网

Java 如何在自动连接的Web服务中维护状态?

Java 如何在自动连接的Web服务中维护状态?,java,spring,web-services,design-patterns,Java,Spring,Web Services,Design Patterns,我有一个如下的设计问题:我想执行几个soap Web服务,其中每个响应都依赖于前者。 当获得所有响应时,我想验证所有获得的数据,然后基于它构建一些输出,并从数据库更新中发布 因此,我创建了一个TemplateFacade方法来包装所有要执行的Web服务。问题:我显然必须在方法调用之间保留响应。这将是一个问题,因为根据定义,自动连线服务应该是无状态的,并且是单例的 那么,如何将注入用于必须保持某种状态的服务(至少在Executor.execute()终止之前) 你能推荐一种更好的设计方法吗 @Co

我有一个如下的设计问题:我想执行几个soap Web服务,其中每个响应都依赖于前者。 当获得所有响应时,我想验证所有获得的数据,然后基于它构建一些输出,并从数据库更新中发布

因此,我创建了一个
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,它可以通过某种方式传递给构建