3

サーバーの起動時にスレッドを開始したい。私のスレッドはdbからデータをプルし、JMSキューに入れます。すべてのBeanはSpring構成ファイルで定義されています。JMSキューとDB接続ファクトリ(CONNECTION-FACTORY)は、weblogicで構成されます。contextInitializedスレッドの開始コードをのメソッドContextLoaderListenerまたはinitのメソッドに配置しようとしていますservletただし、サーバーの起動中に次の例外が発生します:

ネストされた例外はjavax.naming.NoPermissionExceptionです。匿名ユーザーには、ルックアップ操作を実行するためのCONNECTION-FACTORYに対する権限がありません。

私のコードは、サーブレットのdoGetメソッドに入れて、サーバーの起動後にURLを押すと、完全に機能します。ただし、手動でスレッドを開始したくありません。

すべてのBeanが正しく初期化されていないため、このエラーが発生していると思います。

サーバーの起動後にスレッドが自動的に開始されるように、コードをどこに配置しますか?

4

2 に答える 2

4

独自のスレッドを作成している場合は、おそらく問題です。アプリケーションサーバー内では、コンテナにスレッドプールを管理させ、実行する可能性のあるジョブをスケジュールする必要があります。

これをweb.xmlに追加します。

<resource-ref>
    <res-ref-name>timer/MyTimer/res-ref-name>
    <res-type>commonj.timers.TimerManager</res-type>
    <res-auth>Container</res-auth>
    <res-sharing-scope>Unshareable</res-sharing-scope>
</resource-ref>

applicationContext.xml(spring-context-support JARが必要):

<bean id="scheduler" class="org.springframework.scheduling.commonj.TimerManagerTaskScheduler" scope="singleton">
    <property name="timerManagerName" value="java:comp/env/timer/MyTimer"/>
</bean>    

次に、contextInitialized(...)で次のことを行います。

scheduledFuture = scheduler.schedule(new MyJob());

そして、あなたのコンテキストでは、Destroyed(...)do;

scheduledFuture.cancel(true);

私のプロジェクトでは、アプリケーションサーバーレベルでタイマーを構成することについて何も見つからないので、「正しく機能する」と思います。

(インターフェースを介して)非同期でジョブを生成する場合java.lang.concurrent.Executor、手順は似ていますが、Weblogicでスレッドプールを構成する必要があります。

web.xml内;

<resource-ref>
    <res-ref-name>wm/MyWorkManager</res-ref-name>
    <res-type>commonj.work.WorkManager</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

applicationContext.xmlの場合:

<bean id="executor" class="org.springframework.scheduling.commonj.WorkManagerTaskExecutor" scope="singleton">
    <property name="workManagerName" value="java:comp/env/wm/MyWorkManager"/>
</bean>

weblogic.xml(またはEARと同等のもの)では、次のようになります。

<work-manager>
    <name>wm/MyWorkManager</name>
    <min-threads-constraint>
        <name>minThreads</name>
        <count>1</count>
    </min-threads-constraint>
    <max-threads-constraint>
        <name>maxThreads</name>
        <count>20</count>
    </max-threads-constraint>
</work-manager>    

そしてあなたのコードでは:

executor.execute(new MyRunnable());

この特定のアプリサーバーのジョブスケジューリング関連情報の詳細については、タイマーとワークマネージャに関するWeblogicドキュメントをお読みください。

于 2012-11-30T09:01:13.757 に答える
-1

これに対する解決策が見つかりました。例外としてjavax.naming.NoPermissionException、に次の行を追加する必要がありweblogic.xmlます。ユーザーと一緒にWebアプリを開始し、デプロイ時にJNDIルックアップを有効にします

<weblogic-web-app>
    <context-root>testApp</context-root>    
    <servlet-descriptor>
        <servlet-name>SchedulerServlet</servlet-name>
        <init-as-principal-name>tour_weblogic_user_name</init-as-principal-name>
    </servlet-descriptor>
</weblogic-web-app> 
于 2012-12-04T09:57:24.493 に答える