【发布时间】:2013-05-06 08:10:00
【问题描述】:
我有一个单例 bean,@PostConstruct 方法需要在其内部调用 @Asynchronous 方法。它不能直接使用this 这样做,因为这会使调用同步。我不能@Inject 本身,因为它是圆形的。
【问题讨论】:
标签: jakarta-ee ejb java-ee-6 ejb-3.1 java-ee-7
我有一个单例 bean,@PostConstruct 方法需要在其内部调用 @Asynchronous 方法。它不能直接使用this 这样做,因为这会使调用同步。我不能@Inject 本身,因为它是圆形的。
【问题讨论】:
标签: jakarta-ee ejb java-ee-6 ejb-3.1 java-ee-7
你可以使用这种类型的包装器:
@Singleton
public class SingletonBean {
@Stateless
public static class AsynchronousMethodLauncher{
@EJB
private SingletonBean singletonBean;
public void launch(){
singletonBean.asynchronousMethod();
}
}
@EJB
AsynchronousMethodLauncher launcher;
@Asynchronous
public void asynchronousMethod(){
//Place your code here
}
public void yourMethod(){
launcher.launch();
}
}
【讨论】:
Caused by: org.jboss.as.server.deployment.DeploymentUnitProcessingException: WFLYEJB0128: EJB AsynchronousMethodLauncher of type com.acme.job.JobScheduler$AsynchronousMethodLauncher must not be inner class
我建议使用自然的 Java EE 方式:
@Singleton
public class AsyncSingletonBeanBean {
@Resource
private SessionContext sessionContext;
@PostConstruct
public void init() {
AsyncSingletonBeanBean myBean = sessionContext.getBusinessObject(this.getClass());
myBean.foo();
}
@Asynchronous
public Future<String> foo() {
return new AsyncResult<String>("Hello");
}
}
【讨论】: