2016-08-19 1 views
0

私は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に永続性を登録しようとしましたが、運がありませんでした。

私の間違いはどこですか?

+0

この実行可能ファイルは、Webアプリケーションとは別のエンティティですか?あなたはヌルになっていますか?あなたのRunnableがコンテナによって管理されていない場合、そこにコンテナ管理のentitymanagerはありません –

+0

@PrasadKharkar 2つのクラスは戦争アーカイブの一部です。 PersistenceContext経由で注入しようとすると、emはnullになります。 – xentity

+0

あなたのコンテナによってそのクラスが管理されていないため、nullが返されます。また、私はTestRunnerの目的を理解することができません。 –

答えて

0

私のための解決策が見つかりました:第2の永続性コンテンツを定義してください。

まず、私の永続ユニット:私はcronジョブ/スケジューラ/ Runnableを内

@PersistenceContext(unitName = "PU", type = PersistenceContextType.EXTENDED) 
private EntityManager em; 

経由CDI-ビーンズ内のEntityManagerを使用するJSFでは

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" 
    version="2.1"> 
    <persistence-unit name="PU" transaction-type="JTA"> 
     <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
     <jta-data-source>java:jboss/datasources/mysqldb</jta-data-source> 
     <class>model.Commodity</class> 
     <class>...</class> 
     <properties> 
      <!-- <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform"/> --> 
      <!-- <property name="hibernate.hbm2ddl.auto" value="update" /> --> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" /> 
      <!-- <property name="hibernate.show_sql" value="true" /> --> 
      <property name="hibernate.enable_lazy_load_no_trans" value="true" /> 
     </properties> 
    </persistence-unit> 

    <persistence-unit name="RLPU" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
     <jta-data-source>java:jboss/datasources/mysqldb</jta-data-source> 
     <class>model.Commodity</class> 
     <class>...</class> 
     <properties> 
      <!-- <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform"/> --> 
      <!-- <property name="hibernate.hbm2ddl.auto" value="update" /> --> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" /> 
      <!-- <property name="hibernate.show_sql" value="true" /> --> 
      <property name="hibernate.enable_lazy_load_no_trans" value="true" /> 
     </properties> 
    </persistence-unit> 

</persistence> 

私は

を経由してEntityManagerを作成します
public TestRunner() { 
    this.em = Persistence.createEntityManagerFactory("RLPU").createEntityManager(); 
} 

したがって、コンテナ管理クラスとアンマネージクラス。

関連する問題