精简版:
如何创建一个Promise<Result>在回调触发器上完成的?
长版:
我正在开发一个处理第三方SOAP服务的应用程序.来自用户的请求同时委托多个SOAP服务,聚合结果并发送回用户.
系统需要是可扩展的,并且应该允许多个并发用户.当每个用户请求最终触发大约10个Web服务调用并且每个呼叫阻塞大约1秒时,系统需要设计为具有非阻塞I/O.
我在Play Framework(Java)中使用Apache CXF用于此系统.我已设法生成异步WS客户端代理并启用异步传输.我无法弄清楚当我委托给多个Web服务代理时如何返回Future to Play的Thread,结果将作为回调获得.
选项1:使用返回Java Future的异步方法调用.
正如java.util.concurrent.Future线程的scala.concurrent.Future包装器中所描述的那样,我们无法将Java Future转换为Scala Future.从Future获得结果的唯一方法是Future.get()阻止调用者.由于CXF生成的代理返回Java Future,因此排除了此选项.
选项2:使用Scala Future.
由于CXF生成代理接口,我不确定是否有任何方式可以干预并返回Scala Future(AFAIK Akka使用Scala Futures)而不是Java Future?
选项3:使用回调方法.
由CXF生成的返回Java Future的异步方法也需要一个回调对象,我想这将在结果准备好时提供回调.要使用这种方法,我需要返回一个将等待我收到回调的Future.
我认为选项3是最有希望的,虽然我对如何返回一个将在收到回调时完成的Promise没有任何想法.我可能有一个线程在while(true)等待,直到结果可用.再一次,我不知道如何在wait不阻塞线程的情况下进入?
简而言之,我正在尝试构建一个系统,该系统正在进行大量的SOAP Web服务调用,其中每个调用都会占用大量时间.在许多并发Web服务调用的情况下,系统可能很容易耗尽线程.我正在寻找一种基于非阻塞I/O的解决方案,它可以同时允许许多正在进行的Web服务调用.
我是EJB的新手,最近开始研究EJB(3.0).我已经使用Java 6年了,但之前从未使用过EJB.至少可以说,我对整个EJB业务的复杂性感到不知所措.我无法理解我在哪里可以实际应用一些概念.
在理解Stateless会话bean之后,我想到的一个问题是,你能不能总是用没有本地成员的类的共享实例替换无状态会话bean(实际上使其成为无状态)?我读到了关于无状态会话bean的实例池.如果没有状态,你能不能简单地使用一个实例?
我在OpenEJB上部署我的示例,并且我必须使用无状态会话bean的一个地方是与EntityManager进行交互.我不确定我是否可以在任意类中处理EntityManager.除此之外,仍然困惑无状态会话bean试图解决的问题.