mirror of
https://github.com/valitydev/three-ds-server-compose.git
synced 2024-11-06 02:45:18 +00:00
add module 'pseudo-schedulator' for init preparation flow (#13)
This commit is contained in:
parent
b68750ccf8
commit
0a7f62766d
79
pseudo-schedulator/.gitignore
vendored
Normal file
79
pseudo-schedulator/.gitignore
vendored
Normal file
@ -0,0 +1,79 @@
|
||||
# Created by .ignore support plugin (hsz.mobi)
|
||||
.eunit
|
||||
deps
|
||||
*.o
|
||||
*.beam
|
||||
*.plt
|
||||
erl_crash.dump
|
||||
ebin/*.beam
|
||||
rel/example_project
|
||||
.concrete/DEV_MODE
|
||||
.rebar
|
||||
target/
|
||||
pom.xml.tag
|
||||
pom.xml.releaseBackup
|
||||
pom.xml.versionsBackup
|
||||
pom.xml.next
|
||||
release.properties
|
||||
dependency-reduced-pom.xml
|
||||
buildNumber.properties
|
||||
.mvn/timing.properties
|
||||
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
|
||||
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
||||
|
||||
# User-specific stuff:
|
||||
.idea/
|
||||
.idea/workspace.xml
|
||||
.idea/tasks.xml
|
||||
.idea/dictionaries
|
||||
.idea/vcs.xml
|
||||
.idea/jsLibraryMappings.xml
|
||||
|
||||
# Sensitive or high-churn files:
|
||||
.idea/dataSources.ids
|
||||
.idea/dataSources.xml
|
||||
.idea/dataSources.local.xml
|
||||
.idea/sqlDataSources.xml
|
||||
.idea/dynamic.xml
|
||||
.idea/uiDesigner.xml
|
||||
|
||||
# Gradle:
|
||||
.idea/gradle.xml
|
||||
.idea/libraries
|
||||
|
||||
# Mongo Explorer plugin:
|
||||
.idea/mongoSettings.xml
|
||||
|
||||
*.iws
|
||||
*.ipr
|
||||
*.iml
|
||||
|
||||
|
||||
# IntelliJ
|
||||
/out/
|
||||
|
||||
# mpeltonen/sbt-idea plugin
|
||||
.idea_modules/
|
||||
|
||||
# JIRA plugin
|
||||
atlassian-ide-plugin.xml
|
||||
|
||||
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||
com_crashlytics_export_strings.xml
|
||||
crashlytics.properties
|
||||
crashlytics-build.properties
|
||||
fabric.properties
|
||||
*.class
|
||||
|
||||
# Mobile Tools for Java (J2ME)
|
||||
.mtj.tmp/
|
||||
|
||||
# Package Files #
|
||||
*.jar
|
||||
*.war
|
||||
*.ear
|
||||
|
||||
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
||||
hs_err_pid*
|
||||
env.list
|
||||
|
16
pseudo-schedulator/Dockerfile
Normal file
16
pseudo-schedulator/Dockerfile
Normal file
@ -0,0 +1,16 @@
|
||||
#
|
||||
# Build stage
|
||||
#
|
||||
FROM maven:3.6.0-jdk-11-slim AS build
|
||||
COPY src /home/pseudo-schedulator/src
|
||||
COPY pom.xml /home/pseudo-schedulator
|
||||
ENV POM_XML=/home/pseudo-schedulator/pom.xml
|
||||
RUN mvn -f $POM_XML clean package
|
||||
|
||||
#
|
||||
# Package stage
|
||||
#
|
||||
FROM adoptopenjdk/openjdk11:jdk-11.0.9.1_1-alpine-slim
|
||||
COPY --from=build /home/pseudo-schedulator/target/pseudo-schedulator-1.0.0-SNAPSHOT.jar /usr/local/lib/pseudo-schedulator.jar
|
||||
EXPOSE 8081
|
||||
ENTRYPOINT ["java","-jar","/usr/local/lib/pseudo-schedulator.jar"]
|
19
pseudo-schedulator/docker-compose.yml
Normal file
19
pseudo-schedulator/docker-compose.yml
Normal file
@ -0,0 +1,19 @@
|
||||
version: '2.1'
|
||||
services:
|
||||
pseudo-schedulator:
|
||||
image: pseudo-schedulator:1.0.0
|
||||
build: .
|
||||
container_name: pseudo-schedulator
|
||||
hostname: pseudo-schedulator
|
||||
environment:
|
||||
preparation-flow.scheduler.enabled: "false"
|
||||
preparation-flow.scheduler.schedule.cron: "0 0 * * * ?"
|
||||
preparation-flow.ds-provider.mastercard.enabled: "true"
|
||||
preparation-flow.ds-provider.mastercard.message-version: 2.1.0
|
||||
preparation-flow.ds-provider.visa.enabled: "true"
|
||||
preparation-flow.ds-provider.visa.message-version: 2.1.0
|
||||
preparation-flow.ds-provider.mir.enabled: "true"
|
||||
preparation-flow.ds-provider.mir.message-version: 2.1.0
|
||||
client.three-ds-server-storage.url: http://host.docker.internal:8022/three-ds-server-storage/rest/preparation-flow
|
||||
client.three-ds-server-storage.read-timeout: 5000
|
||||
client.three-ds-server-storage.connect-timeout: 5000
|
75
pseudo-schedulator/pom.xml
Normal file
75
pseudo-schedulator/pom.xml
Normal file
@ -0,0 +1,75 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-parent</artifactId>
|
||||
<version>2.3.8.RELEASE</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>pseudo-schedulator</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>pseudo-schedulator</name>
|
||||
<description>pseudo-schedulator</description>
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||
<java.version>11</java.version>
|
||||
<server.port>8082</server.port>
|
||||
<exposed.ports>${server.port}</exposed.ports>
|
||||
<woody.version>1.1.22</woody.version>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<!--rbkmoney-->
|
||||
<dependency>
|
||||
<groupId>com.rbkmoney</groupId>
|
||||
<artifactId>three-ds-server-domain-lib</artifactId>
|
||||
<version>1.2.3</version>
|
||||
</dependency>
|
||||
|
||||
<!--spring-->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.hibernate</groupId>
|
||||
<artifactId>hibernate-validator</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-actuator</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.google.guava</groupId>
|
||||
<artifactId>guava</artifactId>
|
||||
<version>20.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.httpcomponents</groupId>
|
||||
<artifactId>httpclient</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
@ -0,0 +1,24 @@
|
||||
package com.example.demo;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
||||
import static java.util.Arrays.stream;
|
||||
|
||||
@RequiredArgsConstructor
|
||||
public enum DsProvider {
|
||||
|
||||
VISA("visa"),
|
||||
MASTERCARD("mastercard"),
|
||||
MIR("mir");
|
||||
|
||||
@Getter
|
||||
private final String id;
|
||||
|
||||
public static DsProvider of(String providerId) {
|
||||
return stream(DsProvider.values())
|
||||
.filter(p -> p.getId().equals(providerId))
|
||||
.findFirst()
|
||||
.orElseThrow(() -> new IllegalArgumentException("Unknown providerId: " + providerId));
|
||||
}
|
||||
}
|
@ -0,0 +1,82 @@
|
||||
package com.example.demo;
|
||||
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.boot.context.event.ApplicationReadyEvent;
|
||||
import org.springframework.context.event.EventListener;
|
||||
import org.springframework.scheduling.annotation.Scheduled;
|
||||
import org.springframework.web.client.ResourceAccessException;
|
||||
import org.springframework.web.client.RestTemplate;
|
||||
|
||||
@RequiredArgsConstructor
|
||||
@Slf4j
|
||||
public class PreparationFlowCronScheduler {
|
||||
|
||||
private final boolean isEnabledOnSchedule;
|
||||
private final PreparationFlowDsProviderProperties visaProperties;
|
||||
private final PreparationFlowDsProviderProperties mastercardProperties;
|
||||
private final PreparationFlowDsProviderProperties mirProperties;
|
||||
private final RestTemplate restTemplate;
|
||||
private final String url;
|
||||
|
||||
@EventListener(value = ApplicationReadyEvent.class)
|
||||
public void onStartup() {
|
||||
try {
|
||||
updatePreparationFlow();
|
||||
} catch (ResourceAccessException ex) {
|
||||
log.warn("3DSS Storage connection refused at start,", ex);
|
||||
}
|
||||
}
|
||||
|
||||
@Scheduled(cron = "${preparation-flow.scheduler.schedule.cron}")
|
||||
public void onSchedule() {
|
||||
if (isEnabledOnSchedule) {
|
||||
updatePreparationFlow();
|
||||
}
|
||||
}
|
||||
|
||||
private void updatePreparationFlow() {
|
||||
updateJob(
|
||||
visaProperties.isEnabled(),
|
||||
DsProvider.VISA.getId(),
|
||||
visaProperties.getMessageVersion());
|
||||
|
||||
updateJob(
|
||||
mastercardProperties.isEnabled(),
|
||||
DsProvider.MASTERCARD.getId(),
|
||||
mastercardProperties.getMessageVersion());
|
||||
|
||||
updateJob(
|
||||
mirProperties.isEnabled(),
|
||||
DsProvider.MIR.getId(),
|
||||
mirProperties.getMessageVersion());
|
||||
}
|
||||
|
||||
private void updateJob(boolean isEnabled, String dsProviderId, String messageVersion) {
|
||||
if (isEnabled) {
|
||||
initRBKMoneyPreparationFlow(dsProviderId, messageVersion);
|
||||
}
|
||||
}
|
||||
|
||||
private void initRBKMoneyPreparationFlow(String dsProviderId, String messageVersion) {
|
||||
log.info("Init RBKMoney preparation flow, dsProviderId={}", dsProviderId);
|
||||
|
||||
PreparationRequest request = PreparationRequest.builder()
|
||||
.providerId(dsProviderId)
|
||||
.messageVersion(messageVersion)
|
||||
.build();
|
||||
|
||||
restTemplate.postForEntity(url, request, Void.class);
|
||||
}
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
public static class PreparationRequest {
|
||||
|
||||
private String providerId;
|
||||
private String messageVersion;
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
package com.example.demo;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class PreparationFlowDsProviderProperties {
|
||||
|
||||
private boolean enabled;
|
||||
private String messageVersion;
|
||||
|
||||
}
|
@ -0,0 +1,46 @@
|
||||
package com.example.demo;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.web.client.RestTemplate;
|
||||
|
||||
@Configuration
|
||||
public class PreparationFlowScheduleConfig {
|
||||
|
||||
@Bean
|
||||
public PreparationFlowCronScheduler preparationFlowScheduler(
|
||||
@Value("${preparation-flow.scheduler.enabled}") boolean isEnabledOnSchedule,
|
||||
PreparationFlowDsProviderProperties visaPreparationFlowProperties,
|
||||
PreparationFlowDsProviderProperties mastercardPreparationFlowProperties,
|
||||
PreparationFlowDsProviderProperties mirPreparationFlowProperties,
|
||||
RestTemplate restTemplate,
|
||||
@Value("${client.three-ds-server-storage.url}") String url) {
|
||||
return new PreparationFlowCronScheduler(
|
||||
isEnabledOnSchedule,
|
||||
visaPreparationFlowProperties,
|
||||
mastercardPreparationFlowProperties,
|
||||
mirPreparationFlowProperties,
|
||||
restTemplate,
|
||||
url);
|
||||
}
|
||||
|
||||
@Bean
|
||||
@ConfigurationProperties("preparation-flow.ds-provider.visa")
|
||||
public PreparationFlowDsProviderProperties visaPreparationFlowProperties() {
|
||||
return new PreparationFlowDsProviderProperties();
|
||||
}
|
||||
|
||||
@Bean
|
||||
@ConfigurationProperties("preparation-flow.ds-provider.mastercard")
|
||||
public PreparationFlowDsProviderProperties mastercardPreparationFlowProperties() {
|
||||
return new PreparationFlowDsProviderProperties();
|
||||
}
|
||||
|
||||
@Bean
|
||||
@ConfigurationProperties("preparation-flow.ds-provider.mir")
|
||||
public PreparationFlowDsProviderProperties mirPreparationFlowProperties() {
|
||||
return new PreparationFlowDsProviderProperties();
|
||||
}
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
package com.example.demo;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.scheduling.annotation.EnableScheduling;
|
||||
|
||||
@SpringBootApplication
|
||||
@EnableScheduling
|
||||
public class PseudoSchedulatorApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(PseudoSchedulatorApplication.class, args);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
package com.example.demo;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.http.impl.client.HttpClients;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.boot.web.client.RestTemplateBuilder;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
|
||||
import org.springframework.web.client.RestTemplate;
|
||||
|
||||
import java.time.Duration;
|
||||
|
||||
@Configuration
|
||||
@Slf4j
|
||||
public class RestTemplateConfig {
|
||||
|
||||
@Bean
|
||||
public RestTemplate restTemplate(
|
||||
@Value("${client.three-ds-server-storage.read-timeout}") int readTimeout,
|
||||
@Value("${client.three-ds-server-storage.connect-timeout}") int connectTimeout) {
|
||||
return new RestTemplateBuilder()
|
||||
.requestFactory(() -> new HttpComponentsClientHttpRequestFactory(HttpClients.createDefault()))
|
||||
.setConnectTimeout(Duration.ofMillis(connectTimeout))
|
||||
.setReadTimeout(Duration.ofMillis(readTimeout))
|
||||
.build();
|
||||
}
|
||||
}
|
48
pseudo-schedulator/src/main/resources/application.yml
Normal file
48
pseudo-schedulator/src/main/resources/application.yml
Normal file
@ -0,0 +1,48 @@
|
||||
spring:
|
||||
application:
|
||||
name: '@name@'
|
||||
description: '@description@'
|
||||
output:
|
||||
ansi:
|
||||
enabled: always
|
||||
|
||||
management:
|
||||
endpoint:
|
||||
health:
|
||||
show-details: always
|
||||
security:
|
||||
flag: false
|
||||
metrics:
|
||||
export:
|
||||
statsd:
|
||||
flavor: etsy
|
||||
enabled: false
|
||||
|
||||
info:
|
||||
version: '@version@'
|
||||
stage: dev
|
||||
|
||||
server:
|
||||
port: '@server.port@'
|
||||
|
||||
preparation-flow:
|
||||
scheduler:
|
||||
enabled: false
|
||||
schedule:
|
||||
cron: "0 0 * * * ?"
|
||||
ds-provider:
|
||||
mastercard:
|
||||
enabled: true
|
||||
message-version: "2.1.0"
|
||||
visa:
|
||||
enabled: false
|
||||
message-version: "2.1.0"
|
||||
mir:
|
||||
enabled: false
|
||||
message-version: "2.1.0"
|
||||
|
||||
client:
|
||||
three-ds-server-storage:
|
||||
url: http://localhost:8022/three-ds-server-storage/rest/preparation-flow
|
||||
read-timeout: 5000
|
||||
connect-timeout: 5000
|
Loading…
Reference in New Issue
Block a user