2017-02-15 18 views
0

私は約3日間JPAKnowledgeServiceを作成しようとしていましたが、あまりにも多くの設定と詳細作業が必要ですそうです。しかし、BitronixがSpringブートプロジェクトでデータソース/トランザクションを管理できない

は、私は私のjndi.propertiesファイルに

を追加した後に答えが示唆するように、無くなっされ、当初はthis problemを持っていました。私は最終的にStatefulKnowledgeSessionを作成することができ、作業は終わったと考えました。しかし、ドールズチャットでは、同じ人が私のトランザクションがBitronixの代わりにHibernateによって処理されている可能性があると提案しました。これは、私の永続性を完全に非トランザクションにする可能性があります。

そして私は、私は知識のセッションにObjectを挿入し、fireAllRulesを呼び出そうとするたびに、私はで立ち往生して以来、彼は右であると思います。その後

transaction timed out: a Bitronix Transaction with GTRID [3132372E302E312E310000000000AFB9D800000006], status=MARKED_ROLLBACK, 0 resource(s) enlisted (started Thu Jan 01 05:11:56 EET 1970) 

:によって

executing transaction with 0 enlisted resource 

続きます私が変えたのは、

<?xml version="1.0" encoding="UTF-8" ?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"> 
    <persistence-unit name="org.jbpm.persistence.jpa" transaction-type="JTA"> 
     <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
     <jta-data-source>java:comp/env/jdbc/jbpm</jta-data-source> 
     <class>org.drools.persistence.info.SessionInfo</class> 
     <properties> 
      <property name="hibernate.jndi.class" value="bitronix.tm.jndi.BitronixInitialContextFactory"/> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/> 
      <property name="hibernate.max_fetch_depth" value="3"/> 
      <property name="hibernate.hbm2ddl.auto" value="update" /> 
      <property name="hibernate.show_sql" value="true" /> 
      <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.BTMTransactionManagerLookup" /> 
     </properties> 
    </persistence-unit> 
</persistence> 

は私 application.propertiesにこの行を追加:私は次のように私の persistence.xmlを更新

spring.datasource.jndi-name=java:comp/env/jdbc/jbpm

these instructionsに従うことによって、組み込みのTomcatのための私のデータソースにJNDI名を与えました。

とエラーが戻ってきた:JPAKnowledgeServiceに関連

Caused by: java.lang.NullPointerException: null 
    at org.drools.persistence.jta.JtaTransactionManager.getStatus(JtaTransactionManager.java:273) ~[drools-persistence-jpa-6.5.0.Final.jar:6.5.0.Final] 
    at org.drools.persistence.jpa.AbstractPersistenceContextManager.getApplicationScopedEntityManager(AbstractPersistenceContextManager.java:78) ~[drools-persistence-jpa-6.5.0.Final.jar:6.5.0.Final] 
    at org.drools.persistence.jpa.JpaPersistenceContextManager.getApplicationScopedPersistenceContext(JpaPersistenceContextManager.java:55) ~[drools-persistence-jpa-6.5.0.Final.jar:6.5.0.Final] 
    at org.drools.persistence.SingleSessionCommandService.<init>(SingleSessionCommandService.java:103) ~[drools-persistence-jpa-6.5.0.Final.jar:6.5.0.Final] 
    ... 43 common frames omitted 

テーブルがデータベースに作成されているので、私は私のJNDI登録が成功すると思いますが、私のようにBitronixを見つけることができるようには見えません。 JtaTransactionManager以降の取引マネージャーはnullと思われます。私は間違って何をしていますか?私は欲求不満であり、無縁です。

+0

@Akshayこれは冗談ですか? –

+0

私はこのエラーを見ましたので、コメントしました.. – Akshay

+0

これはNPEの質問ではありませんが、HibernateをBitronixを使用するように設定する方法についての質問はありますか?あなたは、私の質問をヘルプのない(そして私のものとは関係のない)質問の重複としてマーキングし、潜在的な関心をブロックします。これは失礼であり、高く評価されていません。 –

答えて

2

どうやら、私はTomcatでJNDIとしての私のデフォルトのデータソースを登録する必要がありますが、次のようにBitronixはそれを直接管理することはありませんでした:

@Bean 
public PoolingDataSource setupPoolingDataSource() { 
    PoolingDataSource pds = new PoolingDataSource(); 
    pds.setUniqueName("jdbc/jbpm"); 
    pds.setClassName("bitronix.tm.resource.jdbc.lrc.LrcXADataSource"); 
    pds.setMaxPoolSize(50); 
    pds.setAllowLocalTransactions(true); 
    pds.getDriverProperties().put("user", "username"); 
    pds.getDriverProperties().put("password", "password"); 
    pds.getDriverProperties().put("url", "jdbc:mysql://localhost/databaseName?useUnicode=yes&characterEncoding=UTF-8&useSSL=false"); 
    pds.getDriverProperties().put("driverClassName", "com.mysql.jdbc.Driver"); 
    pds.init(); 
    return pds; 
} 

、これらのものを削除:

@Bean 
public TomcatEmbeddedServletContainerFactory tomcatFactory() { 
    return new TomcatEmbeddedServletContainerFactory() { 

     @Override 
     protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(
       Tomcat tomcat) { 
      tomcat.enableNaming(); 
      return super.getTomcatEmbeddedServletContainer(tomcat); 
     } 

     @Override 
     protected void postProcessContext(Context context) { 

      ContextResource resource = new ContextResource(); 
      resource.setName(name); 
      resource.setType(DataSource.class.getName()); 
      resource.setProperty("url", "..."); 
      resource.setProperty("username", "..."); 
      resource.setProperty("password", "..."); 
      resource.setProperty("driverClassName", "..."); 
      resource.setProperty("factory", "org.apache.tomcat.jdbc.pool.DataSourceFactory"); 
      context.getNamingResources().addResource(resource); 
     } 
    }; 
} 

@Bean 
public DataSource jndiDataSource() throws IllegalArgumentException, NamingException { 

    JndiObjectFactoryBean bean = new JndiObjectFactoryBean(); 
    bean.setJndiName("..."); 
    bean.setProxyInterface(DataSource.class); 
    bean.setLookupOnStartup(false); 
    bean.afterPropertiesSet(); 
    return (DataSource)bean.getObject(); 
} 

すべてそれ以外は同じままで動作します!

関連する問題