Hi,
I am busy investigating how the transaction management works
within JBoss ESB. What I have discovered so far tells me that the transactional
boundaries are dictated by the particular provider that the service is
configured to listen to.
I have tested this theory by integrating hibernate and
spring into one of my actions and verifying that transactions roll back
correctly when a later action in the pipeline throws an un-checked exception. I
now need to verify the rest of the providers that we intend on using.
The very first one I chose was SQLprovider, which uses the SqlTableCourier.
I am trying to get the helloworld_tx_sql_action quickstart example working in
our environment, which specifically includes postgres 8.4.
In order to make the example compatible with postgres I had
to change ‘clob’ to ‘text’, the resulting sql
creation statement is:
CREATE TABLE TX_ESB_MESSAGES
(
message_id VARCHAR(255) NOT NULL,
data_column text NOT NULL,
status_col VARCHAR(255) NOT NULL,
timestamp_col VARCHAR(255)
);
My ESB service definition looks as follows:
<jbossesb parameterReloadSecs="5"
xmlns="http://anonsvn.labs.jboss.com/labs/jbossesb/trunk/product/etc/schemas/xml/jbossesb-1.0.1.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://anonsvn.labs.jboss.com/labs/jbossesb/trunk/product/etc/schemas/xml/jbossesb-1.0.1.xsd
http://anonsvn.labs.jboss.com/labs/jbossesb/trunk/product/etc/schemas/xml/jbossesb-1.0.1.xsd">
<providers>
<sql-provider name="SQLprovider"
url="jdbc:postgresql://localhost:5432/rlog"
datasource="java:/RLogDB">
<sql-bus
busid="TxSQLChannel" >
<sql-message-filter
tablename="TX_ESB_MESSAGES"
message-id-column="MESSAGE_ID"
status-column="STATUS_COL"
insert-timestamp-column="TIMESTAMP_COL"
message-column="DATA_COLUMN"
/>
</sql-bus>
</sql-provider>
</providers>
<services>
<service category="ParserActions"
description="Entrypoint with rollback"
invmScope="NONE" invmTransacted="true"
name="EntryPointAction">
<listeners>
<sql-listener name="TxSqlListener"
busidref="TxSQLChannel">
<property name="transacted"
value="true"/>
</sql-listener>
</listeners>
<actions mep="OneWay">
<action class="za.co.fnb.sqlprovider.actions.entrypoint.ParserAction"
name="ParserAction" process="process">
<property name="springContextXml"
value="applicationContext.xml"/>
</action>
</actions>
</service>
</services>
</jbossesb>
I then run the system and enter a manual row into the
database with the status value of ‘P’, I then get repeated
exceptions thrown:
09:07:15,080 WARN [SqlTableCourier] Exception during
pickup
org.postgresql.util.PSQLException: ERROR: operator does not
exist: character varying = bigint
at
org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1548)
at
org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1316)
at
org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:191)
at
org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:452)
at
org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:351)
at
org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:255)
at
sun.reflect.GeneratedMethodAccessor308.invoke(Unknown Source)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at
java.lang.reflect.Method.invoke(Method.java:597)
at
org.postgresql.ds.jdbc23.AbstractJdbc23PooledConnection$StatementHandler.invoke(AbstractJdbc23PooledConnection.java:471)
at
$Proxy327.executeQuery(Unknown Source)
at
org.jboss.resource.adapter.jdbc.WrappedPreparedStatement.executeQuery(WrappedPreparedStatement.java:342)
at
org.jboss.internal.soa.esb.couriers.SqlTableCourier.tryToPickup(SqlTableCourier.java:368)
at
org.jboss.internal.soa.esb.couriers.SqlTableCourier.pickup(SqlTableCourier.java:261)
at
org.jboss.internal.soa.esb.couriers.TwoWayCourierImpl.pickup(TwoWayCourierImpl.java:228)
at
org.jboss.internal.soa.esb.couriers.TwoWayCourierImpl.pickup(TwoWayCourierImpl.java:204)
at
org.jboss.soa.esb.listeners.message.MessageAwareListener.waitForEventAndProcess(MessageAwareListener.java:297)
at
org.jboss.soa.esb.listeners.message.MessageAwareListener.doRun(MessageAwareListener.java:253)
at
org.jboss.soa.esb.listeners.lifecycle.AbstractThreadedManagedLifecycle.run(AbstractThreadedManagedLifecycle.java:115)
at
java.lang.Thread.run(Thread.java:619)
09:07:15,081 WARN [MessageAwareListener] Error
processing courier, backing off for 8000 milliseconds
I think the cause is that postgres no longer supports
implicit type casting. I notice that timestamp field is handled as long:
SqlTableCourier.java:368: selectPicukupMessageStatement.setLong(3,
prospect.timestamp);
But the field is defined in the database as a varchar.
I have tried to change the database field to a bigint, but
then the courier never tries to pick it up?
So, basically I have two questions:
1.
Does anyone have a solution to this problem?
2.
I am going to try solve it myself, however I am not
sure how to add new provider types to the ESB, does anyone know how to do this?
Is there a guide? Do I need to rebuild JBoss ESB to achieve this?
I am sending this to both user lists in the hope that
someone will be able to help me out..
Thanks in advance!
To read FirstRand
Bank's Disclaimer for this email click on the following address or copy into
your Internet browser:
https://www.fnb.co.za/disclaimer.html
If you are unable to
access the Disclaimer, send a blank e-mail to firstrandbankdisclaimer@fnb.co.za
and we will send you a copy of the Disclaimer.