3

私は卒業プロジェクトを行っていますが、ここでジレンマに陥っています。PDF を生成し、データベース内のデータによって定義されたスケジュールに従って電子メールで送信するアプリケーションを作成する必要があります。私はこのプロジェクトの会社で働いており、使用している GlassFish アプリケーション サーバーが既にあります。現在のように、ソリューション全体が 1 つのパッケージで提供されるのが最善です。Webstart Web Application などのクライアントがすべて 1 つのパッケージに含まれています

私の新しいサービスは、別のスレッドで実行し、レポートを生成してメールで送信する必要があります。私が Web で読んだことによると、GlassFish としてアプリケーション サーバーで独自のスレッドを実行することは非常に推奨されていないため、独自の別のアプリケーションを作成する必要があるようです。

これは本当にありえますか?あなたのコメントは何ですか?また、これに対するベスト プラクティスは何ですか?

4

1 に答える 1

5

@スケジュール

EJB 3.1 (glassfish 3.x) を使用している場合は、@Schedule アノテーションを使用して、コンテナが指定された間隔で、または指定されたカレンダー時刻にメソッドを呼び出すようにすることができます。独自のコードでスレッドの処理を回避できるようにする

EJB 3.1 タイマーについて読む

@Stateless
public class LabbBean {

    @EJB
    WorkerEjb workerEjb;

    @Schedule(second="*/5", minute="*",hour="*", persistent=false)
    public void myMethod() {
        for (all jobs found in db){
            workerEjb.workerMethod(job);    
        }
    }
}

@Stateless
public class WorkerEjb {
    @Asynchronous
    public void workerMethod(job) {
        //Send emails
    }
}

別々のスレッドで作業を行いたい場合、@Schedule アノテーション付きメソッドは、@Asynchronous アノテーションが付けられた worker-method を使用して worker-ejb を呼び出すことができます。

@タイムアウト

データベースからスケジュールを開始する必要があることに気付きました。@Singleton ejb と @Startup アノテーションを使用して、一連のタイマーをプログラムで開始するオプションがあります。タイムアウト アノテーション付きメソッドは、いくつかのタイマーが同時に実行された場合、別のスレッドで呼び出されます。

@Singleton
@Startup
public class LabbBean {
    @Resource
    protected TimerService timerService;

    @PostConstruct
    public void init() {
        //Init your timers from the data in the database here
        for (all your timers) {
            TimerConfig config = new TimerConfig();
            config.setInfo("timer1");
            config.setPersistent(false);

            ScheduleExpression schedule = new ScheduleExpression();
            schedule.dayOfMonth(10);
            schedule.minute(2);
            timerService.createCalendarTimer(schedule, config);
        }
    }

    //method called when timeout occurs
    @Timeout
    public void timeoutHandler(Timer timer) {
        String name = timer.getInfo().toString();
        System.out.println("Timer name=" + name);
    }
}
于 2012-12-10T09:34:02.027 に答える