Hi,

  Sorry for the delay in response. I did not get notified in my mail box and
hence had not followed your reply to the mail thread.

Please find below my answers and the blueprint xml used in the cluster with
7 VM's.

Thanks,
Lakshmi

   
 - Which exact Quartz 1.x version do you make use of? : 
/Ans: I am using servicemix quartz 1.8.6_1 bundle./

- Can you reproduce this with the latest Camel 2.12.1 version? 
/Ans: Yes. It happens in big clusters. Has any fix been provided with camel
2.12.1?/

- And CAMEL-5994 is already fixed so this should not cause any problem for
you 
- Also looking at the stacktrace I think Quartz has not been setup properly
in Cluster-Mode (see
org.apache.camel.component.quartz.QuartzComponent.doAddJob(QuartzComponent.java:232)
on the call-stack)... Did you set the org.quartz.jobStore.isClustered and
org.quartz.jobStore.clusterCheckinInterval properties appropriately?
/Ans: Please find the blueprint XML that I had used. I have set isClustered
as true and the logs showed that the route got triggered by quartz in
different cluster VM's for different runs, till the exception got reported.
But I was not sure of the right value for the checkin interval in the
cluster and had not specified any specific value./

 - As you run inside OSGi but assign the id of <camelContext> by yourself
(e.g. context4), have you seen the blue-box about this here
http://camel.apache.org/quartz

/Ans: I am assigning an unique id for each bundle with the camel route. As
of now, I had tested with only 1 bundle deployed in multiple cluster nodes &
hence I guess that the context id should not be a problem.

I will also check by removing the context id, as well.
/


I  had a look at the quartz component source code: The error trace shows
that existingTrigger is null. It looks like that a race condition is
occuring between the different VM's. Both of them are likely getting the
trigger name as null and try to schedule the job..but the job is already
scheduled

  private void doAddJob(JobDetail job, Trigger trigger) throws
SchedulerException {
        incrementJobCounter(getScheduler());

        Trigger existingTrigger =
getScheduler().getTrigger(trigger.getName(), trigger.getGroup());
        if (existingTrigger == null) {
            LOG.debug("Adding job using trigger: {}/{}", trigger.getGroup(),
trigger.getName());
            *getScheduler().scheduleJob(job, trigger);*
        } else if (hasTriggerChanged(existingTrigger, trigger)) {
            LOG.debug("Trigger: {}/{} already exists and will be updated by
Quartz.", trigger.getGroup(), trigger.getName());
            // fast forward start time to now, as we do not want any misfire
to kick in
            trigger.setStartTime(new Date());
            // replace job, and relate trigger to previous job name, which
is needed to reschedule job
            scheduler.addJob(job, true);
            trigger.setJobName(existingTrigger.getJobName());
            scheduler.rescheduleJob(trigger.getName(), trigger.getGroup(),
trigger);
        } else {
            if (!isClustered()) {
                LOG.debug("Trigger: {}/{} already exists and will be resumed
by Quartz.", trigger.getGroup(), trigger.getName());
                // fast forward start time to now, as we do not want any
misfire to kick in
                trigger.setStartTime(new Date());
                // replace job, and relate trigger to previous job name,
which is needed to reschedule job
                scheduler.addJob(job, true);
                trigger.setJobName(existingTrigger.getJobName());
                scheduler.rescheduleJob(trigger.getName(),
trigger.getGroup(), trigger);
            } else {
                LOG.debug("Trigger: {}/{} already exists and is already
scheduled by clustered JobStore.", trigger.getGroup(), trigger.getName());
            }
        }
    }

____________________________________________________________________________________


*Blueprint XML used by me:*


<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0";

xmlns:Generator="com.sap.it.gnb.ifl.common.gen.pluggability.api.GeneratorHandler"
        xmlns:str="http://exslt.org/strings"; 
xmlns:exsl="http://exslt.org/common";
        xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0";
        xmlns:idocsoap="urn:sap-com:document:sap:idoc:soap:messages"
xmlns:bsn="http://sapcd.com/bsnagt";
        xmlns:ns="https://bsnschemas.netweaver.neo.com/bsnflow";
xmlns:jaxws="http://cxf.apache.org/blueprint/jaxws";
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
xmlns:sec="http://cxf.apache.org/configuration/security";
        xmlns:wsrm-policy="http://schemas.xmlsoap.org/ws/2005/02/rm/policy";
        xmlns:wsrm-mgr="http://cxf.apache.org/ws/rm/manager";
xmlns:wsa="http://cxf.apache.org/ws/addressing";
        xmlns:http-conf="http://cxf.apache.org/transports/http/configuration";
        xmlns:cxfcore="http://cxf.apache.org/blueprint/core";
xmlns:cxf="http://camel.apache.org/schema/blueprint/cxf";
        xmlns:camel="http://camel.apache.org/schema/blueprint";
        xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0
http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd          
http://camel.apache.org/schema/blueprint
http://camel.apache.org/schema/blueprint/camel-blueprint.xsd          
http://camel.apache.org/schema/blueprint/cxf
http://camel.apache.org/schema/blueprint/cxf/camel-cxf.xsd          
http://cxf.apache.org/blueprint/core
http://cxf.apache.org/schemas/blueprint/core.xsd          
http://cxf.apache.org/transports/http/configuration
http://cxf.apache.org/schemas/configuration/http-conf.xsd          
http://cxf.apache.org/ws/rm/manager
http://cxf.apache.org/schemas/configuration/wsrm-manager.xsd          
http://schemas.xmlsoap.org/ws/2005/02/rm/policy
http://schemas.xmlsoap.org/ws/2005/02/rm/wsrm-policy.xsd          
http://cxf.apache.org/configuration/security
http://cxf.apache.org/schemas/configuration/security.xsd          
http://cxf.apache.org/blueprint/jaxws
http://cxf.apache.org/schemas/blueprint/jaxws.xsd
        http://camel.apache.org/schema/spring
http://camel.apache.org/schema/spring/camel-spring.xsd";>


         
        <reference id="dataSource" interface="javax.sql.DataSource"
filter="(dataSourceName=default)" />
        <bean id="stdSchedulerFactory" 
class="org.quartz.impl.StdSchedulerFactory">
        <argument  type="java.util.Properties" >
                <props>
                        <prop
key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop>
                        <prop
key="org.quartz.dataSource.default.jndiURL">osgi:service/javax.sql.DataSource/(dataSourceName=default)</prop>
                                <prop 
key="org.quartz.jobStore.dataSource">default</prop>                             
  
                                <prop 
key="org.quartz.scheduler.instanceId">AUTO</prop>
                                <prop 
key="org.quartz.jobStore.misfireThreshold">60000</prop>
                                <prop
key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop>
                                <prop
key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.StdJDBCDelegate</prop>
                                <prop 
key="org.quartz.dataSource.default.jndiAlwaysLookup">false</prop>               
          
                                <prop 
key="org.quartz.scheduler.skipUpdateCheck">true</prop>
                                <prop 
key="org.quartz.jobStore.isClustered">true</prop>
                                <prop
key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
                                <prop 
key="org.quartz.threadPool.threadCount">50</prop>
                                <prop
key="org.quartz.plugin.triggHistory.class">org.quartz.plugins.history.LoggingTriggerHistoryPlugin
</prop>
                                <prop 
key="org.quartz.plugin.triggHistory.triggerFiredMessage">Trigger
{1}.{0} fired job {6}.{5} at {4,date,yyyy-MM-dd HH:mm:ss} </prop>
                                <prop
key="org.quartz.plugin.triggHistory.triggerCompleteMessage">Trigger {1}.{0}
completed firing job {6}.{5} at
                                        {4,date, yyyy-MM-dd HH:mm:ss} with 
resulting trigger instructioncode
{9}
                                </prop>                         
                </props>
        </argument>
    </bean>     
        <bean id="quartz"
class="org.apache.camel.component.quartz.QuartzComponent">    
                <property name="factory" ref="stdSchedulerFactory"/>
   </bean>              
   <bean id="mockProcessor" class="com.sap.test.route.TestProcessor" />
        

        
   <camelContext id="context4"
                xmlns="http://camel.apache.org/schema/blueprint"; >
                 
                 <route>
                        <from uri="quartz://schedule3?cron=0+0/1+0-23+*+*+?+*" 
/>
                        <process ref="mockProcessor" />                 
                        <camel:to uri="file:data/outbox" />
                </route>
</camelContext>



</blueprint>



--
View this message in context: 
http://camel.465427.n5.nabble.com/Camel-quartz-misfires-and-route-not-getting-run-triggered-after-exception-ObjectAlreadyExistsExceptin-tp5739997p5741632.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Reply via email to