Hello all,
I'm having trouble configuring external transaction manager and externally
managed data source;
looking in sources and tests, including Axis and ServiceMix integration API
implementations
I could not find the answer.
Thanks in advance
Scenario:
Trying to configure ODE to work with external transaction manager and
externally managed DataSource.
As transaction manager I am using Bitronix, and as XA capable database
MySql.
It should not be issue with Bitronix since XA tests with 2 MySql instances
and ActiveMq broker are working as expected (These tests didnt include ODE).
Implementation of Integration API is based on those found in bpel-test
module
of source ODE distribution:
org.apache.ode.test.MessageExchangeContextImpl
org.apache.ode.test.BindingContextImpl
org.apache.ode.test.PartnerRoleChannelImpl
Source code of above classes has not been modified, and "bpel/2.0/TestIf" is
the
bpel/wsdl definition used for testing.
The configuration of BPEL server at startup time is as follows:
Note: dataSource variable is instance of javax.sql.DataSource, and txManager
is instance
of javax.transaction.TransactionManager.
------------------------------------------------------------------------------------------------
MessageExchangeContextImpl ctx = new MessageExchangeContextImpl();
this.server = new BpelServerImpl();
this.scheduler = new MockScheduler(this.txManager);
Properties jpaProps = new Properties();
jpaProps.put("openjpa.jdbc.DBDictionary", "
org.apache.openjpa.jdbc.sql.MySQLDictionary");
jpaProps.put("openjpa.Log", "DefaultLevel=TRACE");
BPELDAOConnectionFactoryImpl factory = new
BPELDAOConnectionFactoryImpl();
factory.setTransactionManager(this.txManager);
factory.setDataSource(this.dataSource);
factory.init(jpaProps);
this.server.setDaoConnectionFactory(factory);
this.server.setScheduler(scheduler);
this.server.setBindingContext(new BindingContextImpl());
this.server.setMessageExchangeContext(ctx);
scheduler.setJobProcessor(this.server);
// this line prints true
System.out.println(this.dataSource instanceof DataSource);
this.processStore = new ProcessStoreImpl(this.dataSource, "jpa",
true);
this.processStore.registerListener(new ProcessStoreListener() {
public void onProcessStoreEvent(ProcessStoreEvent event) {
BpelManager.this.server.unregister(event.pid);
if (event.type != ProcessStoreEvent.Type.UNDEPLOYED) {
ProcessConfImpl conf = (ProcessConfImpl)
BpelManager.this.processStore
.getProcessConfiguration(event.pid);
conf.setTransient(true);
BpelManager.this.server.register(conf);
}
}
});
Properties props = new Properties();
props.setProperty("debugeventlistener.dumpToStdOut", "no");
this.server.setConfigProperties(props);
this.server.registerBpelEventListener(new DebugBpelEventListener());
this.server.init();
this.server.start();
Collection<QName> deployed = this.processStore.deploy(new
File("data/bpel/2.0/TestIf"));
for (QName name : deployed) {
ProcessConfImpl conf = (ProcessConfImpl) this.processStore
.getProcessConfiguration(name);
conf.setTransient(true);
this.server.register(conf);
}
-------------------------------------------------------------------------------------------------
In main method following is performed:
-------------------------------------------------------------------------------------------------
transactionManager.begin();
Statement stmt = dataSource.getConnection().createStatement();
stmt.executeUpdate("insert into mytable values('somevalue" +
System.currentTimeMillis() + "')");
MyRoleMessageExchange exchange =
manager.getServer().getEngine().createMessageExchange(""
+ System.currentTimeMillis(), new QName("
http://ode/bpel/unit-test.wsdl", "HelloService"), "hello");
Message message = exchange.createMessage(new QName("
http://ode/bpel/unit-test.wsdl", "HelloMessage"));
message.setMessage(DOMUtils.stringToDOM("<message><TestPart>2.0
</TestPart></message>"));
Future<MessageExchange.Status> running = exchange.invoke(message);
transactionManager.commit();
-------------------------------------------------------------------------------------------------
Obviously one needs to have reference to ProcessStore in order to deploy
processes, and above way is only one
I have managed to figure out.
When I run this example I get following stack trace:
-------------------------------------------------------------------------------------------------
Bitronix has been initialized...
2008-02-05 12:01:50,953 INFO [org.hibernate.cfg.annotations.Version] -
Hibernate Annotations 3.3.0.GA
2008-02-05 12:01:51,000 INFO [org.hibernate.cfg.Environment] - Hibernate
3.2.5
2008-02-05 12:01:51,000 INFO [org.hibernate.cfg.Environment] -
hibernate.properties not found
2008-02-05 12:01:51,000 INFO [org.hibernate.cfg.Environment] - Bytecode
provider name : cglib
2008-02-05 12:01:51,015 INFO [org.hibernate.cfg.Environment] - using JDK 1.4
java.sql.Timestamp handling
2008-02-05 12:01:51,078 INFO [org.hibernate.ejb.Version] - Hibernate
EntityManager 3.3.1.GA
2008-02-05 12:01:51,093 DEBUG [org.hibernate.ejb.Ejb3Configuration] - Look
up for persistence unit: ode-dao
0 ode-dao TRACE [main] openjpa.Runtime - Setting the following properties
from "jar:file:/C:/DEVELOPMENT/workspaces/ODE/bpel-xa/lib/ode-
dao-jpa-1.1.1.jar!/META-INF/persistence.xml" into configuration: {
openjpa.FlushBeforeQueries=false,
openjpa.jdbc.DBDictionary=org.apache.openjpa.jdbc.sql.MySQLDictionary,
openjpa.BrokerFactory=jdbc, openjpa.ConnectionFactory=a PoolingDataSource
containing an XAPool of resource mysql-1 with 1 connection(s) (1 still
available), openjpa.Log=DefaultLevel=TRACE, openjpa.MetaDataFactory=jpa
(Types=org.apache.ode.dao.jpa.ActivityRecoveryDAOImpl;org.apache.ode.dao.jpa.CorrelationSetDAOImpl;org.apache.ode.dao.jpa.CorrelatorDAOImpl;org.apache.ode.dao.jpa.EventDAOImpl;org.apache.ode.dao.jpa.FaultDAOImpl;org.apache.ode.dao.jpa.MessageDAOImpl;org.apache.ode.dao.jpa.MessageExchangeDAOImpl;org.apache.ode.dao.jpa.MessageRouteDAOImpl;org.apache.ode.dao.jpa.PartnerLinkDAOImpl;org.apache.ode.dao.jpa.ProcessDAOImpl;org.apache.ode.dao.jpa.ProcessInstanceDAOImpl;org.apache.ode.dao.jpa.ScopeDAOImpl;org.apache.ode.dao.jpa.XmlDataDAOImpl;org.apache.ode.dao.jpa.CorrSetProperty;org.apache.ode.dao.jpa.MexProperty;org.apache.ode.dao.jpa.XmlDataProperty),
[EMAIL PROTECTED],
javax.persistence.provider=org.apache.openjpa.persistence.PersistenceProviderImpl,
openjpa.ConnectionFactoryMode=managed, openjpa.Id=ode-dao}
Must be true: true
2008-02-05 12:01:51,750 DEBUG [org.hibernate.ejb.Ejb3Configuration] - Look
up for persistence unit: ode-store
javax.persistence.PersistenceException: Provider error. Provider:
org.hibernate.ejb.HibernatePersistence
at javax.persistence.Persistence.createFactory(Persistence.java:175)
at javax.persistence.Persistence.createEntityManagerFactory(
Persistence.java:111)
at org.apache.ode.store.jpa.DbConfStoreConnectionFactory.<init>(
DbConfStoreConnectionFactory.java:45)
at org.apache.ode.store.ProcessStoreImpl.<init>(ProcessStoreImpl.java
:122)
at com.mytest.xa.BpelManager.init(BpelManager.java:73)
at com.mytest.xa.Main.main(Main.java:35)
Caused by: javax.persistence.PersistenceException:
java.lang.ClassCastException: bitronix.tm.resource.jdbc.PoolingDataSource
at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java
:258)
at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(
HibernatePersistence.java:120)
at javax.persistence.Persistence.createFactory(Persistence.java:171)
... 5 more
Caused by: java.lang.ClassCastException:
bitronix.tm.resource.jdbc.PoolingDataSource
at org.hibernate.ejb.packaging.PersistenceXmlLoader.deploy(
PersistenceXmlLoader.java:113)
at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java
:215)
... 7 more
Feb 5, 2008 12:01:51 PM bitronix.tm.BitronixTransactionManager shutdown
INFO: shutting down Bitronix Transaction Manager
-------------------------------------------------------------------------------------------------
What is confusing me is
org.apache.ode.store.jpa.DbConfStoreConnectionFactory class which in
constructors
calls "propMap.put("javax.persistence.nonJtaDataSource", ds);" marking
DataSource as non-managed, though
I want it to be externally managed.
I have double checked if Bitronix correctly implements javax.sql.DataSource,
and its ok. Outside of ODE
XA transaction are working correctly.
Any tips appreciated.
Thanks.