Search code examples
jpaapache-camelpessimistic-locking

java.lang.NoSuchFieldError: PESSIMISTIC_WRITE error with jpaConsumer in apache camel


I am getting the below error with PESSIMISTIC_WRITE while using same jpa component in 2 routes although camel jpa is by default PESSIMISTIC_WRITE from 2.13.0 which I am using

Error:

[ERROR] *************************************
[ERROR] Error occurred while running main from: org.apache.camel.spring.Main
[ERROR] 
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.apache.camel.maven.RunMojo$1.run(RunMojo.java:488)
    at java.lang.Thread.run(Thread.java:722)
Caused by: java.lang.NoSuchFieldError: PESSIMISTIC_WRITE
    at org.apache.camel.component.jpa.JpaConsumer.<init>(JpaConsumer.java:60)
    at org.apache.camel.component.jpa.JpaEndpoint.createConsumer(JpaEndpoint.java:111)
    at org.apache.camel.impl.EventDrivenConsumerRoute.addServices(EventDrivenConsumerRoute.java:65)
    at org.apache.camel.impl.DefaultRoute.onStartingServices(DefaultRoute.java:80)
    at org.apache.camel.impl.RouteService.warmUp(RouteService.java:134)
    at org.apache.camel.impl.DefaultCamelContext.doWarmUpRoutes(DefaultCamelContext.java:2263)
    at org.apache.camel.impl.DefaultCamelContext.safelyStartRouteServices(DefaultCamelContext.java:2193)
    at org.apache.camel.impl.DefaultCamelContext.doStartOrResumeRoutes(DefaultCamelContext.java:1981)
    at org.apache.camel.impl.DefaultCamelContext.doStartCamel(DefaultCamelContext.java:1851)
    at org.apache.camel.impl.DefaultCamelContext.doStart(DefaultCamelContext.java:1683)
    at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61)
    at org.apache.camel.impl.DefaultCamelContext.start(DefaultCamelContext.java:1651)
    at org.apache.camel.spring.SpringCamelContext.maybeStart(SpringCamelContext.java:254)
    at org.apache.camel.spring.SpringCamelContext.onApplicationEvent(SpringCamelContext.java:120)
    at org.apache.camel.spring.CamelContextFactoryBean.onApplicationEvent(CamelContextFactoryBean.java:318)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:96)
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:334)
    at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:948)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:93)
    at org.apache.camel.spring.Main.createDefaultApplicationContext(Main.java:217)
    at org.apache.camel.spring.Main.doStart(Main.java:157)
    at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61)
    at org.apache.camel.main.MainSupport.run(MainSupport.java:147)
    at org.apache.camel.main.MainSupport.run(MainSupport.java:351)
    at org.apache.camel.spring.Main.main(Main.java:90)

my camel-context

<beans xmlns="http://www.springframework.org/schema/beans"
    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-3.0.xsd
       http://camel.apache.org/schema/spring 
       http://camel.apache.org/schema/spring/camel-spring.xsd">

  <bean id="jms" class="org.apache.camel.component.jms.JmsComponent">
    <property name="connectionFactory">
      <bean class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL" value="vm://localhost" />
      </bean>
    </property>
  </bean>

  <bean id="jpa" class="org.apache.camel.component.jpa.JpaComponent">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
    <property name="transactionManager" ref="springTransactionManager"/>
  </bean>

  <bean id="entityManagerFactory" 
  class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="camel" />
    <property name="jpaVendorAdapter" ref="jpaAdapter" />
  </bean>

  <bean id="jpaAdapter" 
  class="org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter">
    <property name="databasePlatform" value="org.apache.openjpa.jdbc.sql.DerbyDictionary" />
    <property name="database" value="DERBY" />
  </bean>

  <bean id="transactionTemplate" 
  class="org.springframework.transaction.support.TransactionTemplate">
    <property name="transactionManager" ref="springTransactionManager">
      <!--<bean class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
      </bean>-->
    </property>
  </bean>

  <bean id="springTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
  </bean>



  <bean id="downloadLogger" class="camelinaction.dl.DownloadLogger"/>
  <bean id="exchangeLogger" class="camelinaction.dl.ExchangeLogger"/>


  <bean id="startPolicy" class="org.apache.camel.routepolicy.quartz.CronScheduledRoutePolicy">
    <property name="routeStartTime" value="0 0/1 * * * ?"/>
  </bean>

  <camelContext xmlns="http://camel.apache.org/schema/spring">
    <dataFormats>
      <jaxb id="jaxb" contextPath="camelinaction"/>
    </dataFormats>

<route id="getFile" autoStartup="true" startupOrder="1">
  <from uri="file:data/inbox?noop=true"/>
  <process ref="downloadLogger"/>
  <unmarshal ref="jaxb"/>
  <to uri="jms:incomingOrders"/>
  <process ref="exchangeLogger"/>
  <to uri="jpa:camelinaction.PurchaseOrder"/>
</route>
<route id="fromDB" startupOrder="3">
  <from uri="jpa://camelinaction.PurchaseOrder?consumer.namedQuery=honda"/>
  <process ref="exchangeLogger"/>
  <marshal ref="jaxb"/>
  <to uri="file:data/outbox"/>
</route>

  </camelContext>
</beans>

purchaseOrder class

@Entity
@NamedQuery(name = "honda", query = "select o from PurchaseOrder o where o.customer=honda")
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class PurchaseOrder implements Serializable {

  private static final long serialVersionUID = 414632787969243627L;
  @XmlElement
  private String name;
  @XmlElement
  private double amount;
  @XmlElement
  private String customer;

  public PurchaseOrder() {
  }

  public double getAmount() {
      return amount;
  }

  public void setAmount(double amount) {
      this.amount = amount;
  }

  public String getName() {
      return name;
  }

  public void setName(String name) {
      this.name = name;
  }

  public void setCustomer(String customer) {
      this.customer = customer;
  }

  public String getCustomer() {
      return customer;
  }

  @Override
  public String toString() {
    return "Purchase Order Info: \n\tname: "  + name + "\n\tamount: " + amount +
      "\n\tcustomer: " + customer;
  }
}

Solution

  • I had this issue and it was resolved when I changed the openjpa dependency and added a maven build plugin to the POM. Please see below:

    FROM:

     <dependency>
       <groupId>org.apache.openjpa</groupId>
       <artifactId>openjpa-persistence-jdbc</artifactId>
       <version>1.2.2</version>
     </dependency>
    

    TO:

    <dependency>
      <groupId>org.apache.openjpa</groupId>
      <artifactId>openjpa</artifactId>
      <version>2.1.0</version>
    </dependency>
    

    BUILD PLUGIN

       <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>openjpa-maven-plugin</artifactId>
         <version>1.2</version>
         <configuration>
            <includes>**/model/*.class</includes>
            <addDefaultConstructor>true</addDefaultConstructor>
            <enforcePropertyRestrictions>true</enforcePropertyRestrictions>
         </configuration>
         <executions>
            <execution>
               <id>enhancer</id>
               <phase>process-classes</phase>
               <goals>
                  <goal>enhance</goal>
               </goals>
            </execution>
         </executions>
         <dependencies>
            <dependency>
               <groupId>org.apache.openjpa</groupId>
               <artifactId>openjpa</artifactId>
               <version>2.0.1</version>
            </dependency>
            <dependency>
               <groupId>commons-logging</groupId>
               <artifactId>commons-logging</artifactId>
               <version>1.1.1</version>
            </dependency>
         </dependencies>
      </plugin>