0

WARがJBossにデプロイされた後でのみ、メソッドを実行したいと思います。

問題:現在、@ PostConstructを使用して、保存されたスケジュールをDBからロードしています。問題は、このメソッドからスケジューラーのインスタンスを作成していることです。これにより、Quartzスケジューラーが開始され、JBossがデプロイを完了できなくなります。ロードするスケジュールがない場合、WARは正常にデプロイされますが、スケジュールがある場合、JBossはスケジュールが実際に完了するのを「待機」しているため、デプロイが失敗します。

完全にデプロイされるまでメソッド呼び出しを遅らせる方法はありますか?または、サーバー上で(サーバーコードから)非同期呼び出しを行うことは可能ですか?

4

3 に答える 3

1

Java EE仕様では、アプリケーションサーバーが提供する機能外でのスレッド操作は大幅に控えています。

いかなる場合でも、無限ループでコンテナ管理スレッドを使用しないでください。コンテナはスレッドが返されることを期待しています。スレッドの作成は、巻き添え被害をあまり受けずに実行できます(コンテナーがすべてのアプリケーション間のリソースを管理できないため、サーバーに複数のアプリを配置しない場合)が、任意のコンテナースレッドを返す必要があります。

新しいJboss7には、いくつかのJava EEスケジューリング機能があります(@Schedulingとtimer、永続的なタイマーの可能性あり)。クイック検索は、JBoss 7でQuartzを実行する方法の例を示しています:Jboss AS 7.0でQuartzスケジューリングを有効にする方法は?

古いJBossには、より高度な統合が存在します(JCA統合は、より細かいスレッド管理を行うための唯一の標準的な方法です)。それらを見つけるためにグーグルを使用してください。

于 2012-07-20T12:26:57.140 に答える
0

単純なServletContextListenerはあなたのために問題を解決しませんか?contextInitializedメソッドで必要なものを実装するだけです。

于 2012-07-21T22:15:16.047 に答える
0

JBoss 7には、管理APIがあります。

たぶん、サーバーが起動しているかどうかを確認するために使用できます(シングルトンとTimerServiceを使用)。

サンプルコード:

ModelControllerClient client = ModelControllerClient.Factory.create(InetAddress.getByName("localhost"), 9999);
        ModelNode op = new ModelNode();
        op.get(ClientConstants.OP).set("read-attribute");
        op.get(ClientConstants.NAME).set("server-state");
        ModelNode returnVal = client.execute(op);

        if(StringUtils.equals(returnVal.get("result").toString(), "\"running\"")){
            LOGGER.info("Server running, init start actions");
            timer.cancel();
        }else{
            LOGGER.info("Server not running, wait");
        }  
于 2013-06-14T07:45:45.810 に答える