События системного журнала#
Настройки отправляемых сообщений указываются в файле /conf/logback.xml.
Отправляемые сообщения имеют формат JSON или XML согласно шаблону, описываемому в файле logback.xml.
В конфигурационном файле logback.xml добавлен appender name="audit-file" для настройки сбора событий Platform V Audit SE в отдельный лог-файл:
<appender name="audit-file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./log/adapter-audit.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- rollover every daily -->
<fileNamePattern>./log/adapter-audit-%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- or whenever the file size reaches 50MB -->
<maxFileSize>50MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{60} %X{sourceThread} - %msg%n</pattern>
</encoder>
</appender>
Логирование включено на следующие классы:
<logger name="ru.sbt.ss.reactive.stream.adapter.audit.AuditService" level="INFO" additivity="false" >
<appender-ref ref="audit-file" />
</logger>
<logger name="ru.sbt.ss.audit" level="INFO" additivity="false" >
<appender-ref ref="audit-file" />
</logger>
Для логирования информации о работе EVTA необходимо в файле logback.xml заполнить блок:
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="file"/>
</root>
В блоке root укажите наименования appenders, в которых описан вывод логов в конкретные места. В данном примере описан вывод логов EVTA в консоль управления EVTA и в файл.
Логирование сообщений#
Для логирования сообщений необходимо:
Настроить шаг обработки сообщения
logв параметреprocessorsконфигурационного файла adapter.conf, подробнее в документе Руководство оператора в разделе Настройки конфигурационного файла adapter.conf, подраздел Валидация сообщений и настройка логирования.Заполнить файл logback.xml необходимыми настройками логирования и поместить его в директорию
confперед запуском установки EVTA. Примеры заполненных файлов logback.xml приведены ниже в данном разделе.Определить в файле logback.xml, куда будет производиться отправка сообщений. Для этого необходимо заполнить блок настроек:
<logger name="ru.sbt.ss.reactive.stream.transformers.logging.MessageLogger" level="info" additivity="false" >
<appender-ref ref="GateLogger"/>
<appender-ref ref="STDOUT"/>
<appender-ref ref="file"/>
</logger>
В данном примере логирование сообщений, проходящих через EVTA, задано в три приемника:
<appender-ref ref="GateLogger"/>– логирование в централизованную систему журналирования;<appender-ref ref="STDOUT"/>– логирование в консоль управления EVTA;<appender-ref ref="file"/>– логирование в файл.
Прописать настройки логирования в конфигурационном файле vars.yml:
4.1 Перед установкой (переустановкой) новой версии EVTA необходимо заполнить блок:
logging:
logback:
level: info # Дефолтный уровень логирования
loggers:
- name: "ru.sbt.cep"
level: info
- name: "org.apache.kafka"
level: warn
- name: "com.typesafe.akka"
level: info
kafka: # Отправление логи в топик Kafka
enabled: false # Включение функциональности отправки логов в топик Kafka
retries: 3 # Количество переиницилизаций producer
interval: 1000 # Интервал между переиницилизациями
multiplier: 1 # Множитель интервала переинициализации
## Необязательные поля, если logging.kafka.enabled: false
# preset_name: kafka_fpss # Название пресета для отправки логов в топик Kafka
# topic: logstash # Наименование топика
4.2 Также необходимо указать абсолютный путь до логов в параметрах:
logdir: /evta_logs # Абсолютный путь на конечном сервере до логов приложения
logdir_audit: /evta_logs # Абсолютный путь на конечном сервере до логов аудита (по умолчанию равен logdir)
4.3 Можно указать дополнительную информацию о логах:
log_size_cap: 50MB # максимальный размер лога
log_history: 3 # время в днях для хранения логов
log_total_size_cap: 2GB # Необязательно, общий размер всех архивных файлов, если не задано, то бесконечно
4.4 Для дополнительного логирования в формате JSON добавить блок log:
# Дополнительное логирование обработки сообщения
log:
eventIdHeader: JMSMessageID # заголовок, значение которого будет браться из сообщения для поля eventId лога
consumerLogEnabled: false # логирование вычитки сообщения, по умолчанию false
producerLogEnabled: false # логирование публикации сообщения, по умолчанию false
processorsLogEnabled: false # логирование результатов работы процессоров сообщения (например, валидации), по умолчанию false
deadLetterLogEnabled: false # логирование отправки сообщения в deadLetter, по умолчанию false
Сообщения логируются в формате JSON и состоят из следующих полей:
{
timestamp: "Время лога в формате UNIX",
eventId: "Значение заголовка eventIdHeader сообщения, или значение ключа, если eventIdHeader не задан в конфигурации",
source: "Для Platform V Corax / Apache Kafka - топик, из которой вычитали сообщение; для реббита, Artemis и ibmMQ - очередь, из которой вычитали сообщение; для rest/grpc - способ подключения (rest/grpc соответственно)",
target: "Для Platform V Corax / Apache Kafka - топик, в который публикуем сообщение; для реббита - exchange, в который публикуем сообщение; для Artemis и ibmMQ - очередь, в которую публикуем сообщение; для rest/grpc - способ подключения (rest/grpc соответственно)",
status: "Success или error",
message: "При значении поля status равному success - в данном поле сообщение об успешно выполненном этапе, при значении поля status равному error - сообщение об ошибке"
}
Пример полученного лога:
17:00:34.668 [adapter-work-thread-1] INFO r.s.s.r.stream.log.LoggerService - {"timestamp":1687183234667,"eventId":1,"source":"inputTopicKk","target":null,"status":"success","message":"success receive"}
17:00:34.693 [adapter-work-thread-1] INFO r.s.s.r.stream.log.LoggerService - {"timestamp":1687183234693,"eventId":1,"source":"inputTopicKk","target":null,"status":"error","message":"Error validate message: Message doesnt match schema '/Users/17314736/Documents/forks/reactive-stream-adapter/reactive-stream-core/src/test/resources/json/schema_first.json':\n$.name: is missing but it is required\n$.doc: is missing but it is required\n$.fields: is missing but it is required\n$.test: is not defined in the schema and the schema does not allow additional properties\n"}
16:54:55.354 [adapter-work-thread-1] INFO r.s.s.r.stream.log.LoggerService - {"timestamp":1687269295354,"eventId":1,"source":"inputTopicKk","target":"deadLetter","status":"error","message":"Cannot send message to dead letter topic: org.apache.kafka.common.errors.TopicAuthorizationException: Not authorized to access topics: [deadLetter]"}
Пример файла logback.xml:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- Экранирование символа доллара -->
<property scope="context" name="dollar" value="$" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{60} %X{sourceThread} - %msg%n</pattern>
</encoder>
</appender>
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./log/adapter.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- rollover every daily -->
<fileNamePattern>./log/adapter-%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- or whenever the file size reaches 50MB -->
<maxFileSize>50MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{60} %X{sourceThread} - %msg%n</pattern>
</encoder>
</appender>
<appender name="audit-file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./log/adapter-audit.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- rollover every daily -->
<fileNamePattern>./log/adapter-audit-%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- or whenever the file size reaches 50MB -->
<maxFileSize>50MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{60} %X{sourceThread} - %msg%n</pattern>
</encoder>
</appender>
<logger name="ru.sbt.ss" level="info" additivity="false" >
<appender-ref ref="file" />
</logger>
<logger name="ru.sbt.ss.reactive.stream.adapter.audit.AuditService" level="INFO" additivity="false" >
<appender-ref ref="audit-file" />
</logger>
<logger name="ru.sbt.ss.audit" level="INFO" additivity="false" >
<appender-ref ref="audit-file" />
</logger>
<logger name="ru.sbt.cep" level="info" additivity="false" >
<appender-ref ref="file" />
</logger>
<logger name="org.apache.kafka" level="warn" additivity="false" >
<appender-ref ref="file" />
</logger>
<logger name="com.typesafe.akka" level="info" additivity="false" >
<appender-ref ref="file" />
</logger>
<root level="info">
<appender-ref ref="file" />
</root>
</configuration>
Пример конфигурации логирования в системный вывод#
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- <pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{60} %X{sourceThread} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
Логирование в централизованную систему журналирования Platform V Monitor (LOGA)#
Для EVTA может быть настроена отправка системных журналов в централизованную систему журналирования Platform V Monitor.
Предварительно необходимо выполнить следующие действия:
узнать адреса брокеров Platform V Corax / Apache Kafka централизованной системы журналирования Platform V Monitor;
узнать названия topics централизованной системы журналирования Platform V Monitor, куда будут отправляться журналы EVTA;
выпустить сертификат подключения к Platform V Corax / Apache Kafka централизованной системы журналирования Platform V Monitor.
При заполнении файла logback.xml стоит обратить внимание на заполнение следующих параметров блокa appender GateLogger:
Параметр |
Описание |
Значение по умолчанию |
|---|---|---|
|
Тип сообщения. Доступные значения: XML или JSON |
JSON |
|
путь до rquid (case sensitive) в логируемых сообщениях xpath (//rqUID) или jsonpath ($…rqUID) |
$…rqUID |
|
Константа для поля «from» в сообщении лога. Доступные значения: artemis, ibm_mq, grpc или rest |
|
|
Константа для поля «to» в сообщении лога. Доступные значения: artemis, ibm_mq, grpc или rest |
|
|
Имя topic записи сообщений логов |
|
|
Идентификатор продьюсера Platform V Corax / Apache Kafka, по которому можно однозначно идентифицировать продьюсера Platform V Corax / Apache Kafka |
пусто |
|
Объявление провайдера шифрования паролей. Значение не изменять |
decode |
|
Класс провайдера шифрования паролей. Значение не изменять |
|
|
Путь до файла, содержащего ключ шифрования паролей |
|
|
Класс шифрования паролей. Значение не изменять |
|
|
Тип протокола подключения к системе журналирования |
SSL |
|
Проверка сертификата на соответствия hostname |
|
|
Расположение файла keystore |
|
|
Расположение файла truststore |
|
|
Пароль keystore в зашифрованном виде |
|
|
Пароль truststore в зашифрованном виде |
|
|
Ключ шифрования паролей в зашифрованном виде |
|
|
Сервера подключения к системе журналирования |
host:port,host:port |
Для настройки отправки сообщений в централизованную систему журналирования Platform V Monitor необходимо заполнить блок appender GateLogger файла logback.xml:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- <pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{60} %X{sourceThread} - %msg%n</pattern>
</encoder>
</appender>
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./log/adapter.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- rollover every daily -->
<fileNamePattern>./log/adapter-%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- or whenever the file size reaches 50MB -->
<maxFileSize>50MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>5</maxHistory>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
<!-- <totalSizeCap>2GB</totalSizeCap> -->
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{60} %X{sourceThread} - %msg%n</pattern>
</encoder>
</appender>
<appender name="GateLogger" class="com.github.danielwegener.logback.kafka.KafkaAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="ru.sbt.synapse.logback.FpjLayout">
<bodyType>json</bodyType> <!-- указываем тип сообщения xml или json -->
<rqUIDPath>$..rqUID</rqUIDPath> <!-- указываем путь до rquid (case sensitive) в логируемых сообщениях xpath (//rqUID) или jsonpath ($..rqUID) -->
<from>rest</from> <!-- константа для поля "from" в сообщении лога -->
<to>kafka</to> <!-- константа для поля "to" в сообщении лога -->
</layout>
</encoder>
<deliveryStrategy class="com.github.danielwegener.logback.kafka.delivery.AsynchronousDeliveryStrategy"/>
<topic>LOGGER.REST</topic>
<producerConfig>client.id=test-noetcd-auth</producerConfig>
<producerConfig>config.providers=decode</producerConfig>
<producerConfig>config.providers.decode.class=ru.sbt.ss.kafka.DecryptionConfigProvider</producerConfig>
<producerConfig>config.providers.decode.param.security.encoding.key=./ssl/secret.pass</producerConfig>
<producerConfig>config.providers.decode.param.security.encoding.class=ru.sbt.ss.password.DefaultEncoder</producerConfig>
<producerConfig>security.protocol=SSL</producerConfig>
<producerConfig>ssl.endpoint.identification.algorithm=</producerConfig>
<producerConfig>ssl.keystore.location=ssl/event-discovery.jks</producerConfig>
<producerConfig>ssl.truststore.location=ssl/event-discovery.jks</producerConfig>
<producerConfig>ssl.keystore.password=${dollar}{decode:xxx}</producerConfig>
<producerConfig>ssl.truststore.password=${dollar}{decode:yyy}</producerConfig>
<producerConfig>ssl.key.password=${dollar}{decode:zzz}</producerConfig>
<producerConfig>bootstrap.servers=host:port,host:port</producerConfig>
<appender-ref ref="STDOUT"/>
</appender>
<appender name="ASYNC-GateLogger" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="GateLogger"/>
<discardingThreshold>0</discardingThreshold>
<queueSize>512</queueSize>
</appender>
<logger name="ru.sbt.ss.reactive.stream.transformers.logging.MessageLogger" level="info" additivity="false" >
<appender-ref ref="ASYNC-GateLogger"/>
<appender-ref ref="STDOUT"/>
<appender-ref ref="file"/>
</logger>
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="file"/>
</root>
</configuration>
Также необходимо прописать настройки логирования в конфигурационном файле vars.yml в блоке logback. Пример заполнения и детали указаны выше в данном разделе в подразделе «Логирование сообщений».
Наиболее часто встречающиеся события типа ERROR:#
Неверный пароль от хранилища (значение
ssl.keystore.password):
2023-05-31 12:53:10.214 [nioEventLoopGroup-3-1] ERROR ru.sbt.ss.reactive.stream.rest.handlers.PublishServerHandler - Failure create subscriber from configuration, Error message: ru.sbt.ss.reactive.stream.adapter.config.ReactiveStreamConfigException: java.lang.IllegalArgumentException: Password decode error in key ssl.keystore.password
ru.sbt.ss.reactive.stream.rest.utils.RestException: ru.sbt.ss.reactive.stream.adapter.config.ReactiveStreamConfigException: java.lang.IllegalArgumentException: Password decode error in key ssl.keystore.password
at ru.sbt.ss.reactive.stream.rest.utils.HandlerUtils.createSubscriberFromConfig(HandlerUtils.java:83)
at ru.sbt.ss.reactive.stream.rest.handlers.PublishServerHandler.createSubscriber(PublishServerHandler.java:193)
at ru.sbt.ss.reactive.stream.rest.handlers.PublishServerHandler.channelRead0(PublishServerHandler.java:93)
at ru.sbt.ss.reactive.stream.rest.handlers.PublishServerHandler.channelRead0(PublishServerHandler.java:34)
at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:346)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:318)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: ru.sbt.ss.reactive.stream.adapter.config.ReactiveStreamConfigException: java.lang.IllegalArgumentException: Password decode error in key ssl.keystore.password
at ru.sbt.ss.reactive.stream.adapter.AdapterReactiveFactory.createSubscriber(AdapterReactiveFactory.java:175)
at ru.sbt.ss.reactive.stream.rest.utils.HandlerUtils.createSubscriberFromConfig(HandlerUtils.java:80)
... 29 common frames omitted
Caused by: java.lang.IllegalArgumentException: Password decode error in key ssl.keystore.password
at ru.sbt.ss.reactive.stream.adapter.config.VaultHelper.decode(VaultHelper.java:65)
at ru.sbt.ss.reactive.stream.adapter.AdapterReactiveFactory.createSubscriber(AdapterReactiveFactory.java:169)
... 30 common frames omitted
Caused by: ru.sbt.ss.password.ConfigKeyDecryptionException: org.jasypt.exceptions.EncryptionOperationNotPossibleException
at ru.sbt.ss.password.ConfigDecryptor.decrypt(ConfigDecryptor.java:50)
at ru.sbt.ss.reactive.stream.adapter.config.VaultHelper.decode(VaultHelper.java:62)
... 31 common frames omitted
Caused by: org.jasypt.exceptions.EncryptionOperationNotPossibleException: null
at org.jasypt.encryption.pbe.StandardPBEByteEncryptor.decrypt(StandardPBEByteEncryptor.java:1169)
at org.jasypt.encryption.pbe.StandardPBEStringEncryptor.decrypt(StandardPBEStringEncryptor.java:738)
at ru.sbt.ss.password.CustomTextEncryptor.decrypt(CustomTextEncryptor.java:43)
at ru.sbt.ss.password.BaseEncryptor.decrypt(BaseEncryptor.java:93)
at ru.sbt.ss.password.ConfigDecryptor.decrypt(ConfigDecryptor.java:48)
... 32 common frames omitted
Неверный пароль от ключа в хранилище (значение
ssl.key.password):
2023-05-31 12:59:16.285 [nioEventLoopGroup-3-1] ERROR ru.sbt.ss.reactive.stream.rest.handlers.PublishServerHandler - Failure create subscriber from configuration, Error message: ru.sbt.ss.reactive.stream.adapter.config.ReactiveStreamConfigException: java.lang.IllegalArgumentException: Password decode error in key ssl.key.password
ru.sbt.ss.reactive.stream.rest.utils.RestException: ru.sbt.ss.reactive.stream.adapter.config.ReactiveStreamConfigException: java.lang.IllegalArgumentException: Password decode error in key ssl.key.password
at ru.sbt.ss.reactive.stream.rest.utils.HandlerUtils.createSubscriberFromConfig(HandlerUtils.java:83)
at ru.sbt.ss.reactive.stream.rest.handlers.PublishServerHandler.createSubscriber(PublishServerHandler.java:193)
at ru.sbt.ss.reactive.stream.rest.handlers.PublishServerHandler.channelRead0(PublishServerHandler.java:93)
at ru.sbt.ss.reactive.stream.rest.handlers.PublishServerHandler.channelRead0(PublishServerHandler.java:34)
at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:346)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:318)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: ru.sbt.ss.reactive.stream.adapter.config.ReactiveStreamConfigException: java.lang.IllegalArgumentException: Password decode error in key ssl.key.password
at ru.sbt.ss.reactive.stream.adapter.AdapterReactiveFactory.createSubscriber(AdapterReactiveFactory.java:175)
at ru.sbt.ss.reactive.stream.rest.utils.HandlerUtils.createSubscriberFromConfig(HandlerUtils.java:80)
... 29 common frames omitted
Caused by: java.lang.IllegalArgumentException: Password decode error in key ssl.key.password
at ru.sbt.ss.reactive.stream.adapter.config.VaultHelper.decode(VaultHelper.java:65)
at ru.sbt.ss.reactive.stream.adapter.AdapterReactiveFactory.createSubscriber(AdapterReactiveFactory.java:169)
... 30 common frames omitted
Caused by: ru.sbt.ss.password.ConfigKeyDecryptionException: org.jasypt.exceptions.EncryptionOperationNotPossibleException
at ru.sbt.ss.password.ConfigDecryptor.decrypt(ConfigDecryptor.java:50)
at ru.sbt.ss.reactive.stream.adapter.config.VaultHelper.decode(VaultHelper.java:62)
... 31 common frames omitted
Caused by: org.jasypt.exceptions.EncryptionOperationNotPossibleException: null
at org.jasypt.encryption.pbe.StandardPBEByteEncryptor.decrypt(StandardPBEByteEncryptor.java:1169)
at org.jasypt.encryption.pbe.StandardPBEStringEncryptor.decrypt(StandardPBEStringEncryptor.java:738)
at ru.sbt.ss.password.CustomTextEncryptor.decrypt(CustomTextEncryptor.java:43)
at ru.sbt.ss.password.BaseEncryptor.decrypt(BaseEncryptor.java:93)
at ru.sbt.ss.password.ConfigDecryptor.decrypt(ConfigDecryptor.java:48)
... 32 common frames omitted
Ошибка при указании одного и того же порта на publish и subscribe:
2023-05-31 13:13:17.611 [main] ERROR ru.sbt.ss.reactive.stream.adapter.AdapterApplication - Adapter fail 2 retry java.net.BindException: Address already in use
java.util.concurrent.ExecutionException: java.net.BindException: Address already in use
at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:122)
at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:205)
at ru.sbt.ss.reactive.stream.rest.SubscribeRestServer.run(SubscribeRestServer.java:55)
at ru.sbt.ss.reactive.stream.adapter.egress.EgressApplicationStarter.startApplication(EgressApplicationStarter.java:124)
at ru.sbt.ss.reactive.stream.adapter.AdapterApplication.run(AdapterApplication.java:81)
at ru.sbt.ss.reactive.stream.adapter.egress.EgressMain.main(EgressMain.java:11)
Caused by: java.net.BindException: Address already in use
at java.base/sun.nio.ch.Net.bind0(Native Method)
at java.base/sun.nio.ch.Net.bind(Net.java:459)
at java.base/sun.nio.ch.Net.bind(Net.java:448)
at java.base/sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:227)
at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:141)
at io.netty.channel.AbstractChannel$AbstractUnsafe.bind(AbstractChannel.java:562)
at io.netty.channel.DefaultChannelPipeline$HeadContext.bind(DefaultChannelPipeline.java:1334)
at io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:600)
at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:579)
at io.netty.handler.logging.LoggingHandler.bind(LoggingHandler.java:230)
at io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:602)
at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:579)
at io.netty.channel.DefaultChannelPipeline.bind(DefaultChannelPipeline.java:973)
at io.netty.channel.AbstractChannel.bind(AbstractChannel.java:260)
at io.netty.bootstrap.AbstractBootstrap$2.run(AbstractBootstrap.java:356)
at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:829)