diff --git a/clearing-parent/default-management/pom.xml b/clearing-parent/default-management/pom.xml new file mode 100644 index 000000000..bade73631 --- /dev/null +++ b/clearing-parent/default-management/pom.xml @@ -0,0 +1,116 @@ + + + 4.0.0 + + ru.spcex.clearing + clearing-parent + SPCEX-3.22.285 + + + default-management + + + 17 + 17 + UTF-8 + + + + + ru.spcex.platform + platform-messaging + + + ru.spcex.platform + platform-imdg-api-hazelcast-impl + + + ru.spcex.clearing + security-util + + + ru.spcex.clearing + classes + + + ru.spcex.platform + platform-enum + + + ru.spcex.clearing + clearing-validation + + + org.springframework.boot + spring-boot-starter + + + com.fasterxml.jackson.core + jackson-databind + + + + net.logstash.logback + logstash-logback-encoder + 7.0.1 + + + org.springframework.boot + spring-boot-starter-test + test + + + ru.spcex.clearing + test-clearing + test + + + + + + + src/main/resources + + application.properties + + false + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + ${project.artifactId} + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.21.0 + + + org.junit.platform + junit-platform-surefire-provider + 1.2.0-M1 + + + org.junit.jupiter + junit-jupiter-engine + 5.2.0-M1 + + + + + + + \ No newline at end of file diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/DefaultManagementApplication.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/DefaultManagementApplication.java new file mode 100644 index 000000000..5da314b50 --- /dev/null +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/DefaultManagementApplication.java @@ -0,0 +1,12 @@ +package ru.spcex.clearing.dflt.management; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class DefaultManagementApplication { + public static void main(String[] args) { + SpringApplication app = new SpringApplication(DefaultManagementApplication.class); + app.run(args); + } +} diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/config/AppConfig.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/config/AppConfig.java new file mode 100644 index 000000000..95da03020 --- /dev/null +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/config/AppConfig.java @@ -0,0 +1,65 @@ +package ru.spcex.clearing.dflt.management.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import ru.spcex.clearing.dflt.management.config.settings.DefaultManagementSettings; +import ru.spcex.clearing.dflt.management.error.DefaultManagementErrors; +import ru.spcex.clearing.util.security.UserRoleVerification; +import ru.spcex.clearing.util.services.IMDGMessageResolver; +import ru.spcex.platform.enumeration.UserRole; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; +import ru.spcex.platform.utils.enumeration.IMessageResolver; + +@Configuration +public class AppConfig { + + private static ThreadPoolTaskExecutor createThreadPoolTaskExecutor(int maxPoolSz, boolean waitForCompletion) { + ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor(); + if (maxPoolSz > 2) { + pool.setKeepAliveSeconds(60); + pool.setAllowCoreThreadTimeOut(true); + } + pool.setCorePoolSize(maxPoolSz); + pool.setWaitForTasksToCompleteOnShutdown(waitForCompletion); + return pool; + } + + @Bean(name = "taskExecutorHazelcastClientInitializer") + public ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer() { + return createThreadPoolTaskExecutor(1, true); + } + + @Bean(name = "taskExecutorIdGeneratorAwaiter") + public ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter() { + return createThreadPoolTaskExecutor(1, false); + } + + @Autowired + @Bean + public ImdgProvider imdgProvider( + @Qualifier("taskExecutorHazelcastClientInitializer") ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer, + @Qualifier("taskExecutorIdGeneratorAwaiter") ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter, + DefaultManagementSettings settings + ) { + return new HazelcastService(taskExecutorHazelcastClientInitializer, + taskExecutorIdGeneratorAwaiter, + settings.getHazelcast()); + } + + @Bean + @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) + public UserRoleVerification userRoleVerification(ImdgProvider imdgProvider, IMessageResolver messageResolver) { + return new UserRoleVerification(imdgProvider, messageResolver, UserRole.Admin, DefaultManagementErrors.UserVerifyDenial); + } + + @Bean + public IMessageResolver messageResolver(ImdgProvider imdgProvider) { + return new IMDGMessageResolver(imdgProvider); + } +} diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/config/KafkaConfig.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/config/KafkaConfig.java new file mode 100644 index 000000000..d0ab04543 --- /dev/null +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/config/KafkaConfig.java @@ -0,0 +1,65 @@ +package ru.spcex.clearing.dflt.management.config; + +import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.producer.Producer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.kafka.core.ProducerFactory; +import ru.spcex.clearing.dflt.management.config.settings.DefaultManagementSettings; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.config.KafkaConsumerFactory; +import ru.spcex.clearing.platform.messaging.config.KafkaProducerFactory; +import ru.spcex.clearing.platform.messaging.config.element.KafkaProducerSettings; +import ru.spcex.clearing.platform.messaging.service.RequestInfo; +import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgId; +import ru.spcex.platform.imdg.api.ImdgProvider; + +@Configuration +public class KafkaConfig { + @Autowired + @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) + @Bean("kafkaConsumer") + public Consumer createConsumer(DefaultManagementSettings settings) { + return KafkaConsumerFactory.consumer(settings.getKafkaConsumer()); + } + + @Autowired + @Bean("kafkaProducer") + public Producer createProducer(DefaultManagementSettings settings) { + return KafkaProducerFactory.producer(settings.getKafkaProducer()); + } + + @Bean + public ProducerFactory pf(DefaultManagementSettings settings) { + KafkaProducerSettings kafkaSettings = settings.getKafkaProducer(); + return KafkaProducerFactory.producerFactory(kafkaSettings); + } + + @Bean("kafkaTemplate") + public KafkaTemplate kafkaTemplate(ProducerFactory pf) { + return new KafkaTemplate<>(pf); + } + + @Autowired + @Bean + public KafkaSender kafkaSender(KafkaTemplate kafkaTemplate, + ImdgProvider imdgProvider) { + ImdgId imdgIdGenerator = imdgProvider.getImdgIdGenerator(); + return KafkaSender + .setup() + .setKafkaTemplate(kafkaTemplate) + .idGenerator(imdgIdGenerator::nextId) + .imdgProvider(s -> { + Imdg imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_RequestInfo, RequestInfo.class); + return imdg::insert; + }) + .build(); + } + +} diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/config/settings/DefaultManagementSettings.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/config/settings/DefaultManagementSettings.java new file mode 100644 index 000000000..c01590b6b --- /dev/null +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/config/settings/DefaultManagementSettings.java @@ -0,0 +1,41 @@ +package ru.spcex.clearing.dflt.management.config.settings; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.PropertySource; +import org.springframework.stereotype.Component; +import ru.spcex.clearing.platform.messaging.config.element.KafkaConsumerSettings; +import ru.spcex.clearing.platform.messaging.config.element.KafkaProducerSettings; +import ru.spcex.platform.imdg.iml.hazelcast.config.HazelcastClientParams; + +@Component +@PropertySource("file:${spring.config.location}/application.properties") +@ConfigurationProperties("default-management") +public class DefaultManagementSettings { + private HazelcastClientParams hazelcast; + private KafkaConsumerSettings kafkaConsumer; + private KafkaProducerSettings kafkaProducer; + + public HazelcastClientParams getHazelcast() { + return hazelcast; + } + + public void setHazelcast(HazelcastClientParams hazelcast) { + this.hazelcast = hazelcast; + } + + public KafkaConsumerSettings getKafkaConsumer() { + return kafkaConsumer; + } + + public void setKafkaConsumer(KafkaConsumerSettings kafkaConsumer) { + this.kafkaConsumer = kafkaConsumer; + } + + public KafkaProducerSettings getKafkaProducer() { + return kafkaProducer; + } + + public void setKafkaProducer(KafkaProducerSettings kafkaProducer) { + this.kafkaProducer = kafkaProducer; + } +} diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/error/DefaultManagementErrors.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/error/DefaultManagementErrors.java new file mode 100644 index 000000000..fdc0f1a7e --- /dev/null +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/error/DefaultManagementErrors.java @@ -0,0 +1,19 @@ +package ru.spcex.clearing.dflt.management.error; + +import ru.spcex.platform.utils.enumeration.IErrorEnumId; + +public enum DefaultManagementErrors implements IErrorEnumId { + + //todo уточнить порядковый номер ошибки модуля + GeneralError(3000L), // Общая ошибка модуля + UserVerifyDenial(3001L); // 'Нет прав на проведение данной операции + + private final Long id; + DefaultManagementErrors(Long id) { + this.id = id; + } + @Override + public Long getId() { + return this.id; + } +} diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/listener/OvernightSettingsListener.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/listener/OvernightSettingsListener.java new file mode 100644 index 000000000..471dcb2e3 --- /dev/null +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/listener/OvernightSettingsListener.java @@ -0,0 +1,43 @@ +package ru.spcex.clearing.dflt.management.listener; + +import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.producer.Producer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import ru.spcex.clearing.platform.messaging.domain.BaseRequest; +import ru.spcex.clearing.platform.messaging.domain.Consts; +import ru.spcex.clearing.platform.messaging.domain.cud.misc.OvernightSettingsNewRequest; +import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; +import ru.spcex.clearing.util.security.UserRoleVerification; +import ru.spcex.platform.imdg.api.ImdgProvider; + +@Service +public class OvernightSettingsListener extends QueueConsumer implements InitializingBean { + protected final Logger log = LoggerFactory.getLogger(getClass()); + protected ImdgProvider imdgProvider; + + @Autowired + public OvernightSettingsListener(Consumer kafkaQueue, + Producer kafkaProducer, + ImdgProvider imdgProvider, + UserRoleVerification userRoleVerification) { + super(kafkaQueue, kafkaProducer); + this.imdgProvider = imdgProvider; + } + + @Override + public void afterPropertiesSet() { + callback(OvernightSettingsNewRequest.class) + .setFunction(this::processNewReq) + .forDestination(Consts.OVERNIGHT_SETTINGS_NEW, callbacks::put); + init(); + } + + private RequestInfoUpdate processNewReq(BaseRequest newReq) { + return null; + } +} diff --git a/clearing-parent/default-management/src/main/resources/application.properties b/clearing-parent/default-management/src/main/resources/application.properties new file mode 100644 index 000000000..c5e939da0 --- /dev/null +++ b/clearing-parent/default-management/src/main/resources/application.properties @@ -0,0 +1,19 @@ +spring.main.web-application-type=none +default-management.hazelcast.cluster-members=127.0.0.1:5701 +default-management.hazelcast.login=dev +default-management.hazelcast.password=dev-pass + +default-management.kafka-consumer.bootstrap-servers=localhost:9092 +default-management.kafka-consumer.group-id=dev-group-company-service +default-management.kafka-consumer.enable-auto-commit=true +default-management.kafka-consumer.session-timeout-ms=30000 +default-management.kafka-consumer.auto-offset-reset=latest +default-management.kafka-consumer.linger-ms=1 +default-management.kafka-consumer.buffer-memory=33554432 + +default-management.kafka-producer.bootstrap-servers=localhost:9092 +default-management.kafka-producer.acks=all +default-management.kafka-producer.retries=0 +default-management.kafka-producer.batch-size=16384 +default-management.kafka-producer.linger-ms=1 +default-management.kafka-producer.buffer-memory=33554432 \ No newline at end of file diff --git a/clearing-parent/default-management/src/main/resources/logback.xml b/clearing-parent/default-management/src/main/resources/logback.xml new file mode 100644 index 000000000..9a2178d7d --- /dev/null +++ b/clearing-parent/default-management/src/main/resources/logback.xml @@ -0,0 +1,56 @@ + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + utf-8 + + + + + ${LOG_PATH}/${FILE_NAME}-text.log + + + ${FILE_LOG_PATTERN} + utf8 + + + ${LOG_PATH}/${FILE_NAME}-text.%d{yyyy-MM-dd}.%i.gz + + + 100MB + + 10 + + + + + ${LOG_PATH}/${FILE_NAME}-json.log + + + ${LOG_PATH}/${FILE_NAME}-json.%d{yyyy-MM-dd}.%i.gz + + + 100MB + + 10 + + + + + + + + + + + + + + + diff --git a/clearing-parent/pom.xml b/clearing-parent/pom.xml index 67574b778..cfce19672 100644 --- a/clearing-parent/pom.xml +++ b/clearing-parent/pom.xml @@ -46,6 +46,7 @@ imdg-hist xml-importer xml-exporter + default-management diff --git a/pom.xml b/pom.xml index bed27883a..a5cffc923 100644 --- a/pom.xml +++ b/pom.xml @@ -56,7 +56,7 @@ ${folder_root_clearing}/clearing-parent/gateway-api ${folder_root_clearing}/clearing-parent/xml-exporter ${folder_root_clearing}/clearing-parent/xml-importer - ${folder_root_clearing}/clearing-parent/fix-service + ${folder_root_clearing}/clearing-parent/default-management 3.12.4 1.7.33 diff --git a/z-distr/pom.xml b/z-distr/pom.xml index e4cba9c61..7081bd7f6 100644 --- a/z-distr/pom.xml +++ b/z-distr/pom.xml @@ -641,6 +641,29 @@ + + copy-df-management-service-bin + prepare-package + + copy + + + + + ${folder_root_df-management}/target/default-management.jar + ${folder.clearing.distr.bin}/default-management.jar + + + ${folder_root_df-management}/target/default-management.jar + ${folder.clearing.distr.services}/default-management/default-management.jar + + + ${folder_root_df-management}/src/main/resources/application.properties + ${folder.clearing.distr.settings}/default-management/application.properties + + + + diff --git a/z-distr/src/main/resources/distr/sh/default-management.sh b/z-distr/src/main/resources/distr/sh/default-management.sh new file mode 100644 index 000000000..8bb01b95a --- /dev/null +++ b/z-distr/src/main/resources/distr/sh/default-management.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +CLEARING_HOME=/opt/mfd/clearing/ +cd $CLEARING_HOME/bin + +CMD="java -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=6044 -jar default-management.jar --spring.config.location=$CLEARING_HOME/settings/default-management/" + +$CMD >/dev/null 2>&1 & + diff --git a/z-distr/src/main/resources/distr/sh/kill_all.sh b/z-distr/src/main/resources/distr/sh/kill_all.sh index ddda9a827..e8137e457 100644 --- a/z-distr/src/main/resources/distr/sh/kill_all.sh +++ b/z-distr/src/main/resources/distr/sh/kill_all.sh @@ -22,4 +22,5 @@ kill -9 $(ps -ef | grep java | grep swt-importer.jar | awk '{print $2}') kill -9 $(ps -ef | grep java | grep gateway-api.jar | awk '{print $2}') kill -9 $(ps -ef | grep java | grep xml-exporter.jar | awk '{print $2}') kill -9 $(ps -ef | grep java | grep xml-importer.jar | awk '{print $2}') -kill -9 $(ps -ef | grep java | grep fix-service.jar | awk '{print $2}') \ No newline at end of file +kill -9 $(ps -ef | grep java | grep fix-service.jar | awk '{print $2}') +kill -9 $(ps -ef | grep java | grep default-management.jar | awk '{print $2}') \ No newline at end of file diff --git a/z-distr/src/main/resources/distr/sh/launch_all.sh b/z-distr/src/main/resources/distr/sh/launch_all.sh index 2eba4b277..89152ed3d 100644 --- a/z-distr/src/main/resources/distr/sh/launch_all.sh +++ b/z-distr/src/main/resources/distr/sh/launch_all.sh @@ -23,3 +23,4 @@ cd /opt/mfd/clearing/bin /opt/mfd/clearing/bin/xml-exporter.sh /opt/mfd/clearing/bin/xml-importer.sh /opt/mfd/clearing/bin/fix-service.sh +/opt/mfd/clearing/bin/default-management.sh