在官方Java文档中,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服务,并异步获得结果。
我使用的是JSF2.2,PrimeFaces。
提前谢谢。
发布于 2016-09-16 21:18:35
您误解了Java教程。术语“会话bean”指的是企业会话bean(EJB),而不是会话范围内的托管bean (JSF/CDI )。
正如它的包已经暗示的那样,@javax.ejb.Asynchronous注释只在EJB中工作。EJB可以通过类上的@javax.ejb.Xxx注释来识别,比如@Stateless或@Stateful。
下面是正确的开球示例:
@Stateless
public class YourService {
@Asynchronous
public void asyncDoSomething() {
// ...
}
}
@ManagedBean
public class YourBean {
@EJB
private YourService yourService;
public void submit() {
yourService.asyncDoSomething();
}
}另请参阅:
发布于 2016-09-16 12:21:31
除了试图使用错误的bean这一事实之外,您还必须了解Future是如何工作的。
当您调用Future.get()时,线程将阻塞,直到Future有一个结果。因此,sendMessage().get()的行为与同步调用完全一样。
但是,如果调用sendMessage(),然后在调用get()之前执行其他任务,则将异步执行。当您意识到异步调用只有在不需要结果的时候才有用,这使得它在大多数情况下不太有用。
https://stackoverflow.com/questions/39530186
复制相似问题