You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@servicemix.apache.org by Gert Vanthienen <ge...@skynet.be> on 2008/11/04 15:30:57 UTC
Re: Re-scheduling a servicemix-quartz trigger
subh,
I don't think you can do that by merely changing the <timer> message you
receive, you probably need to access the scheduler inside the
component. If you could clarify what you want in a unit test, we might
be able to add the requested behavior. We could e.g. make a new
endpoint that can receive <schedule> messages to start a new scheduler
more dynamically. Is this what you are looking for?
Regards,
Gert
subh wrote:
> Hi Gert,
>
> Actually even after my re-scheduling, the original trigger fires and after
> that none gets fired. As in DefaultQuartzMarshaller, I add the following in
> my CustomMarshaller class
>
> Document document = getTransformer().createDocument();
> Element root = document.createElement("timer");
> document.appendChild(root);
> DOMUtil.addChildElement(root, "name",
> context.getTrigger().getName());
> DOMUtil.addChildElement(root, "group", Scheduler.DEFAULT_GROUP);
> DOMUtil.addChildElement(root, "fullname", jobName);
> DOMUtil.addChildElement(root, "description",
> context.getTrigger().getDescription());
> DOMUtil.addChildElement(root, "fireTime", startDate);
> DOMUtil.addChildElement(root, "nextFireTime", new
> Date(startDate.getTime() + 300*1000));
> message.setContent(new DOMSource(document));
>
> I added the "nextFireTime" property, and my message shows
>
> DEBUG - SedaQueue -
> org.apache.servicemix.jbi.nmr.flow.seda.SedaQueue$1@119860e dequeued
> exchange: InOnly[
> id: ID:10.30.9.159-11d5353726d-16:3
> status: Active
> role: provider
> service: {http://com.mycompany.esb/moextract}moeExtractSvc
> endpoint: endpoint
> in: <?xml version="1.0" encoding="UTF-8"?><timer><name>(inner
> bean)</name><group>DEFAULT</group><fullname>DEFAULT.{http://com.mycompany.esb}moeQuartzScheduler:mo
> eqrtzSchEndpoint</fullname><description/><fireTime>Fri Oct 31 10:22:11 CDT
> 2008</fireTime><nextFireTime>Fri Oct 31 10:22:41 CDT
> 2008</nextFireTime></timer>
> ]
>
> But still, the quartz component doesnot fire at the above scheduled
> <nextFireTime/>.
>
> rgds
> subh
>
>
> Gert Vanthienen wrote:
>
>> L.S.,
>>
>> Inside ServiceMix, there's nothing that prohibits you from using the
>> Scheduler object to schedule a new job, so I guess it should be possible
>> somehow. Are you sure you aren't showing the data from the original
>> trigger at the time it is being fired, because it would be normal that the
>> nextFireTime is null (since you are only rescheduling it after it has been
>> fired) at that point in time? Could you add some logging after you're
>> done rescheduling to see what the effect is at that point.
>>
>> Regards,
>>
>> Gert
>>
>>
>> subh wrote:
>>
>>> Hi,
>>>
>>> Is it possible to reschedule a quartz trigger? I have defined my Simple
>>> trigger as follows
>>>
>>> XBEAN:
>>> ======
>>> <quartz:endpoint service="esb:moeQuartzScheduler"
>>> endpoint="moeqrtzSchEndpoint"
>>> targetService="moeextract:moeExtractSvc">
>>>
>>> <quartz:trigger>
>>> <quartz:simple repeatCount="0" repeatInterval="10000" />
>>> </quartz:trigger>
>>>
>>> <quartz:marshaler>
>>> <bean class="com.esb.quartz.scheduler.CustomQuartzMarshaler" />
>>> </quartz:marshaler>
>>>
>>> </quartz:endpoint>
>>>
>>> In my custom marshaller I extended extends DefaultQuartzMarshaler and
>>> added the following code to reschedule the job, but it doesnot work and
>>> shows the 'nextFireTime' as NULL.
>>>
>>> Am I doing it right? Can it be done in servicemix?
>>>
>>> CODE:
>>> ======
>>> public void populateNormalizedMessage(NormalizedMessage message,
>>> JobExecutionContext context) throws JobExecutionException,
>>> MessagingException {
>>> super.populateNormalizedMessage(message, context);
>>> String fireTime = "<JobFireTime>" +
>>> context.getScheduledFireTime() + "</JobFireTime>";
>>> try {
>>> //context.getScheduler().shutdown();
>>>
>>> Scheduler sched = context.getScheduler();
>>> //Scheduler sched = StdSchedulerFactory.getDefaultScheduler();
>>>
>>> Date startDate = new java.util.Date();
>>> long runEveryInMilliseconds = 900*1000; // every 15 minutes
>>> String jobName = context.getTrigger().getFullJobName();
>>>
>>> //SimpleTrigger trigger = new SimpleTrigger(jobName,
>>> Scheduler.DEFAULT_GROUP, startDate, null,
>>> SimpleTrigger.REPEAT_INDEFINITELY, runEveryInMilliseconds);
>>>
>>> SimpleTrigger trigger = (SimpleTrigger)context.getTrigger();
>>> trigger.setGroup(Scheduler.DEFAULT_GROUP);
>>> trigger.setStartTime(startDate);
>>> trigger.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
>>> trigger.setRepeatInterval(runEveryInMilliseconds);
>>> trigger.setJobName(jobName);
>>> trigger.setJobGroup(Scheduler.DEFAULT_GROUP);
>>> sched.rescheduleJob(jobName, Scheduler.DEFAULT_GROUP, trigger);
>>> }
>>> catch (SchedulerException e) {
>>> // TODO Auto-generated catch block
>>> e.printStackTrace();
>>> }
>>> message.setContent(new StringSource(fireTime));
>>> }
>>>
>>>
>>> CONSOLE:
>>> ========
>>>
>>> 14:59:04,283 | DEBUG | DefaultQuartzScheduler_Worker-7 | QuartzComponent
>>> | rvicemix.quartz.QuartzEndpoint 134 | Firing Quartz Job with context:
>>> JobExecutionContext: trigger: 'DEFAULT.(inner bean) job:
>>> DEFAULT.{http://com.mycompany.esb}moeQuartzScheduler:moeqrtzSchEndpoint
>>> fireTime: 'Thu Oct 30 14:59:04 CDT 2008 scheduledFireTime: Thu Oct 30
>>> 14:59:02 CDT 2008 previousFireTime: 'null nextFireTime: null
>>> isRecovering: false refireCount: 0
>>>
>>>
>>>
>>>
>>
>
>
Re: Re-scheduling a servicemix-quartz trigger
Posted by subh <su...@aol.com>.
Hi Gert,
Yes, I need a way to start a new scheduler or update an existing scheduler's
fire properties dynamically?
Please suggest how do I create the unit test you mentioned?
rgds
subh
Gert Vanthienen wrote:
>
> subh,
>
> I don't think you can do that by merely changing the <timer> message you
> receive, you probably need to access the scheduler inside the
> component. If you could clarify what you want in a unit test, we might
> be able to add the requested behavior. We could e.g. make a new
> endpoint that can receive <schedule> messages to start a new scheduler
> more dynamically. Is this what you are looking for?
>
> Regards,
>
> Gert
>
> subh wrote:
>> Hi Gert,
>>
>> Actually even after my re-scheduling, the original trigger fires and
>> after
>> that none gets fired. As in DefaultQuartzMarshaller, I add the following
>> in
>> my CustomMarshaller class
>>
>> Document document = getTransformer().createDocument();
>> Element root = document.createElement("timer");
>> document.appendChild(root);
>> DOMUtil.addChildElement(root, "name",
>> context.getTrigger().getName());
>> DOMUtil.addChildElement(root, "group",
>> Scheduler.DEFAULT_GROUP);
>> DOMUtil.addChildElement(root, "fullname", jobName);
>> DOMUtil.addChildElement(root, "description",
>> context.getTrigger().getDescription());
>> DOMUtil.addChildElement(root, "fireTime", startDate);
>> DOMUtil.addChildElement(root, "nextFireTime", new
>> Date(startDate.getTime() + 300*1000));
>> message.setContent(new DOMSource(document));
>>
>> I added the "nextFireTime" property, and my message shows
>>
>> DEBUG - SedaQueue -
>> org.apache.servicemix.jbi.nmr.flow.seda.SedaQueue$1@119860e dequeued
>> exchange: InOnly[
>> id: ID:10.30.9.159-11d5353726d-16:3
>> status: Active
>> role: provider
>> service: {http://com.mycompany.esb/moextract}moeExtractSvc
>> endpoint: endpoint
>> in: <?xml version="1.0" encoding="UTF-8"?><timer><name>(inner
>> bean)</name><group>DEFAULT</group><fullname>DEFAULT.{http://com.mycompany.esb}moeQuartzScheduler:mo
>> eqrtzSchEndpoint</fullname><description/><fireTime>Fri Oct 31 10:22:11
>> CDT
>> 2008</fireTime><nextFireTime>Fri Oct 31 10:22:41 CDT
>> 2008</nextFireTime></timer>
>> ]
>>
>> But still, the quartz component doesnot fire at the above scheduled
>> <nextFireTime/>.
>>
>> rgds
>> subh
>>
>>
>> Gert Vanthienen wrote:
>>
>>> L.S.,
>>>
>>> Inside ServiceMix, there's nothing that prohibits you from using the
>>> Scheduler object to schedule a new job, so I guess it should be possible
>>> somehow. Are you sure you aren't showing the data from the original
>>> trigger at the time it is being fired, because it would be normal that
>>> the
>>> nextFireTime is null (since you are only rescheduling it after it has
>>> been
>>> fired) at that point in time? Could you add some logging after you're
>>> done rescheduling to see what the effect is at that point.
>>>
>>> Regards,
>>>
>>> Gert
>>>
>>>
>>> subh wrote:
>>>
>>>> Hi,
>>>>
>>>> Is it possible to reschedule a quartz trigger? I have defined my Simple
>>>> trigger as follows
>>>>
>>>> XBEAN:
>>>> ======
>>>> <quartz:endpoint service="esb:moeQuartzScheduler"
>>>> endpoint="moeqrtzSchEndpoint"
>>>> targetService="moeextract:moeExtractSvc">
>>>>
>>>> <quartz:trigger>
>>>> <quartz:simple repeatCount="0" repeatInterval="10000" />
>>>> </quartz:trigger>
>>>>
>>>> <quartz:marshaler>
>>>> <bean class="com.esb.quartz.scheduler.CustomQuartzMarshaler" />
>>>> </quartz:marshaler>
>>>>
>>>> </quartz:endpoint>
>>>>
>>>> In my custom marshaller I extended extends DefaultQuartzMarshaler and
>>>> added the following code to reschedule the job, but it doesnot work and
>>>> shows the 'nextFireTime' as NULL.
>>>>
>>>> Am I doing it right? Can it be done in servicemix?
>>>>
>>>> CODE:
>>>> ======
>>>> public void populateNormalizedMessage(NormalizedMessage message,
>>>> JobExecutionContext context) throws JobExecutionException,
>>>> MessagingException {
>>>> super.populateNormalizedMessage(message, context);
>>>> String fireTime = "<JobFireTime>" +
>>>> context.getScheduledFireTime() + "</JobFireTime>";
>>>> try {
>>>> //context.getScheduler().shutdown();
>>>>
>>>> Scheduler sched = context.getScheduler();
>>>> //Scheduler sched = StdSchedulerFactory.getDefaultScheduler();
>>>>
>>>> Date startDate = new java.util.Date();
>>>> long runEveryInMilliseconds = 900*1000; // every 15 minutes
>>>> String jobName = context.getTrigger().getFullJobName();
>>>>
>>>> //SimpleTrigger trigger = new SimpleTrigger(jobName,
>>>> Scheduler.DEFAULT_GROUP, startDate, null,
>>>> SimpleTrigger.REPEAT_INDEFINITELY, runEveryInMilliseconds);
>>>>
>>>> SimpleTrigger trigger = (SimpleTrigger)context.getTrigger();
>>>> trigger.setGroup(Scheduler.DEFAULT_GROUP);
>>>> trigger.setStartTime(startDate);
>>>> trigger.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
>>>> trigger.setRepeatInterval(runEveryInMilliseconds);
>>>> trigger.setJobName(jobName);
>>>> trigger.setJobGroup(Scheduler.DEFAULT_GROUP);
>>>> sched.rescheduleJob(jobName, Scheduler.DEFAULT_GROUP, trigger);
>>>> }
>>>> catch (SchedulerException e) {
>>>> // TODO Auto-generated catch block
>>>> e.printStackTrace();
>>>> }
>>>> message.setContent(new StringSource(fireTime));
>>>> }
>>>>
>>>>
>>>> CONSOLE:
>>>> ========
>>>>
>>>> 14:59:04,283 | DEBUG | DefaultQuartzScheduler_Worker-7 |
>>>> QuartzComponent
>>>> | rvicemix.quartz.QuartzEndpoint 134 | Firing Quartz Job with context:
>>>> JobExecutionContext: trigger: 'DEFAULT.(inner bean) job:
>>>> DEFAULT.{http://com.mycompany.esb}moeQuartzScheduler:moeqrtzSchEndpoint
>>>> fireTime: 'Thu Oct 30 14:59:04 CDT 2008 scheduledFireTime: Thu Oct 30
>>>> 14:59:02 CDT 2008 previousFireTime: 'null nextFireTime: null
>>>> isRecovering: false refireCount: 0
>>>>
>>>>
>>>>
>>>>
>>>
>>
>>
>
>
>
> -----
> ---
> Gert Vanthienen
> http://gertvanthienen.blogspot.com
>
--
View this message in context: http://www.nabble.com/Re-scheduling-a-servicemix-quartz-trigger-tp20255573p20324809.html
Sent from the ServiceMix - User mailing list archive at Nabble.com.