Skip to content
This repository has been archived by the owner on Sep 26, 2023. It is now read-only.

FLOW-1564: Added compatibility with Docker and Kubernetes #3

Open
wants to merge 13 commits into
base: master
Choose a base branch
from
Open
10 changes: 10 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
FROM maven:slim AS build
WORKDIR /usr/src/app
COPY src src
COPY pom.xml pom.xml
RUN mvn clean package

FROM openjdk:8-jre-slim
EXPOSE 8080
COPY --from=build /usr/src/app/target/timer-1.0-SNAPSHOT.jar /usr/src/app/target/service.jar
ENTRYPOINT ["java", "-jar", "/usr/src/app/target/service.jar"]
127 changes: 101 additions & 26 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,59 +7,83 @@
<groupId>com.manywho.services</groupId>
<artifactId>timer</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>

<modules>
<module>timer-service</module>
<module>timer-worker</module>
<module>timer-common</module>
</modules>

<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<version.manywho.sdk>1.25.0</version.manywho.sdk>
</properties>

<dependencies>
<dependency>
<groupId>com.manywho</groupId>
<artifactId>sdk</artifactId>
<version>1.18.2</version>
<groupId>com.manywho.sdk</groupId>
<artifactId>sdk-core</artifactId>
<version>${version.manywho.sdk}</version>
<exclusions>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.manywho.sdk</groupId>
<artifactId>sdk-client</artifactId>
<version>${version.manywho.sdk}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
<version>1.7.30</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-to-slf4j</artifactId>
<version>2.13.1</version>
</dependency>
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>6.3</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</exclusion>
</exclusions>
</dependency>

<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.3.2</version>
<groupId>net.joelinn</groupId>
<artifactId>quartz-redis-jobstore</artifactId>
<version>1.1.15</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
<groupId>org.ocpsoft.prettytime</groupId>
<artifactId>prettytime-nlp</artifactId>
<version>4.0.0.Final</version>
</dependency>

<!-- Java 11 compatibility -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
<version>1.7.25</version>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.2</version>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>

<dependency>
Expand All @@ -69,4 +93,55 @@
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.manywho.services.timer.service.Application</mainClass>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
</transformers>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
</plugin>
</plugins>
</build>
</project>
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* This class needs to stay in this package, as Quartz serializes the entire class name into the job...
*/
public class WaitJob implements Job {
private static final Logger LOGGER = LoggerFactory.getLogger(WaitJob.class);

Expand Down
39 changes: 39 additions & 0 deletions src/main/java/com/manywho/services/timer/service/Application.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.manywho.services.timer.service;

import com.manywho.sdk.services.BaseApplication;
import com.manywho.services.timer.service.quartz.QuartzSchedulerFactory;
import org.glassfish.hk2.utilities.Binder;
import org.quartz.SchedulerException;
import org.slf4j.bridge.SLF4JBridgeHandler;

import javax.ws.rs.ApplicationPath;

@ApplicationPath("/")
public class Application extends BaseApplication {
static {
// Redirect any calls to JUL to SLF4j (..Jersey WTF?)
SLF4JBridgeHandler.removeHandlersForRootLogger();
SLF4JBridgeHandler.install();
}

public Application() {
this(new ApplicationBinder());

try {
new QuartzSchedulerFactory()
.provide()
.start();
} catch (SchedulerException e) {
throw new RuntimeException("Unable to start the scheduler", e);
}
}

public Application(Binder binder) {
registerSdk().packages("com.manywho.services.timer")
.register(binder);
}

public static void main(String[] args) {
startServer(new Application());
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.manywho.services.timer.service;

import com.manywho.services.timer.service.factories.QuartzSchedulerFactory;
import com.manywho.services.timer.service.quartz.QuartzSchedulerFactory;
import com.manywho.services.timer.service.services.SchedulerService;
import org.glassfish.hk2.utilities.binding.AbstractBinder;
import org.quartz.Scheduler;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.manywho.services.timer.service.factories;
package com.manywho.services.timer.service.quartz;

import org.glassfish.hk2.api.Factory;
import org.quartz.Scheduler;
Expand All @@ -7,13 +7,21 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Properties;

public class QuartzSchedulerFactory implements Factory<Scheduler> {
private final static Logger LOGGER = LoggerFactory.getLogger(QuartzSchedulerFactory.class);

@Override
public Scheduler provide() {
Properties properties = new Properties();
properties.setProperty("org.quartz.threadPool.threadCount", "3");
properties.setProperty("org.quartz.jobStore.class", "net.joelinn.quartz.jobstore.RedisJobStore");
properties.setProperty("org.quartz.jobStore.host", System.getenv("REDIS_URL"));
properties.setProperty("org.quartz.jobStore.misfireThreshold", "10000");

try {
return new StdSchedulerFactory().getScheduler();
return new StdSchedulerFactory(properties).getScheduler();
} catch (SchedulerException e) {
LOGGER.error("Unable to create an instance of Scheduler", e);

Expand All @@ -32,3 +40,4 @@ public void dispose(Scheduler scheduler) {
}
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,9 @@ public class SchedulerService {
private ObjectMapper objectMapper;

public void scheduleWait(String type, DateTime schedule, AuthenticatedWho authenticatedWho, String stateId, String tenantId, String callbackUri, String token) throws Exception {
if (Seconds.secondsBetween(DateTime.now(), schedule).isLessThan(Seconds.seconds(120))) {
if (Seconds.secondsBetween(DateTime.now(), schedule).isLessThan(Seconds.seconds(10))) {
schedule = DateTime.now();
schedule = schedule.plusSeconds(120);
schedule = schedule.plusSeconds(10);
}

String serializedAuthenticatedWho = objectMapper.writeValueAsString(authenticatedWho);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.manywho.services.timer.service.controllers;

import com.manywho.services.timer.service.services.SchedulerService;
import org.glassfish.hk2.api.Factory;
import org.glassfish.hk2.utilities.binding.AbstractBinder;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.impl.StdSchedulerFactory;

public class ApplicationTestBinder extends AbstractBinder {
@Override
protected void configure() {
bindFactory(new Factory<Scheduler>() {
@Override
public Scheduler provide() {
try {
return StdSchedulerFactory.getDefaultScheduler();
} catch (SchedulerException e) {
throw new RuntimeException(e);
}
}

@Override
public void dispose(Scheduler scheduler) {

}
}).to(Scheduler.class);

bind(SchedulerService.class).to(SchedulerService.class);
}
}
Loading