Java 长时间运行的Web服务体系结构
我们使用axis2构建Web服务,使用Jboss服务器运行所有应用程序的逻辑。我们被要求构建一个与bean对话的web服务,该bean可能需要1小时才能响应(取决于请求的大小),因此我们无法在这段时间内保持与消费者的连接 我们可以使用异步Web服务,但效果并不理想,因此我们决定实现一个bean,该bean将执行Web服务背后的逻辑,并让服务异步调用该bean。webservice将生成一个令牌,该令牌将传递给消费者,消费者可以使用它来查询请求的状态 我的问题是:Java 长时间运行的Web服务体系结构,java,web-services,jboss,axis2,long-running-processes,Java,Web Services,Jboss,Axis2,Long Running Processes,我们使用axis2构建Web服务,使用Jboss服务器运行所有应用程序的逻辑。我们被要求构建一个与bean对话的web服务,该bean可能需要1小时才能响应(取决于请求的大小),因此我们无法在这段时间内保持与消费者的连接 我们可以使用异步Web服务,但效果并不理想,因此我们决定实现一个bean,该bean将执行Web服务背后的逻辑,并让服务异步调用该bean。webservice将生成一个令牌,该令牌将传递给消费者,消费者可以使用它来查询请求的状态 我的问题是: 当我从创建该bean的服务中的方
我不认为有状态会话bean可以解决您的问题,它们是为长时间运行的会话而设计的,这不是您的场景 我的建议是使用Java5样式的线程池,使用factory类创建:
ExecutorService
实例Callable.call()
方法将以任何形式对业务逻辑bean进行实际调用可调用的
被传递给ExecutorService.submit()
,它立即返回一个未来
对象,表示调用的最终结果。Executor
将在一个单独的线程中开始调用您的Callable
未来
存储在映射
中,令牌作为密钥Future
,并在Future
上调用get()
,并使用超时值,以便只等待一小段时间即可得到答案。调用get()
将返回调用的Callable
的执行结果。
- 如果答案可用,则将其返回给客户机,并从“地图”中删除
未来
- 否则,请告诉客户稍后再来
这是一种非常稳健的方法。如果您愿意,您甚至可以配置
ExecutorService
来限制可以同时执行的调用数量。您可以采取的另一种方法是使用JMS和DB
这个过程将是
- 如果bean方法抛出异常,持久的JMS队列将重新传递
- 如果服务器重新启动,持久的JMS队列将重新传递
- 通过使用DB表而不是一些静态数据,您可以支持集群或负载平衡环境