在官方Java EE文档https://docs.oracle.com/javaee/6/tutorial/doc/gkkqg.html中说“会话bean可以实现异步方法”。 在本教程之后,我无法异步执行方法。
它实际上是可行的,但与任何其他同步方法一样。 (它不会启动任何其他线程。)
@ManagedBean(name = "inicioSSCCBean")
@SessionScoped
public class InicioSSCCBean implements Serializable {
...
@Asynchronous
public Future<String> sendMessage() {
String status;
try {
// Call to SAP server...
} catch (MessagingException ex) {
// Error handler
}
return new AsyncResult<String>(status);
}
public void otherMethod() {
String result = sendMessage().get(); // The result is what I expect
System.out.println(result);
}
...
}
有谁知道如何从会话bean实现异步调用? 主要目标是调用SAP服务,并异步获取结果。
我正在使用JSF 2.2,PrimeFaces。
提前致谢。
答案 0 :(得分:5)
您误解了Java EE教程。术语&#34;会话bean&#34;指的是企业会话bean(EJB),而不是会话范围的托管bean(JSF / CDI bean)。
@javax.ejb.Asynchronous
注释,因为它的包已经提示,仅适用于EJB。通过在类上添加<my-element></my-element>
注释可以识别EJB,例如@javax.ejb.Xxx
或@Stateless
。
以下是正确的启动示例:
@Stateful
@Stateless
public class YourService {
@Asynchronous
public void asyncDoSomething() {
// ...
}
}
答案 1 :(得分:1)
除了您尝试使用错误类型的bean之外,您还必须了解Future
的工作原理。
当你致电Future.get()
时,线程会阻塞,直到Future
有结果。因此sendMessage().get()
的行为与同步调用完全相同。
但是,如果您在调用sendMessage()
之前调用get()
然后执行其他任务,则会异步执行。正如您所知,异步调用仅在您不需要立即获得结果时才有用,这使得它在大多数情况下不那么有用。