最後に、これに対する解決策を見つけたので、スレッドに別の回答を追加します。
私の環境:WAS 8.5.5、Quartz 1.8.5、Springなし。
私が抱えていた問題は、(上記の)管理されていないスレッドが から NamingException を引き起こし、ctx.lookup(myJndiUrl)
代わりに他のアプリケーションサーバー(JBoss、Weblogic)で正しく動作していたことでした。実際、Webphere は次のメッセージで「インシデント」を発生させていました。
javax.naming.ConfigurationException: サーバー ランタイムが操作のスレッドを J2EE アプリケーション コンポーネントに関連付けることができないため、"java:" 名に対する JNDI 操作を完了できません。この状態は、「java:」名を使用する JNDI クライアントがサーバー アプリケーション要求のスレッドで実行されない場合に発生する可能性があります。J2EE アプリケーションが、静的コード ブロック内またはその J2EE アプリケーションによって作成されたスレッド内の「java:」名に対して JNDI 操作を実行しないようにしてください。このようなコードは、必ずしもサーバー アプリケーション要求のスレッドで実行されるとは限らないため、"java:" 名に対する JNDI 操作ではサポートされません。
次の手順で問題を解決しました。
1) Quartz 1.8.6 にアップグレード (コード変更なし)、maven pom のみ
2) 新しい WorkManagerThreadExecutor を利用可能にするために、次の dep をクラスパス (私の場合は EAR の /lib フォルダー) に追加しました
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-commonj</artifactId>
<version>1.8.6</version>
</dependency>
注: QTZ-113または公式の Quartz ドキュメント1.x 2.x では、この修正を有効にする方法については言及されていません。
3) Quartz.properties に以下を追加しました (「wm/default」は、私の WAS 8.5.5 で既に構成されている DefaultWorkManager の JNDI でした。WAS コンソールの [Resources] -> [AsynchronousBeans] -> [WorkManagers]を参照してください):
org.quartz.threadExecutor.class=org.quartz.custom.WorkManagerThreadExecutor
org.quartz.threadExecutor.workManagerName=wm/default
注: 右のクラスはorg.quartz です。Quartz -scheduler-1.8.6 (テスト済み)、またはorg.quartz のカスタム.WorkManagerThreadExecutor 。commonj .WorkManagerThreadExecutor 2.1.1以降(テストされていませんが、 maven のリポジトリにある実際の Quartz-commonj の jar内で検証されています)
4) Quartzジョブの空のコンストラクターに JNDI ルックアップを 移動しました( m_klovre の「J2EE コンテナーの外側のスレッド」のおかげです)。つまり、コンストラクターは、アプリケーションのまったく同じ J2EE コンテキストからリフレクション (メソッド) によって呼び出され、名前空間にnewInstance()
アクセスできましたが、メソッドは、アプリケーションの EJB がすべて欠落している、より貧弱なコンテキストで実行されていました。java:global
execute(JobExecutionContext)
お役に立てれば。
Ps。参考までに、上記で使用した Quartz.properties ファイルの例をここで見つけることができます