You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@camel.apache.org by renalexster <re...@gmail.com> on 2017/06/07 16:50:31 UTC

Camel JPA Transaction + EntityManager

Hi,

In my actual application, i have a business layer that uses JPA to persist
data according to some business rules, the problem is that the camel-jpa
transaction is not shared with the business layer transaction. I need my
EntityManager in business classes to be integrated with the Camel
transaction scope, how can I do this?


Below is a simple example, but that reflects the problem in the actual
design.


Project example
<https://github.com/renalexster/camel-jpa-idempotent/tree/lock_transaction>  


==============================
@Component
public class MyService {
	@PersistenceContext(unitName="persistenceUnit") private EntityManager em;
	
	private static final Logger LOG = LoggerFactory.getLogger(MyService.class);
	
	public void recordLog(@Body Client client) {
		LOG.info("Inserting LogClient");
		LogClient log = new LogClient();
		log.setClient(client);
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
		String strDate = sdf.format(new Date());
		log.setTxtLog("Persisted Client ["+client.getName()+"] at ["+strDate+"]");
		
		em.merge(log);
		LOG.info("Inserted LogClient ["+log.getId()+"]");
		
		
	}
==============================


==============================
@Component
public class CamelRoute extends RouteBuilder {
	
	@Override
	public void configure() throws Exception {
	
from("jpa:com.mycompany.model.Client?persistenceUnit=persistenceUnit&consumeDelete=false&consumer.delay=15000").transacted()
		.split().simple("${body}")
			.log("Processing Client [${body.name}]")
			.bean(MyService.class, "recordLog")
			.log("${body.name} processed");
	}
}
==============================



==============================
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:camel="http://camel.apache.org/schema/spring"
    xmlns:ctx="http://www.springframework.org/schema/context"
    xmlns:osgi="http://www.springframework.org/schema/osgi"
    xmlns:osgix="http://www.springframework.org/schema/osgi-compendium"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans                 
http://www.springframework.org/schema/beans/spring-beans.xsd                 
http://www.springframework.org/schema/osgi     
http://www.springframework.org/schema/osgi/spring-osgi.xsd    
http://www.springframework.org/schema/osgi-compendium     
http://www.springframework.org/schema/osgi-compendium/spring-osgi-compendium.xsd    
http://www.springframework.org/schema/context                 
http://www.springframework.org/schema/context/spring-context-3.0.xsd                 
http://camel.apache.org/schema/spring
http://camel.apache.org/schema/spring/camel-spring.xsd">
    <osgix:cm-properties id="parametros.spring"
persistent-id="parametros.spring">
        <prop key="db.driverClassName">org.postgresql.Driver</prop>
        <prop
key="db.url">jdbc:postgresql://192.168.238.1:5432/camel-jpa</prop>
        <prop key="db.username">camel-jpa</prop>
        <prop key="db.password">123456</prop>
        <prop key="connection.show_sql">true</prop>
    </osgix:cm-properties>
    <ctx:property-placeholder properties-ref="parametros.spring"/>
    <bean class="com.mycompany.routes.CamelRoute" id="javaCamelRoute"/>
    <ctx:annotation-config/>
    <bean
        class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
id="jpaAdapter">
        <property name="showSql" value="${connection.show_sql}"/>
        <property name="generateDdl" value="true"/>
        <property name="databasePlatform"
value="org.hibernate.dialect.PostgreSQLDialect"/>
    </bean>
    <bean class="org.apache.commons.dbcp.BasicDataSource" id="dataSource">
        <property name="driverClassName" value="${db.driverClassName}"/>
        <property name="url" value="${db.url}"/>
        <property name="username" value="${db.username}"/>
        <property name="password" value="${db.password}"/>
    </bean>
    <bean class="org.apache.camel.component.jpa.JpaComponent" id="jpa">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
        <property name="transactionManager" ref="jpaTxManager"/>
    </bean>
    <bean class="org.springframework.orm.jpa.JpaTransactionManager"
id="jpaTxManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>
    <bean
       
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
id="entityManagerFactory">
        <property name="persistenceUnitName" value="persistenceUnit"/>
        <property name="dataSource" ref="dataSource"/>
        <property name="jpaVendorAdapter" ref="jpaAdapter"/>
    </bean>
    <camelContext id="amq-example-context"
        xmlns="http://camel.apache.org/schema/spring"
xmlns:order="http://com.mycompany/examples/order">
        <propertyPlaceholder id="properties"
location="ref:parametros.spring"/>
        <routeBuilder ref="javaCamelRoute"/>
    </camelContext>
</beans>
==============================



--
View this message in context: http://camel.465427.n5.nabble.com/Camel-JPA-Transaction-EntityManager-tp5802279.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Re: Camel JPA Transaction + EntityManager

Posted by Tomohisa Igarashi <tm...@gmail.com>.
Hi,

You'd want to use the camel EntityManager instead of the one injected via annotation. The CamelEntityManager message header contains the one used by the camel JpaConsumer.
http://camel.apache.org/jpa.html

Thanks,
Tomo


On 06/08/2017 01:50 AM, renalexster wrote:
> Hi,
> 
> In my actual application, i have a business layer that uses JPA to persist
> data according to some business rules, the problem is that the camel-jpa
> transaction is not shared with the business layer transaction. I need my
> EntityManager in business classes to be integrated with the Camel
> transaction scope, how can I do this?
> 
> 
> Below is a simple example, but that reflects the problem in the actual
> design.
> 
> 
> Project example
> <https://github.com/renalexster/camel-jpa-idempotent/tree/lock_transaction>
> 
> 
> ==============================
> @Component
> public class MyService {
> 	@PersistenceContext(unitName="persistenceUnit") private EntityManager em;
> 	
> 	private static final Logger LOG = LoggerFactory.getLogger(MyService.class);
> 	
> 	public void recordLog(@Body Client client) {
> 		LOG.info("Inserting LogClient");
> 		LogClient log = new LogClient();
> 		log.setClient(client);
> 		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
> 		String strDate = sdf.format(new Date());
> 		log.setTxtLog("Persisted Client ["+client.getName()+"] at ["+strDate+"]");
> 		
> 		em.merge(log);
> 		LOG.info("Inserted LogClient ["+log.getId()+"]");
> 		
> 		
> 	}
> ==============================
> 
> 
> ==============================
> @Component
> public class CamelRoute extends RouteBuilder {
> 	
> 	@Override
> 	public void configure() throws Exception {
> 	
> from("jpa:com.mycompany.model.Client?persistenceUnit=persistenceUnit&consumeDelete=false&consumer.delay=15000").transacted()
> 		.split().simple("${body}")
> 			.log("Processing Client [${body.name}]")
> 			.bean(MyService.class, "recordLog")
> 			.log("${body.name} processed");
> 	}
> }
> ==============================
> 
> 
> 
> ==============================
> <?xml version="1.0" encoding="UTF-8"?>
> <beans xmlns="http://www.springframework.org/schema/beans"
>      xmlns:camel="http://camel.apache.org/schema/spring"
>      xmlns:ctx="http://www.springframework.org/schema/context"
>      xmlns:osgi="http://www.springframework.org/schema/osgi"
>      xmlns:osgix="http://www.springframework.org/schema/osgi-compendium"
>      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> xsi:schemaLocation="http://www.springframework.org/schema/beans
> http://www.springframework.org/schema/beans/spring-beans.xsd
> http://www.springframework.org/schema/osgi
> http://www.springframework.org/schema/osgi/spring-osgi.xsd
> http://www.springframework.org/schema/osgi-compendium
> http://www.springframework.org/schema/osgi-compendium/spring-osgi-compendium.xsd
> http://www.springframework.org/schema/context
> http://www.springframework.org/schema/context/spring-context-3.0.xsd
> http://camel.apache.org/schema/spring
> http://camel.apache.org/schema/spring/camel-spring.xsd">
>      <osgix:cm-properties id="parametros.spring"
> persistent-id="parametros.spring">
>          <prop key="db.driverClassName">org.postgresql.Driver</prop>
>          <prop
> key="db.url">jdbc:postgresql://192.168.238.1:5432/camel-jpa</prop>
>          <prop key="db.username">camel-jpa</prop>
>          <prop key="db.password">123456</prop>
>          <prop key="connection.show_sql">true</prop>
>      </osgix:cm-properties>
>      <ctx:property-placeholder properties-ref="parametros.spring"/>
>      <bean class="com.mycompany.routes.CamelRoute" id="javaCamelRoute"/>
>      <ctx:annotation-config/>
>      <bean
>          class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
> id="jpaAdapter">
>          <property name="showSql" value="${connection.show_sql}"/>
>          <property name="generateDdl" value="true"/>
>          <property name="databasePlatform"
> value="org.hibernate.dialect.PostgreSQLDialect"/>
>      </bean>
>      <bean class="org.apache.commons.dbcp.BasicDataSource" id="dataSource">
>          <property name="driverClassName" value="${db.driverClassName}"/>
>          <property name="url" value="${db.url}"/>
>          <property name="username" value="${db.username}"/>
>          <property name="password" value="${db.password}"/>
>      </bean>
>      <bean class="org.apache.camel.component.jpa.JpaComponent" id="jpa">
>          <property name="entityManagerFactory" ref="entityManagerFactory"/>
>          <property name="transactionManager" ref="jpaTxManager"/>
>      </bean>
>      <bean class="org.springframework.orm.jpa.JpaTransactionManager"
> id="jpaTxManager">
>          <property name="entityManagerFactory" ref="entityManagerFactory"/>
>      </bean>
>      <bean
>         
> class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
> id="entityManagerFactory">
>          <property name="persistenceUnitName" value="persistenceUnit"/>
>          <property name="dataSource" ref="dataSource"/>
>          <property name="jpaVendorAdapter" ref="jpaAdapter"/>
>      </bean>
>      <camelContext id="amq-example-context"
>          xmlns="http://camel.apache.org/schema/spring"
> xmlns:order="http://com.mycompany/examples/order">
>          <propertyPlaceholder id="properties"
> location="ref:parametros.spring"/>
>          <routeBuilder ref="javaCamelRoute"/>
>      </camelContext>
> </beans>
> ==============================
> 
> 
> 
> --
> View this message in context: http://camel.465427.n5.nabble.com/Camel-JPA-Transaction-EntityManager-tp5802279.html
> Sent from the Camel - Users mailing list archive at Nabble.com.
>