Skip to content

Commit

Permalink
Merge pull request #1 from scriptom/f/java17
Browse files Browse the repository at this point in the history
ARPBE-63: Facilitate cron trigger creation for subscriptions
  • Loading branch information
taswartz authored Feb 24, 2023
2 parents 2ab920a + 356826f commit 655deac
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 11 deletions.
60 changes: 49 additions & 11 deletions src/main/java/com/client/config/ScheduledEventConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,26 @@
import com.bullhornsdk.data.api.BullhornData;
import com.client.ApplicationSettings;
import com.client.core.scheduledtasks.ScheduledEventProcessing;
import com.client.core.scheduledtasks.config.CustomSubscriptionSettings;
import com.client.core.scheduledtasks.service.EventWorkflowFactory;
import org.quartz.CronTrigger;
import org.quartz.impl.triggers.CronTriggerImpl;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;

import java.text.ParseException;
import java.util.List;
import java.util.Arrays;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;

/**
* Configuration for creating scheduled event tasks.
*
* TODO: Maybe make scheduled tasks in multiple different folders
*/
// TODO: Maybe make scheduled tasks in multiple different folders
@Configuration
public class ScheduledEventConfig {

Expand All @@ -29,21 +32,28 @@ public class ScheduledEventConfig {

private final EventWorkflowFactory eventWorkflowFactory;

private final CustomSubscriptionSettings customSubscriptionSettings;

ScheduledEventConfig(BullhornData bullhornData,
ApplicationSettings appSettings,
EventWorkflowFactory eventWorkflowFactory) {
EventWorkflowFactory eventWorkflowFactory,
CustomSubscriptionSettings customSubscriptionSettings) {
this.bullhornData = bullhornData;
this.appSettings = appSettings;
this.eventWorkflowFactory = eventWorkflowFactory;
this.customSubscriptionSettings = customSubscriptionSettings;
}

@Bean
SchedulerFactoryBean mainScheduler(List<CronTrigger> triggers) {
SchedulerFactoryBean mainScheduler(CronTrigger standardCronTriggerBean) {
SchedulerFactoryBean mainScheduler = new SchedulerFactoryBean();
mainScheduler.setOverwriteExistingJobs(true);
mainScheduler.setAutoStartup(true);

mainScheduler.setTriggers(triggers.toArray(new CronTrigger[triggers.size()]));
CronTrigger[] customCronTriggers = getCustomCronTriggers();
CronTrigger[] cronTriggers = Arrays.copyOf(customCronTriggers, customCronTriggers.length + 1);
cronTriggers[customCronTriggers.length] = standardCronTriggerBean;
mainScheduler.setTriggers(cronTriggers);

return mainScheduler;
}
Expand All @@ -65,8 +75,6 @@ public CronTrigger standardCronTriggerBean(
public MethodInvokingJobDetailFactoryBean standardFactoryBean() {
MethodInvokingJobDetailFactoryBean factoryBean = new MethodInvokingJobDetailFactoryBean();

// this.applicationContext.getBean() TODO: Idea with easily creating scheduled task beans

factoryBean.setTargetBeanName("standardSubscriptionScheduledEventProcessing");
factoryBean.setTargetMethod("run");
factoryBean.setConcurrent(true);
Expand All @@ -78,4 +86,34 @@ public MethodInvokingJobDetailFactoryBean standardFactoryBean() {
ScheduledEventProcessing standardSubscriptionScheduledEventProcessing(@Value("${standardSubscriptionName}") String subName) {
return new ScheduledEventProcessing(subName, bullhornData, appSettings, eventWorkflowFactory);
}

private CronTrigger[] getCustomCronTriggers() {
Map<String, String> customSubscriptions = customSubscriptionSettings.customSubscriptions();
return customSubscriptions.entrySet().stream().map((subscription) -> {
String subscriptionName = subscription.getKey();
String cronExpression = subscription.getValue();
ScheduledEventProcessing eventProcessing = new ScheduledEventProcessing(subscriptionName, bullhornData, appSettings, eventWorkflowFactory);
MethodInvokingJobDetailFactoryBean factoryBean = new MethodInvokingJobDetailFactoryBean();

factoryBean.setTargetObject(eventProcessing);
factoryBean.setTargetMethod("run");
factoryBean.setConcurrent(true);
try {
factoryBean.afterPropertiesSet();
} catch (ClassNotFoundException | NoSuchMethodException e) {
throw new RuntimeException("Could not create Job for subscription " + subscriptionName, e);
}

CronTriggerFactoryBean cronTriggerFactoryBean = new CronTriggerFactoryBean();
cronTriggerFactoryBean.setCronExpression(cronExpression);
cronTriggerFactoryBean.setJobDetail(Objects.requireNonNull(factoryBean.getObject(), "JobDetail was null for subscription " + subscriptionName));
try {
cronTriggerFactoryBean.afterPropertiesSet();
} catch (ParseException e) {
throw new RuntimeException("Could not parse cron expression " + cronExpression + " (subscriptionName=" + subscriptionName + ")", e);
}

return cronTriggerFactoryBean.getObject();
}).collect(Collectors.toSet()).toArray(new CronTrigger[customSubscriptions.size()]);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.client.core.scheduledtasks.config;

import com.google.common.collect.Maps;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.Map;

@ConfigurationProperties(prefix = "scheduledtasks")
public record CustomSubscriptionSettings(Map<String, String> customSubscriptions) {
public CustomSubscriptionSettings {
if (customSubscriptions == null) {
customSubscriptions = Maps.newHashMap();
}
}
}
4 changes: 4 additions & 0 deletions src/main/resources/application.properties
Original file line number Diff line number Diff line change
Expand Up @@ -61,3 +61,7 @@ orca.password=

rest.prefix.core=/main/resttrigger
rest.prefix.custom=/custom/resttrigger

# Example custom subscriptions
#scheduledtasks.customSubscriptions.myCustomSubscription=0 */5 * * * ?
#scheduledtasks.customSubscriptions.mySecondCustomSubs=0 */10 * * * ?

0 comments on commit 655deac

Please sign in to comment.