blob: 80fcaa06300ac6c67ba1c204beed85c10b04ad19 [file] [log] [blame]
<div class="wiki-content maincontent"><h3>JMS and JDBC operations in one transaction with Spring/Jencks/ActiveMQ</h3>
<p>Spring beans:</p>
<structured-macro ac:macro-id="131960d2-7879-4564-9ec8-932ad251d58d" ac:name="code" ac:schema-version="1"><parameter ac:name="">xml</parameter><plain-text-body>
&lt;beans&gt;
&lt;!-- ActiveMQ Broker --&gt;
&lt;bean id="broker" class="org.apache.activemq.broker.BrokerService" init-method="start" destroy-method="stop"&gt;
&lt;property name="persistent" value="false"/&gt;
&lt;property name="transportConnectorURIs"&gt;
&lt;list&gt;
&lt;value&gt;tcp://localhost:5000&lt;/value&gt;
&lt;/list&gt;
&lt;/property&gt;
&lt;/bean&gt;
&lt;!-- Geronimo Transaction Manager --&gt;
&lt;bean id="transactionContextManager" class="org.jencks.factory.TransactionContextManagerFactoryBean"/&gt;
&lt;bean id="geronimo" class="org.jencks.factory.GeronimoTransactionManagerFactoryBean"/&gt;
&lt;bean id="geronimoTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"&gt;
&lt;property name="userTransaction" ref="geronimo" /&gt;
&lt;/bean&gt;
&lt;!-- Jencks Connection Manager --&gt;
&lt;bean id="connectionManager" class="org.jencks.factory.ConnectionManagerFactoryBean"&gt;
&lt;property name="transactionSupport"&gt;
&lt;bean class="org.jencks.factory.XATransactionFactoryBean"&gt;
&lt;property name="useTransactionCaching" value="true"/&gt;
&lt;property name="useThreadCaching" value="false"/&gt;
&lt;/bean&gt;
&lt;/property&gt;
&lt;property name="poolingSupport"&gt;
&lt;bean class="org.jencks.factory.SinglePoolFactoryBean"&gt;
&lt;property name="maxSize" value="2"/&gt;
&lt;property name="minSize" value="1"/&gt;
&lt;property name="blockingTimeoutMilliseconds" value="60"/&gt;
&lt;property name="idleTimeoutMinutes" value="60"/&gt;
&lt;property name="matchOne" value="true"/&gt;
&lt;property name="matchAll" value="true"/&gt;
&lt;property name="selectOneAssumeMatch" value="true"/&gt;
&lt;/bean&gt;
&lt;/property&gt;
&lt;/bean&gt;
&lt;!-- ActiveMQ Connection --&gt;
&lt;bean id="jmsResourceAdapter" class="org.apache.activemq.ra.ActiveMQResourceAdapter" depends-on="broker"&gt;
&lt;property name="serverUrl"&gt;
&lt;value&gt;tcp://localhost:5000&lt;/value&gt;
&lt;/property&gt;
&lt;/bean&gt;
&lt;bean id="jmsManagedConnectionFactory" class="org.apache.activemq.ra.ActiveMQManagedConnectionFactory"&gt;
&lt;property name="resourceAdapter" ref="jmsResourceAdapter"/&gt;
&lt;/bean&gt;
&lt;bean id="jmsConnectionFactory" class="org.springframework.jca.support.LocalConnectionFactoryBean"&gt;
&lt;property name="managedConnectionFactory" ref="jmsManagedConnectionFactory"/&gt;
&lt;property name="connectionManager" ref="connectionManager"/&gt;
&lt;/bean&gt;
&lt;!-- Tranql JDBC Connection --&gt;
&lt;!--
&lt;bean id="tranqlManagedConnectionFactory" class="org.jencks.tranql.XAPoolDataSourceMCF"&gt;
&lt;property name="driverName" value="org.postgresql.Driver"/&gt;
&lt;property name="url" value="jdbc:postgresql://ats-manager/activemq"/&gt;
&lt;property name="user" value="activemq"/&gt;
&lt;/bean&gt;
&lt;bean id="tranqlDataSource" class="org.springframework.jca.support.LocalConnectionFactoryBean"&gt;
&lt;property name="managedConnectionFactory" ref="tranqlManagedConnectionFactory"/&gt;
&lt;property name="connectionManager" ref="connectionManager"/&gt;
&lt;/bean&gt;
--&gt;
&lt;!-- Enhydra JDBC Connection --&gt;
&lt;bean id="enhydraDataSource" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown"&gt;
&lt;property name="dataSource"&gt;
&lt;bean class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown"&gt;
&lt;property name="transactionManager" ref="geronimo" /&gt;
&lt;property name="driverName" value="org.postgresql.Driver" /&gt;
&lt;property name="url" value="jdbc:postgresql://ats-manager/activemq" /&gt;
&lt;/bean&gt;
&lt;/property&gt;
&lt;property name="user" value="activemq"/&gt;
&lt;/bean&gt;
&lt;bean id="jencksJCAContainer" class="org.jencks.JCAContainer"&gt;
&lt;property name="bootstrapContext"&gt;
&lt;bean class="org.jencks.factory.BootstrapContextFactoryBean"&gt;
&lt;property name="threadPoolSize" value="25"/&gt;
&lt;/bean&gt;
&lt;/property&gt;
&lt;property name="resourceAdapter" ref="jmsResourceAdapter"/&gt;
&lt;/bean&gt;
&lt;bean id="inboundConnector" class="org.jencks.JCAConnector"&gt;
&lt;property name="jcaContainer" ref="jencksJCAContainer" /&gt;
&lt;property name="activationSpec"&gt;
&lt;bean class="org.apache.activemq.ra.ActiveMQActivationSpec"&gt;
&lt;property name="destination" value="messages.input"/&gt;
&lt;property name="destinationType" value="javax.jms.Queue"/&gt;
&lt;/bean&gt;
&lt;/property&gt;
&lt;property name="transactionManager" ref="geronimo"/&gt;
&lt;property name="ref" value="echoBean"/&gt;
&lt;/bean&gt;
&lt;bean id="echoBean" class="transactions.EchoBean"&gt;
&lt;property name="jdbcTemplate"&gt;
&lt;bean class="org.springframework.jdbc.core.JdbcTemplate"&gt;
&lt;property name="dataSource" ref="enhydraDataSource"/&gt;
&lt;/bean&gt;
&lt;/property&gt;
&lt;property name="jmsTemplate"&gt;
&lt;bean class="org.springframework.jms.core.JmsTemplate"&gt;
&lt;property name="connectionFactory" ref="jmsConnectionFactory"/&gt;
&lt;/bean&gt;
&lt;/property&gt;
&lt;/bean&gt;
&lt;/beans&gt;
</plain-text-body></structured-macro>
<p>Java code:</p>
<structured-macro ac:macro-id="cfe63126-2a2e-4b7b-8771-2ba6ff05ea6a" ac:name="code" ac:schema-version="1"><parameter ac:name="">java</parameter><plain-text-body>
public class EchoBean implements MessageListener {
private Log log = LogFactory.getLog(getClass());
private JdbcTemplate jdbcTemplate;
private JmsTemplate jmsTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public void setJmsTemplate(JmsTemplate jmsTemplate) {
this.jmsTemplate = jmsTemplate;
}
public void onMessage(Message message) {
log.debug(message);
if (message instanceof TextMessage) {
try {
String messageText = ((TextMessage)message).getText();
log.debug("execute JMS operation");
jmsTemplate.convertAndSend("messages.ouptut", messageText);
log.debug("execute JDBC operation");
jdbcTemplate.execute("insert into t1 values('"+messageText+"')");
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
</plain-text-body></structured-macro></div>