From 371e22eee434d3a244adce1b8574019f758f857c Mon Sep 17 00:00:00 2001 From: AKurakin Date: Wed, 11 Jan 2023 11:21:56 +0300 Subject: [PATCH] =?UTF-8?q?reports-service=20=D0=B7=D0=B0=D0=BF=D1=83?= =?UTF-8?q?=D1=81=D0=BA=20=D0=B2=20=D1=80=D0=B5=D0=B6=D0=B8=D0=BC=D0=B5=20?= =?UTF-8?q?=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81=D0=B0=20=D0=B8=20=D0=B2=20?= =?UTF-8?q?=D1=80=D0=B5=D0=B6=D0=B8=D0=BC=D0=B5=20=D1=83=D1=82=D0=B8=D0=BB?= =?UTF-8?q?=D0=B8=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- clearing-parent/readme.md | 35 +++++++++++++++ .../reports/ReportsServiceApplication.java | 36 +++++++++++----- .../reports/config/ReportCmdParser.java | 43 +++++++++++++++++++ .../reports/services/QCommandExecutor.java | 6 ++- .../services/ReportsServiceCommand.java | 3 ++ 5 files changed, 111 insertions(+), 12 deletions(-) create mode 100644 clearing-parent/readme.md create mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/ReportCmdParser.java diff --git a/clearing-parent/readme.md b/clearing-parent/readme.md new file mode 100644 index 000000000..f6eea4353 --- /dev/null +++ b/clearing-parent/readme.md @@ -0,0 +1,35 @@ +report-service +============== + +Сервис для генерации отчётов. + + +Формат xml, docx. + + +Параметры запуска +----------------- + +--spring.config.location= путь к папке с файлом настроек application.properties +--console - признак, что надо запуститься не как сервис, слушающий очередь kafka, а как утилита для генерации отчётов за текущий день/месяц и выключиться. + + +Пример: + + java -jar report-service.jar --spring.config.location=clearing/clearing-parent/reports-service/src/main/resources/ --console + + +Настройки +--------- + +В файле application.properties настройки: + + reports-service.hazelcast.cluster-members=ip адрес(а) кластера imdg, например: 127.0.0.1:5701 + reports-service.hazelcast.login=логин доступа к кластеру + reports-service.hazelcast.password=пароль доступа к кластеру + + reports-service.ReportModuleOut=./report_out - путь к папке для генерации отчётов + + reports-service.kafka-consumer - группа настроек для подключения к очереди kafka + +и другие настройки. \ No newline at end of file diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java index e9c50595f..627e9bbf1 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java @@ -9,7 +9,9 @@ import org.slf4j.LoggerFactory; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.context.ConfigurableApplicationContext; +import ru.spcex.clearing.reports.config.ReportCmdParser; import ru.spcex.clearing.reports.reports.bt_16_5.ReportINACCNT; +import ru.spcex.clearing.reports.services.QCommandExecutor; import ru.spcex.clearing.reports.services.ReportsServiceCommand; import ru.spcex.clearing.reports.services.collector.ReportINACCNT_Collector; import ru.spcex.platform.imdg.api.ImdgProvider; @@ -18,26 +20,37 @@ import ru.spcex.platform.imdg.api.ImdgProvider; public class ReportsServiceApplication { public static void main(String[] args) { try { + ReportCmdParser cmdArgs = new ReportCmdParser(args); + SpringApplicationBuilder builder = new SpringApplicationBuilder(ReportsServiceApplication.class); - builder.run(args); ConfigurableApplicationContext context = builder.run(args); - test(context); - //todo это тест. Переписать код с учётом параметров запуска - как сервис или разово все из командной строки. - ReportsServiceCommand reportCommand = context.getBean(ReportsServiceCommand.class); - reportCommand.writeAllXML(); -// Logger log = LoggerFactory.getLogger(ReportsServiceApplication.class); -// log.info("Shutdown application after work"); -// context.close(); // todo если будет запущен как сервис, сделать выход опционально, по другому. + Logger log = LoggerFactory.getLogger(ReportsServiceApplication.class); + if (cmdArgs.isConsole()) { + log.info("Console mode"); + try { + ReportsServiceCommand reportCommand = context.getBean(ReportsServiceCommand.class); + reportCommand.writeAllXML(); + } finally { + log.info("Shutdown application after work"); + context.close(); + } + } else { + log.info("Service mode"); + QCommandExecutor queueListener = context.getBean(QCommandExecutor.class); + log.trace("QCommandExecutor: {}", queueListener); + } } catch (Throwable e) { LoggerFactory.getLogger(ReportsServiceApplication.class).error("Report-service start failed: {} -> {}", e.getClass().getSimpleName(), ExceptionUtils.getStackTrace(e)); System.exit(-1); } -// ReportsService reportsService = new ReportsService(); -// reportsService.writeXML(); } - +/* для тестирования: + ReportsService reportsService = new ReportsService(); + reportsService.writeXML(); + test(context); + @Deprecated public static void test(ConfigurableApplicationContext context) { ImdgProvider imdg = context.getBean(ImdgProvider.class); @@ -48,4 +61,5 @@ public class ReportsServiceApplication { String out = xStream.toXML(report); System.out.println(out); } + */ } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/ReportCmdParser.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/ReportCmdParser.java new file mode 100644 index 000000000..62bc96299 --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/ReportCmdParser.java @@ -0,0 +1,43 @@ +package ru.spcex.clearing.reports.config; + +/** + * Параметры запуска командной строки. + * + * @see ru.spcex.clearing.reports.config.element.ReportsServiceSettings + */ +public class ReportCmdParser { + protected static final String ARG_CONSOLE = "--console"; + protected static final String ARG_SERVICE = "--service"; + protected boolean console; + protected boolean service; + + public ReportCmdParser(String[] args) { + for (String arg : args) { + if (ARG_CONSOLE.equals(arg)) console = true; + if (ARG_SERVICE.equals(arg)) service = true; + } + } + + public boolean isConsole() { + return console; + } + + public boolean isService() { + return service; + } + + @Override + public String toString() { + return "ReportCmdParser{console=" + console + ", service=" + service + '}'; + } +} + +/* +Вариант парсинга сложных выражений: + + commons-cli + commons-cli + 1.4 + +но сейчас достаточно один параметр проверять + */ \ No newline at end of file diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/QCommandExecutor.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/QCommandExecutor.java index b045e283a..440d1b111 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/QCommandExecutor.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/QCommandExecutor.java @@ -5,6 +5,8 @@ import org.apache.kafka.clients.consumer.Consumer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportWithPeriodRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; @@ -17,6 +19,8 @@ import java.io.IOException; import java.time.LocalDate; import java.util.List; +@Service +@Lazy // требуется получать экземпляр сервиса явно, когда надо его запустить public class QCommandExecutor extends QueueConsumer implements InitializingBean { private static final String QUEUE_RUN_REPORT_COMMAND = "GREP"; // см. Task.createReport private final Logger log = LoggerFactory.getLogger(getClass()); @@ -37,7 +41,7 @@ public class QCommandExecutor extends QueueConsumer implements InitializingBean @Override public void afterPropertiesSet() { - log.debug("Init queue listener {}", getClass().getSimpleName()); + log.info("Init queue listener {}", getClass().getSimpleName()); callback(ReportWithPeriodRequest.class) .setConsumer(this::newReportWithPeriod) .forDestination(Task.createReport.topic(), callbacks::put); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportsServiceCommand.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportsServiceCommand.java index e35ec5587..70016ec12 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportsServiceCommand.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportsServiceCommand.java @@ -106,6 +106,9 @@ public class ReportsServiceCommand implements InitializingBean { File outPath = new File(settings.getReportModuleOut()); XMLReportBuilder reportBuilder = new XMLReportBuilder(reportDataCollector.getReportClass(), outPath); AbstractReport report = reportDataCollector.collectReportWithPeriod(startDate, endDate); + if (report == null) { + throw new NullPointerException("reportDataCollector "+ reportDataCollector +" return null"); + } File reportFile = reportBuilder.createReport(report); if (reportFile != null) { log.debug("New report file done: \"{}\"", reportFile);