use of org.apache.sling.discovery.commons.InitDelayingTopologyEventListener in project sling by apache.
the class JobManagerConfiguration method activate.
/**
* Activate this component.
* @param props Configuration properties
* @param config Configuration properties
* @throws RuntimeException If the default paths can't be created
*/
@Activate
protected void activate(final Map<String, Object> props, final Config config) {
this.update(props, config);
this.jobsBasePathWithSlash = PropertiesUtil.toString(props.get(PROPERTY_REPOSITORY_PATH), DEFAULT_REPOSITORY_PATH) + '/';
// create initial resources
this.assignedJobsPath = this.jobsBasePathWithSlash + "assigned";
this.unassignedJobsPath = this.jobsBasePathWithSlash + "unassigned";
this.localJobsPath = this.assignedJobsPath.concat("/").concat(Environment.APPLICATION_ID);
this.localJobsPathWithSlash = this.localJobsPath.concat("/");
this.previousVersionAnonPath = this.jobsBasePathWithSlash + "anon";
this.previousVersionIdentifiedPath = this.jobsBasePathWithSlash + "identified";
this.storedCancelledJobsPath = this.jobsBasePathWithSlash + "cancelled";
this.storedSuccessfulJobsPath = this.jobsBasePathWithSlash + "finished";
this.scheduledJobsPath = PropertiesUtil.toString(props.get(PROPERTY_SCHEDULED_JOBS_PATH), DEFAULT_SCHEDULED_JOBS_PATH);
this.scheduledJobsPathWithSlash = this.scheduledJobsPath + "/";
// create initial resources
final ResourceResolver resolver = this.createResourceResolver();
try {
ResourceHelper.getOrCreateBasePath(resolver, this.getLocalJobsPath());
ResourceHelper.getOrCreateBasePath(resolver, this.getUnassignedJobsPath());
} catch (final PersistenceException pe) {
logger.error("Unable to create default paths: " + pe.getMessage(), pe);
throw new RuntimeException(pe);
} finally {
resolver.close();
}
this.active.set(true);
// SLING-5560 : use an InitDelayingTopologyEventListener
if (this.startupDelay > 0) {
logger.debug("activate: job manager will start in {} sec. ({})", this.startupDelay, config.startup_delay());
this.startupDelayListener = new InitDelayingTopologyEventListener(startupDelay, new TopologyEventListener() {
@Override
public void handleTopologyEvent(TopologyEvent event) {
doHandleTopologyEvent(event);
}
}, logger);
} else {
logger.debug("activate: job manager will start without delay. ({}:{})", config.startup_delay(), this.startupDelay);
}
}
use of org.apache.sling.discovery.commons.InitDelayingTopologyEventListener in project sling by apache.
the class JobManagerConfigurationTest method testTopologyChange.
@Test
public void testTopologyChange() throws Exception {
// mock scheduler
final ChangeListener ccl = new ChangeListener();
// add change listener and verify
ccl.init(1);
final JobManagerConfiguration config = new JobManagerConfiguration();
((AtomicBoolean) TestUtil.getFieldValue(config, "active")).set(true);
InitDelayingTopologyEventListener startupDelayListener = new InitDelayingTopologyEventListener(1, new TopologyEventListener() {
@Override
public void handleTopologyEvent(TopologyEvent event) {
config.doHandleTopologyEvent(event);
}
});
TestUtil.setFieldValue(config, "startupDelayListener", startupDelayListener);
config.addListener(ccl);
ccl.await();
assertEquals(1, ccl.events.size());
assertFalse(ccl.events.get(0));
// create init view
ccl.init(1);
final TopologyView initView = createView();
final TopologyEvent init = new TopologyEvent(TopologyEvent.Type.TOPOLOGY_INIT, null, initView);
config.handleTopologyEvent(init);
ccl.await();
assertEquals(1, ccl.events.size());
assertTrue(ccl.events.get(0));
// change view, followed by change props
ccl.init(2);
final TopologyView view2 = createView();
Mockito.when(initView.isCurrent()).thenReturn(false);
final TopologyEvent change1 = new TopologyEvent(TopologyEvent.Type.TOPOLOGY_CHANGED, initView, view2);
final TopologyView view3 = createView();
final TopologyEvent change2 = new TopologyEvent(TopologyEvent.Type.PROPERTIES_CHANGED, view2, view3);
config.handleTopologyEvent(change1);
Mockito.when(view2.isCurrent()).thenReturn(false);
config.handleTopologyEvent(change2);
ccl.await();
assertEquals(2, ccl.events.size());
assertFalse(ccl.events.get(0));
assertTrue(ccl.events.get(1));
// we wait another 4 secs to see if there is no another event
Thread.sleep(4000);
assertEquals(2, ccl.events.size());
}
Aggregations