Skip to content

Commit

Permalink
Removed schedule at fixed delay from symmetric-jobs.xml, job now re-s…
Browse files Browse the repository at this point in the history
…chedules based on completion of current task. Expectation is variability in completion of individual tasks will force random sequencing of push/pull requests.

NGPHASE-3172
  • Loading branch information
kbajaj01 committed Feb 6, 2008
1 parent e480862 commit d4575c1
Show file tree
Hide file tree
Showing 2 changed files with 91 additions and 26 deletions.
86 changes: 75 additions & 11 deletions symmetric/src/main/java/org/jumpmind/symmetric/job/AbstractJob.java
Expand Up @@ -20,38 +20,102 @@

package org.jumpmind.symmetric.job;

import java.util.Timer;
import java.util.TimerTask;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.logging.Log;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;

abstract public class AbstractJob extends TimerTask {

abstract public class AbstractJob extends TimerTask implements BeanFactoryAware, BeanNameAware
{
DataSource dataSource;


private boolean needsRescheduled;

private long rescheduleDelay;

private BeanFactory beanFactory;

private String beanName;

@Override
public void run() {
try {
public void run()
{
try
{
doJob();
} catch (Throwable ex) {
if (isNeedsRescheduled())
{
reschedule();
}
}
catch (final Throwable ex)
{
getLogger().error(ex, ex);
}
}

abstract void doJob() throws Exception;

abstract Log getLogger();

protected void printDatabaseStats() {
if (getLogger().isDebugEnabled() && dataSource instanceof BasicDataSource) {
BasicDataSource ds = (BasicDataSource)dataSource;

protected void reschedule()
{
final Timer timer = new Timer();
timer.schedule((TimerTask) beanFactory.getBean(beanName), getRescheduleDelay());
if (getLogger().isDebugEnabled())
{
getLogger().debug("Rescheduling " + beanName + " with " + getRescheduleDelay() + " ms delay.");
}
}

protected void printDatabaseStats()
{
if (getLogger().isDebugEnabled() && dataSource instanceof BasicDataSource)
{
final BasicDataSource ds = (BasicDataSource) dataSource;
getLogger().debug("There are currently " + ds.getNumActive() + " active database connections.");
}
}

public void setDataSource(DataSource dataSource) {
public void setBeanFactory(final BeanFactory beanFactory)
{
this.beanFactory = beanFactory;
}

public void setBeanName(final String beanName)
{
this.beanName = beanName;
}

public void setDataSource(final DataSource dataSource)
{
this.dataSource = dataSource;
}

public boolean isNeedsRescheduled()
{
return needsRescheduled;
}

public void setNeedsRescheduled(final boolean needsRescheduled)
{
this.needsRescheduled = needsRescheduled;
}

public void setRescheduleDelay(final long rescheduleDelay)
{
this.rescheduleDelay = rescheduleDelay;
}

public long getRescheduleDelay()
{
return rescheduleDelay;
}

}
31 changes: 16 additions & 15 deletions symmetric/src/main/resources/symmetric-jobs.xml
Expand Up @@ -28,43 +28,44 @@ http://www.springframework.org/schema/util http://www.springframework.org/schema
<util:property-path id="millisecondsUntilTargetTime"
path="afterMidnightTimeSlot.millisecondsUntilTargetTime" />


<bean id="pushJobTimer" class="org.springframework.scheduling.timer.TimerFactoryBean">
<property name="scheduledTimerTasks">
<list>
<bean class="org.springframework.scheduling.timer.ScheduledTimerTask">
<!-- Random wait before start to stagger load -->
<property name="delay" ref="delayBeforeStartTimeSlotPush" />
<property name="period" value="${symmetric.runtime.job.push.period.time.ms}" />
<property name="timerTask">
<bean class="org.jumpmind.symmetric.job.PushJob">
<property name="pushService" ref="pushService" />
<property name="dataSource" ref="dataSource"/>
</bean>
</property>
<property name="timerTask" ref="pushTimerTask" />
</bean>
</list>
</property>
</bean>

<bean id="pushTimerTask" class="org.jumpmind.symmetric.job.PushJob" scope="prototype">
<property name="pushService" ref="pushService" />
<property name="needsRescheduled" value="true" />
<property name="rescheduleDelay" value="${symmetric.runtime.job.push.period.time.ms}" />
<property name="dataSource" ref="dataSource"/>
</bean>

<bean id="pullJobTimer" class="org.springframework.scheduling.timer.TimerFactoryBean">
<property name="scheduledTimerTasks">
<list>
<bean class="org.springframework.scheduling.timer.ScheduledTimerTask">
<!-- Random wait before start to stagger load -->
<property name="delay" ref="delayBeforeStartTimeSlotPull" />
<property name="period" value="${symmetric.runtime.job.pull.period.time.ms}" />
<property name="timerTask">
<bean class="org.jumpmind.symmetric.job.PullJob">
<property name="pullService" ref="pullService" />
<property name="dataSource" ref="dataSource"/>
</bean>
</property>
<property name="timerTask" ref="pullTimerTask" />
</bean>
</list>
</property>
</bean>

<bean id="pullTimerTask" class="org.jumpmind.symmetric.job.PullJob" scope="prototype">
<property name="pullService" ref="pullService" />
<property name="needsRescheduled" value="true" />
<property name="rescheduleDelay" value="${symmetric.runtime.job.pull.period.time.ms}" />
<property name="dataSource" ref="dataSource"/>
</bean>

<bean id="purgeJobTimer" class="org.springframework.scheduling.timer.TimerFactoryBean">
<property name="scheduledTimerTasks">
<list>
Expand Down

0 comments on commit d4575c1

Please sign in to comment.