2017-02-15 1 views
0

J'ai essayé de faire JPAKnowledgeService depuis environ 3 jours maintenant, et je suis assez près d'abandonner, il semble juste que trop de configuration et de travail de détail pour ce qu'il est/est. Cependant,Bitronix ne peut pas gérer ma source de données/transactions dans le projet de démarrage Spring

j'avais this problem au départ, ce qui est disparu après avoir ajouté

dans mon dossier jndi.properties, comme la réponse suggère. J'ai finalement pu créer un StatefulKnowledgeSession, et j'ai pensé que le travail était terminé. Mais dans le chat de drools, le même type a suggéré que mes transactions pourraient avoir été traitées par Hibernate au lieu de Bitronix, ce qui pourrait rendre ma persistance non-transactionnelle.

Et je suppose qu'il est juste puisque chaque fois que j'essayé d'insérer un Object dans la session de connaissances et d'appeler fireAllRules, j'étais coincé à:

executing transaction with 0 enlisted resource 

suivi par:

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) 

Après cela ce que j'ai changé est; Je mis à jour mon persistence.xml comme suit:

<?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> 

ajouté cette ligne dans mon application.properties:

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

et a donné un nom JNDI à mon source de données pour tomcat embarqué en suivant these instructions.

et l'erreur est revenue:

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 

Les tableaux liés à JPAKnowledgeService sont créés dans la base de données, donc je suppose que mon inscription JNDI est couronnée de succès, mais je ne semblent pas être en mesure de trouver Bitronix comme mon gestionnaire de transactions depuis JtaTransactionManager semble aussi nul. Qu'est-ce que je fais mal? Je suis frustré et désemparé.

+0

@Akshay Est-ce une blague? –

+0

Je viens de voir l'erreur ainsi commentée .. – Akshay

+0

Est-ce que vous vous rendez compte que ce n'est pas une question NPE mais une question sur la façon de configurer Hibernate pour utiliser Bitronix? Vous marquez ma question comme doublon d'une question qui n'est d'aucune aide (et sans relation avec la mienne), et qui bloque l'intérêt potentiel. C'est impoli et pas apprécié. –

Répondre

2

Apparemment, je ne l'ai pas enregistrer ma source de données par défaut comme JNDI avec Tomcat, mais faire Bitronix gérer directement comme suit:

@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; 
} 

et supprimé ces trucs:

@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(); 
} 

tout d'autre reste le même et ça marche!