私の JEE6-App (Glassfish 3.0.1 で実行) には、大量のメールを送信する必要がある EmailEJB があります。メールは非同期で送信されるため、新しい EJB3.1 @Asynchronous で注釈が付けられ、別のスレッドで実行できます。ここで、メソッドの現在のステータスについてユーザーに通知する必要があります。すでに送信されたメールの数は?
メールの非同期送信は正常に機能しますが、進行状況を外部からアクセスできるようにする方法がわかりません。それを行うための私のアプローチはかなり間違っているようですが、どういうわけかそれが可能でなければなりません(おそらく別のアプローチ)。これは私の EmailEJB が現在どのように見えるかです (疑似コードのようなものですが、私が望むものを説明しています):
@Stateful
public class EmailEJB {
@Asynchronous
public Future<Integer> sendMails() {
for (int i=0; i<mails.size; i++) {
sendMail(mails[i])
// i want to return the progress without returning ;)
return new AsyncResult<Integer>(i)
}
}
}
//Just for the completeness... from outside, i'm accessing the progress like this:
Future<Integer> progress = emailEJB.sendEmails();
Integer currentvalue = progress.get();
リターンでキャンセルせずに、非同期関数内で現在の進行状況を返すにはどうすればよいですか? 関数内のループの進行状況をユーザーに表示するにはどうすればよいですか? 別の非同期メソッドが必要ですか? ヒントはありますか?