import java.sql.SQLException;
import java.util.Properties;import javax.naming.InitialContext;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.transaction.UserTransaction;import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.base.MapGlobalResolver;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.compiler.BPMN2ProcessFactory;
import org.drools.compiler.ProcessBuilderFactory;
import org.drools.io.ResourceFactory;
import org.drools.logger.KnowledgeRuntimeLogger;
import org.drools.logger.KnowledgeRuntimeLoggerFactory;
import org.drools.marshalling.impl.ProcessMarshallerFactory;
import org.drools.persistence.jpa.JPAKnowledgeService;
import org.drools.runtime.Environment;
import org.drools.runtime.EnvironmentName;
import org.drools.runtime.KnowledgeSessionConfiguration;
import org.drools.runtime.StatefulKnowledgeSession;
import org.drools.runtime.process.ProcessRuntimeFactory;
/*import org.h2.tools.DeleteDbFiles;
import org.h2.tools.Server;*/
import org.jbpm.bpmn2.BPMN2ProcessProviderImpl;
import org.jbpm.marshalling.impl.ProcessMarshallerFactoryServiceImpl;
import org.jbpm.process.builder.ProcessBuilderFactoryServiceImpl;
import org.jbpm.process.instance.ProcessRuntimeFactoryServiceImpl;
import org.jbpm.process.workitem.wsht.WSHumanTaskHandler;import bitronix.tm.TransactionManagerServices;
import bitronix.tm.resource.jdbc.PoolingDataSource;
/**
 * This is a example that shows JBPM5 persistence features.
 */
public class ProcessTest {

public static final void main(String[] args) {
/*
 * Start local h2 datbase
 * This is not required if the application connects to a remote database
 
try {
DeleteDbFiles.execute("", "JPADroolsFlow", true);
 Server h2Server = Server.createTcpServer(new String[0]);
h2Server.start();
} catch (SQLException e) {
throw new RuntimeException("can't start h2 server db",e);
}*/
   

try {

/*UserTransaction ut = (UserTransaction) new InitialContext().lookup( "java:comp/UserTransaction" );
            ut.begin();*/ PoolingDataSource ds1 = new PoolingDataSource();
ds1.setClassName("bitronix.tm.resource.jdbc.lrc.LrcXADataSource");
     ds1.setUniqueName("jdbc/testDS1");
     ds1.setMaxPoolSize(5);
     ds1.setAllowLocalTransactions(true);
     ds1.getDriverProperties().setProperty("driverClassName", "org.postgresql.Driver");
     ds1.getDriverProperties().setProperty("url", "jdbc:postgresql://192.168.1.112:5432/jbpm5");
     ds1.getDriverProperties().setProperty("user", "123");
     ds1.getDriverProperties().setProperty("password", "123");

    
//Sample Oracle datasource configuration
/*
ds1.setUniqueName( "jdbc/testDS1" );
        ds1.setClassName( "oracle.jdbc.xa.client.OracleXADataSource" );
        ds1.setMaxPoolSize( 3 );
        ds1.setAllowLocalTransactions( true );
        ds1.getDriverProperties().put( "user","nagios" );
        ds1.getDriverProperties().put( "password","nagios" );
        ds1.getDriverProperties().put( "URL",
        "jdbc:oracle:thin:@oracleserver:1521:db" );
*/
//Sample Mysql datasource configuration
     /*
   ds1 = new PoolingDataSource();
       ds1.setUniqueName( "jdbc/testDS1" );
       ds1.setClassName( "com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" );
        
       ds1.setMaxPoolSize( 3 );
       ds1.setAllowLocalTransactions( true );
       ds1.getDriverProperties().put( "user","user" );
       ds1.getDriverProperties().put( "password","user" );
       ds1.getDriverProperties().put( "URL",
                                     "jdbc:mysql://mysqlserver:3306/jbpm5db" );
             */
    
        ds1.init();
        
        
// load up the knowledge base
KnowledgeBase kbase = readKnowledgeBase("Helloprocess.bpmn");
StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);

        /*Create the knowledge base for HelloProcss.bpmn */
       
KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newThreadedFileLogger(ksession, "testlog", 1000);
ksession.getWorkItemManager().registerWorkItemHandler("Human Task", new WSHumanTaskHandler());
//JPAWorkingMemoryDbLogger logger = new JPAWorkingMemoryDbLogger(ksession);

System.out.println(" started the humantask");
ksession.startProcess("Hello");
ksession.fireAllRules();

/* ut.commit();*/
logger.close();
} catch (Throwable t) {
t.printStackTrace();
}
}
/*
 * Load the bpmn file into knowledgebase
 */
private static KnowledgeBase readKnowledgeBase(String process) throws Exception {
ProcessBuilderFactory.setProcessBuilderFactoryService(new ProcessBuilderFactoryServiceImpl());
ProcessMarshallerFactory.setProcessMarshallerFactoryService(new ProcessMarshallerFactoryServiceImpl());
ProcessRuntimeFactory.setProcessRuntimeFactoryService(new ProcessRuntimeFactoryServiceImpl());
BPMN2ProcessFactory.setBPMN2ProcessProvider(new BPMN2ProcessProviderImpl());
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource(process), ResourceType.BPMN2);
return kbuilder.newKnowledgeBase();
}

/*
 * Create EntityManagerFactory and register it in the environment
 * Create the knowledge session that uses JPA to persists runtime state
 */

private static StatefulKnowledgeSession createKnowledgeSession(KnowledgeBase kbase) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.jbpm.persistence.jpa" );
Environment env = KnowledgeBaseFactory.newEnvironment();
env.set( EnvironmentName.ENTITY_MANAGER_FACTORY, emf );
env.set( EnvironmentName.TRANSACTION_MANAGER, TransactionManagerServices.getTransactionManager() );
env.set( EnvironmentName.GLOBALS, new MapGlobalResolver() );

Properties properties = new Properties();
properties.put("drools.processInstanceManagerFactory", "org.jbpm.persistence.processinstance.JPAProcessInstanceManagerFactory");
properties.put("drools.processSignalManagerFactory", "org.jbpm.persistence.processinstance.JPASignalManagerFactory");
KnowledgeSessionConfiguration config = KnowledgeBaseFactory.newKnowledgeSessionConfiguration(properties);

return JPAKnowledgeService.newStatefulKnowledgeSession(kbase, config, env);

}
}
其它文件都配好了的。只能向数据库添加11张表就报错了。报错信息如下:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
SLF4J: Failed to load class "org.slf4j.impl.StaticMDCBinder".
SLF4J: Defaulting to no-operation MDCAdapter implementation.
SLF4J: See http://www.slf4j.org/codes.html#no_static_mdc_binder for further details.
Hibernate: insert into SessionInfo (lastModificationDate, rulesByteArray, startDate, OPTLOCK) values (?, ?, ?, ?)
java.lang.IllegalStateException: java.lang.reflect.InvocationTargetException
at org.drools.persistence.jpa.KnowledgeStoreServiceImpl.buildCommanService(KnowledgeStoreServiceImpl.java:130)
at org.drools.persistence.jpa.KnowledgeStoreServiceImpl.newStatefulKnowledgeSession(KnowledgeStoreServiceImpl.java:54)
at org.drools.persistence.jpa.JPAKnowledgeService.newStatefulKnowledgeSession(JPAKnowledgeService.java:122)
at ProcessTest.createKnowledgeSession(ProcessTest.java:157)
at ProcessTest.main(ProcessTest.java:105)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at org.drools.persistence.jpa.KnowledgeStoreServiceImpl.buildCommanService(KnowledgeStoreServiceImpl.java:116)
... 4 more
Caused by: javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not insert: [org.drools.persistence.info.SessionInfo]
at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:614)
at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:226)
at org.drools.persistence.jpa.JpaPersistenceContext.persist(JpaPersistenceContext.java:17)
at org.drools.persistence.SingleSessionCommandService.<init>(SingleSessionCommandService.java:125)
... 9 more
Caused by: org.hibernate.exception.SQLGrammarException: could not insert: [org.drools.persistence.info.SessionInfo]
....
Caused by: org.postgresql.util.PSQLException: 错误: 关系 "sessioninfo" 不存在
  位置:13

解决方案 »

  1.   

    偶才熟悉jbpm3呢。4都没看,5就出来了。
      

  2.   

    如果是在非web环境下,要这样创建session:
    kbase.newStatefulKnowledgeSession( config, env);
      

  3.   

    10:12:30,951 INFO  [stdout] (http-localhost-127.0.0.1-8080-1) Hibernate: insert into SessionInfo (lastModificationDate, rulesByteArray, startDate, OPTLOCK) values (?, ?, ?, ?)
    10:12:30,962 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (http-localhost-127.0.0.1-8080-1) SQL Error: 1364, SQLState: HY000
    10:12:30,962 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (http-localhost-127.0.0.1-8080-1) Field 'id' doesn't have a default value我遇到的问题是 插入sessioninfo时,主键没有赋上值。