私はJPAで動作するJSFアプリケーションを持っています。 JTA-DataSourceはwildflyで管理されています。RunnableでRegistred EntityManagerへのアクセスを取得する
これで、データベース操作を定期的に実行する必要がありました。最高が登録持続性ユニットにアクセスすることwhould
@WebListener
public class Scheduler implements ServletContextListener {
private ScheduledExecutorService scheduler;
@SuppressWarnings("deprecation")
@Override
public void contextInitialized(ServletContextEvent event) {
Calendar c = new GregorianCalendar();
Date d = c.getTime();
int stm = 60 - d.getSeconds();
int mth = 60 - d.getMinutes();
scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(new TestRunner(), stm, 60, TimeUnit.SECONDS);
}
@Override
public void contextDestroyed(ServletContextEvent event) {
scheduler.shutdownNow();
}
}
public class TestRunner implements Runnable {
private EntityManager em;
public TestRunner() {
}
@Override
public void run() {
this.Test();
}
public void Test() {
System.out.println("Test executed...");
if (this.em != null) {
System.out.println(em.find(Ship.class, 2).getName());
System.out.println(em.find(Commodity.class, 1).getName());
} else {
System.out.println("EntityManager is null");
}
}
}
:ここ(SO: How to run a background task in a servlet based web application?)で述べたように、私は2つのクラスを作成しました。 @PersistenceContext(unitName = "PU")
経由でEMを取得しようとしましたが、JNDI経由で取得するためにweb.xmlに永続性を登録しようとしましたが、運がありませんでした。
私の間違いはどこですか?
この実行可能ファイルは、Webアプリケーションとは別のエンティティですか?あなたはヌルになっていますか?あなたのRunnableがコンテナによって管理されていない場合、そこにコンテナ管理のentitymanagerはありません –
@PrasadKharkar 2つのクラスは戦争アーカイブの一部です。 PersistenceContext経由で注入しようとすると、emはnullになります。 – xentity
あなたのコンテナによってそのクラスが管理されていないため、nullが返されます。また、私はTestRunnerの目的を理解することができません。 –