Java eeで非同期メソッド呼び出しを行うための2つのクラスがあります。リンクhttp://satishgopal.wordpress.com/2011/04/24/ejb-3-1-asynchronous-methodsをたどって方法を学んでいます。非同期メソッドを呼び出すと、次の結果が得られます。
結果:
INFO: caller method running in thread http-thread-pool-8083(5) date:1373866669346
INFO: start running asyncMethod in thread http-thread-pool-8083(5)
INFO: finished running asyncMethod in thread http-thread-pool-8083(5)
INFO: caller method running in thread http-thread-pool-8083(5) date:1373866672348
私が期待しているのは、asyncMethod() メソッドの呼び出しが完了するのを待つことではありませんが、結果からわかるように、asyncMethod() メソッドの呼び出しは別のスレッドによって処理されません。Glassfish 3.1.1 をアプリケーション コンテナーとして使用します。
BusinessBean クラス
@ManagedBean
@Stateless
public class BusinessBean {
@Asynchronous
public void asyncMethod() {
System.out.println("start running asyncMethod in thread "+ Thread.currentThread().getName());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("finished running asyncMethod in thread "+ Thread.currentThread().getName());
}
}
LoginBean クラス
@ManagedBean
@RequestScoped
public class LoginBean implements Serializable {
private static final long serialVersionUID = 1L;
@ManagedProperty(value="#{businessBean}")
BusinessBean businessBean;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void login(){
System.out.println("caller method running in thread "+Thread.currentThread().getName()+" date:"+System.currentTimeMillis());
businessBean.asyncMethod();
System.out.println("caller method running in thread "+Thread.currentThread().getName()+" date:"+System.currentTimeMillis());
}
public BusinessBean getBusinessBean() {
return businessBean;
}
public void setBusinessBean(BusinessBean businessBean) {
this.businessBean = businessBean;
}
}