Merge branch 'dev' into cls-271

# Conflicts:
#	platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java
This commit is contained in:
akulikov 2023-05-04 12:03:41 +03:00
commit b60f046a8c
37 changed files with 171 additions and 111 deletions

View file

@ -9,13 +9,13 @@ import ru.spcex.clearing.util.security.UserRoleVerification;
import ru.spcex.platform.enumeration.UserRole;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.enumeration.SimpleMessageResolver;
import ru.spcex.clearing.util.services.IMDGMessageResolver;
@Configuration
public class BeanConfiguration {
@Bean
public IMessageResolver messageResolver() {
return new SimpleMessageResolver();
public IMessageResolver messageResolver(ImdgProvider imdgProvider) {
return new IMDGMessageResolver(imdgProvider);
}
@Bean

View file

@ -77,11 +77,6 @@ public class AccountValidationConfig {
if (statusValue == null || AccountStatus.ACTIVE.equalsByKey(statusValue)) return null;
return AccountError.WrongFieldValue;
}),
EnumPresentRule.instance("accountType",
CorrespondentAccountNewRequest::getAccountType,
AccountType.values(),
AccountError.WrongFieldValue,
AccountError.RequiredFieldEmpty),
DictionaryPresentRule.instance("accountType",
CorrespondentAccountNewRequest::getAccountType,
IMDGDistributedNames.Map_AccountTypeDictionary,
@ -89,7 +84,7 @@ public class AccountValidationConfig {
AccountError.RequiredFieldEmpty,
AccountError.WrongFieldValue,
accountType -> {
if (accountType.getCode().equalsIgnoreCase(AccountType.Corr.getKey())) return null;
if (AccountType.Corr.equalsByKey(accountType.getCode())) return null;
return AccountError.WrongFieldValue;
})
);
@ -138,11 +133,6 @@ public class AccountValidationConfig {
false,
AccountError.WrongFieldValue,
AccountError.RequiredFieldEmpty),
EnumPresentRule.instance("accountType",
CorrespondentAccountUpdateRequest::getAccountType,
AccountType.values(),
AccountError.WrongFieldValue,
AccountError.RequiredFieldEmpty),
DictionaryPresentRule.instance("accountType",
CorrespondentAccountUpdateRequest::getAccountType,
IMDGDistributedNames.Map_AccountTypeDictionary,
@ -150,7 +140,7 @@ public class AccountValidationConfig {
AccountError.RequiredFieldEmpty,
AccountError.WrongFieldValue,
accountType -> {
if (accountType.getCode().equalsIgnoreCase(AccountType.Corr.getKey())) return null;
if (AccountType.Corr.equalsByKey(accountType.getCode())) return null;
return AccountError.WrongFieldValue;
})
);
@ -172,7 +162,11 @@ public class AccountValidationConfig {
IMDGDistributedNames.Map_Account,
Account.class,
AccountError.RequiredFieldEmpty,
AccountError.AccountNotFound)
AccountError.AccountNotFound,
account -> {
if (AccountStatus.ACTIVE.equalsByKey(account.getStatus())) return null;
return AccountError.AccountNotActive;
})
);
};
}

View file

@ -12,13 +12,11 @@ import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountNewReq
import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountUpdateRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest;
import ru.spcex.clearing.validation.common.rules.DictionaryPresentRule;
import ru.spcex.clearing.validation.common.rules.EnumPresentRule;
import ru.spcex.clearing.validation.common.rules.FieldRequiredRule;
import ru.spcex.clearing.validation.common.rules.IdPresentRule;
import ru.spcex.platform.classes.base.SpcexObjectBase;
import ru.spcex.platform.enumeration.AccountStatus;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.CurrencyCode;
import ru.spcex.platform.enumeration.WorkflowStatus;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
@ -73,11 +71,6 @@ public class BankAccountValidationConfig {
if (accounts.isEmpty()) return null;
return AccountError.AccountAlreadyExist;
}),
EnumPresentRule.instance("currency",
BankAccountNewRequest::getCurrency,
CurrencyCode.values(),
AccountError.WrongFieldValue,
AccountError.RequiredFieldEmpty),
DictionaryPresentRule.instance("currency",
BankAccountNewRequest::getCurrency,
IMDGDistributedNames.Map_CurrencyCodeDictionary,
@ -126,12 +119,6 @@ public class BankAccountValidationConfig {
if (!AccountStatus.ACTIVE.equalsByKey(account.getStatus())) return AccountError.AccountNotActive;
return null;
}),
EnumPresentRule.instance("currency",
BankAccountUpdateRequest::getCurrency,
CurrencyCode.values(),
false,
AccountError.WrongFieldValue,
AccountError.RequiredFieldEmpty),
DictionaryPresentRule.instance("currency",
BankAccountUpdateRequest::getCurrency,
IMDGDistributedNames.Map_CurrencyCodeDictionary,

View file

@ -31,7 +31,6 @@ import java.util.function.Function;
@Configuration
public class ClearingAccountValidationConfig {
// todo add validation for clearingAccountType from dictionary
@Bean("clearingAccountNewRequestValidator")
public Function<ClearingAccountNewRequest, IValidator> clearingAccountNewRequestValidator(
Map<String, Imdg<? extends SpcexObjectBase>> imdgForValidation

View file

@ -9,6 +9,7 @@ import ru.clearing.classes.statics.data.account.ClearingAccount;
import ru.clearing.classes.statics.data.account.InformationAccount;
import ru.clearing.classes.statics.data.company.ClearingMemberCategory;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.platform.dictionary.AccountTypeDictionary;
import ru.clearing.platform.dictionary.ClearingAccountTypeDictionary;
import ru.clearing.platform.dictionary.CurrencyCodeDictionary;
import ru.clearing.platform.dictionary.WorkflowStatusDictionary;
@ -36,7 +37,7 @@ public class ValidationConfig {
addImdg.accept(IMDGDistributedNames.Map_ClearingAccountTypeDictionary, ClearingAccountTypeDictionary.class);
addImdg.accept(IMDGDistributedNames.Map_Account, Account.class);
addImdg.accept(IMDGDistributedNames.Map_InformationAccount, InformationAccount.class);
addImdg.accept(IMDGDistributedNames.Map_AccountTypeDictionary, Account.class);
addImdg.accept(IMDGDistributedNames.Map_AccountTypeDictionary, AccountTypeDictionary.class);
addImdg.accept(IMDGDistributedNames.Map_BankAccount, BankAccount.class);
addImdg.accept(IMDGDistributedNames.Map_CurrencyCodeDictionary, CurrencyCodeDictionary.class);
addImdg.accept(IMDGDistributedNames.Map_ClearingAccount, ClearingAccount.class);

View file

@ -186,8 +186,6 @@ public class AccountService extends QueueConsumer implements InitializingBean {
public RequestInfoUpdate accountNewSdf01(BaseRequest<AccountSdf01Request> userRequest) {
log.debug("AccountSdf01Request received");
// todo add validation (create task for that?)
AccountSdf01Request req = userRequest.getRequestPayload();
List<AccountSdfToStatementRequestPart> accountToStatement = new ArrayList<>();
for (AccountSdfRequestPart accountReq : req.getAccounts()) {

View file

@ -136,7 +136,6 @@ public class BankAccountService extends QueueConsumer implements InitializingBea
imdgTransaction.commitTransaction();
log.debug("successfully processed, new bank account id {}, account id {}", bankAccountId, accountId);
} else {
// todo выяснить, что возвращать из метода в этой ситуации
log.debug("failed insert, new bank account id {}, new account id {} (if id = -1 then insert is failed)",
bankAccountId,
accountId);
@ -185,7 +184,6 @@ public class BankAccountService extends QueueConsumer implements InitializingBea
bankAccount.getId(),
account.getId());
} else {
// todo выяснить, что возвращать из метода в этой ситуации
log.debug("failed update, bank account id {}, new account id {}",
bankAccount.getId(),
account.getId());

View file

@ -85,7 +85,6 @@ public class InformationAccountService extends QueueConsumer implements Initiali
Long newId = informationAccountImdg.nextIDSequenceFor();
String accountValue = generateInfoAccount(newId);
// todo уточнить у репортера
ImdgPredicateBuilder accountPredicateBuilder = accountImdg.predicateBuilder();
ImdgPredicate companyIdPredicate = accountPredicateBuilder.equals("companyId", 1);
ImdgPredicate accountTypePredicate = accountPredicateBuilder.equals("accountType", AccountType.Anlt.getKey());

View file

@ -17,7 +17,7 @@ import java.util.Collection;
import java.util.Map;
@Controller
@RequestMapping("/accounting/information-account")
@RequestMapping("/accounting/information-accounts")
public class InformationAccountController {
private final IStateLoader stateLoader;

View file

@ -7,12 +7,12 @@ import ru.spcex.clearing.backendapi.controller.queue.account.InformationAccountC
import ru.spcex.clearing.imdg.IMDGDistributedNames;
class InformationAccountControllerTest extends AbstractControllerTest {
public static final String REST_URL = "/accounting/information-account/";
public static final String REST_URL = "/accounting/information-accounts/";
/**
* {@link InformationAccountController#getAll()} <br>
* Тест проверяет получение запроса по REST API.<br>
* Входной запрос /accounting/information-account/ <br>
* Входной запрос /accounting/information-accounts/ <br>
* Ответ CommonGetAllResponse <br>
*/
@Test

View file

@ -24,6 +24,10 @@
<groupId>ru.spcex.platform</groupId>
<artifactId>platform-imdg-api-hazelcast-impl</artifactId>
</dependency>
<dependency>
<groupId>ru.spcex.clearing</groupId>
<artifactId>clearing-validation</artifactId>
</dependency>
<dependency>
<groupId>ru.spcex.clearing</groupId>
<artifactId>classes</artifactId>

View file

@ -1,30 +1,16 @@
package ru.spcex.clearing.balance.config;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ResourceBundleMessageSource;
import ru.spcex.clearing.util.services.IMDGMessageResolver;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.enumeration.SpringPropertiesMessageResolver;
import java.util.Locale;
@Configuration
public class MessagesConfig {
@Bean("validation-error-messages")
public ResourceBundleMessageSource messages() {
ResourceBundleMessageSource source = new ResourceBundleMessageSource();
source.setBasenames("messages/error");
source.setUseCodeAsDefaultMessage(true);
source.setDefaultEncoding("utf8");
source.setDefaultLocale(Locale.ROOT);
return source;
}
@Bean
public IMessageResolver errorResolver(@Qualifier("validation-error-messages") ResourceBundleMessageSource messageBundle) {
SpringPropertiesMessageResolver resolver = new SpringPropertiesMessageResolver(messageBundle);
resolver.setLocale("ru");
return resolver;
public IMessageResolver errorResolver(ImdgProvider imdgProvider) {
return new IMDGMessageResolver(imdgProvider);
}
}

View file

@ -1,2 +0,0 @@
5211=Company not found
5213=Currency not found

View file

@ -1,2 +0,0 @@
5211=Компания не найдена
5213=Валюта не найдена

View file

@ -25,6 +25,10 @@
<groupId>ru.spcex.platform</groupId>
<artifactId>platform-imdg-api-hazelcast-impl</artifactId>
</dependency>
<dependency>
<groupId>ru.spcex.clearing</groupId>
<artifactId>clearing-validation</artifactId>
</dependency>
<dependency>
<groupId>ru.spcex.clearing</groupId>
<artifactId>classes</artifactId>

View file

@ -3,12 +3,13 @@ package ru.spcex.clearing.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.enumeration.SimpleMessageResolver;
import ru.spcex.clearing.util.services.IMDGMessageResolver;
import ru.spcex.platform.imdg.api.ImdgProvider;
@Configuration
public class MessageResolverConfig {
@Bean
public IMessageResolver messageResolver() {
return new SimpleMessageResolver();
public IMessageResolver messageResolver(ImdgProvider imdgProvider) {
return new IMDGMessageResolver(imdgProvider);
}
}

View file

@ -0,0 +1,37 @@
package ru.spcex.clearing.util.services;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.clearing.platform.dictionary.ErrorCodeDictionary;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import java.util.Arrays;
/**
* Использует ErrorCodeDictionary для расшифровки текста кодов ошибок.
*/
public class IMDGMessageResolver implements IMessageResolver {
protected final Logger log = LoggerFactory.getLogger(getClass());
protected final Imdg<ErrorCodeDictionary> errorCodeDictionaryIMDG;
public IMDGMessageResolver(ImdgProvider imdgProvider) {
this.errorCodeDictionaryIMDG = imdgProvider.getImdg(IMDGDistributedNames.Map_ErrorCodeDictionary, ErrorCodeDictionary.class);
}
@Override
public String resolve(EnumMessage errorMessage) {
if (errorMessage == null) return "null";
ErrorCodeDictionary errorDictionary = errorCodeDictionaryIMDG.getSingleObjectByID(errorMessage.getSubject().getId());
if (errorDictionary == null) {
log.warn("ERROR_CODE_DICTIONARY not found fo id={}", errorMessage.getSubject().getId());
return String.format("(%d) args %s", errorMessage.getSubject().getId(), Arrays.toString(errorMessage.getArgs()));
}
String textTemplate = errorDictionary.getName();
return String.format(textTemplate, errorMessage.getArgs());
}
}

View file

@ -11,6 +11,7 @@ import java.util.function.Function;
/**
* Проверка поля со значением из множества (enum)
* Рекомендуется использовать не эту валидацию, а DictionaryPresentRule
* @param <R> Класс проверяемого объекта
* @param <E> Enum
*/

View file

@ -10,13 +10,13 @@ import ru.spcex.clearing.util.security.UserRoleVerification;
import ru.spcex.platform.enumeration.UserRole;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.enumeration.SimpleMessageResolver;
import ru.spcex.clearing.util.services.IMDGMessageResolver;
@Configuration
public class BeanConfiguration {
@Bean
public IMessageResolver messageResolver() {
return new SimpleMessageResolver();
public IMessageResolver messageResolver(ImdgProvider imdgProvider) {
return new IMDGMessageResolver(imdgProvider);
}
@Bean

View file

@ -81,12 +81,6 @@ public class ClearingMemberCategoryValidationConfig {
return CompanyErrors.CompanyDisabled;
return null;
}),
EnumPresentRule.instance("clearingMemberCategory",
ClearingMemberCategoryUpdateRequest::getClearingMemberCategory,
ClearingCategory.values(),
false,
CompanyErrors.WrongFieldValue,
CompanyErrors.RequiredFieldEmpty),
DictionaryPresentRule.instance("clearingMemberCategory",
ClearingMemberCategoryUpdateRequest::getClearingMemberCategory,
IMDGDistributedNames.Map_ClearingCategoryDictionary,

View file

@ -49,11 +49,6 @@ public class CompanyValidationConfig {
WorkflowStatusDictionary.class,
CompanyErrors.RequiredFieldEmpty,
CompanyErrors.WrongFieldValue),
EnumPresentRule.instance("companySymbol",
CompanyNewRequest::getCompanySymbol,
CompanySymbol.values(),
CompanyErrors.WrongFieldValue,
CompanyErrors.RequiredFieldEmpty),
DictionaryPresentRule.instance("companySymbol",
CompanyNewRequest::getCompanySymbol,
IMDGDistributedNames.Map_CompanySymbolDictionary,

View file

@ -44,11 +44,6 @@ public class ContactValidationConfig {
Company.class,
CompanyErrors.RequiredFieldEmpty,
CompanyErrors.CompanyNotFound),
EnumPresentRule.instance("contactType",
ContactNewRequest::getContactType,
ContactTypes.values(),
CompanyErrors.WrongFieldValue,
CompanyErrors.RequiredFieldEmpty),
DictionaryPresentRule.instance("contactType",
ContactNewRequest::getContactType,
IMDGDistributedNames.Map_ContactTypeDictionary,
@ -86,12 +81,6 @@ public class ContactValidationConfig {
}
return null;
}),
EnumPresentRule.instance("contactType",
ContactUpdateRequest::getContactType,
ContactTypes.values(),
false,
CompanyErrors.WrongFieldValue,
CompanyErrors.RequiredFieldEmpty),
DictionaryPresentRule.instance("contactType",
ContactUpdateRequest::getContactType,
IMDGDistributedNames.Map_ContactTypeDictionary,

View file

@ -45,11 +45,6 @@ public class ProfileDocumentValidationConfig {
CompanyErrors.RequiredFieldEmpty,
CompanyErrors.CompanyNotFound,
company -> WorkflowStatus.Active.getKey().equals(company.getWorkflowStatus()) ? null : CompanyErrors.CompanyDisabled),
EnumPresentRule.instance("documentType",
ProfileDocumentNewRequest::getDocumentType,
DocumentTypes.values(),
CompanyErrors.WrongFieldValue,
CompanyErrors.RequiredFieldEmpty),
DictionaryPresentRule.instance("documentType",
ProfileDocumentNewRequest::getDocumentType,
IMDGDistributedNames.Map_DocumentTypeDictionary,
@ -109,12 +104,6 @@ public class ProfileDocumentValidationConfig {
CompanyErrors.CompanyNotFound,
false,
company -> WorkflowStatus.Active.getKey().equals(company.getWorkflowStatus()) ? null : CompanyErrors.CompanyDisabled),
EnumPresentRule.instance("documentType",
ProfileDocumentUpdateRequest::getDocumentType,
DocumentTypes.values(),
false,
CompanyErrors.WrongFieldValue,
CompanyErrors.RequiredFieldEmpty),
DictionaryPresentRule.instance("documentType",
ProfileDocumentUpdateRequest::getDocumentType,
IMDGDistributedNames.Map_DocumentTypeDictionary,

View file

@ -3,12 +3,13 @@ package ru.spcex.clearing.scheduler.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.enumeration.SimpleMessageResolver;
import ru.spcex.clearing.util.services.IMDGMessageResolver;
import ru.spcex.platform.imdg.api.ImdgProvider;
@Configuration
public class ErrorResolverConfig {
@Bean
public IMessageResolver messageResolver() {
return new SimpleMessageResolver();
public IMessageResolver messageResolver(ImdgProvider imdgProvider) {
return new IMDGMessageResolver(imdgProvider);
}
}

View file

@ -3,12 +3,13 @@ package ru.spcex.clearing.securities.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.enumeration.SimpleMessageResolver;
import ru.spcex.clearing.util.services.IMDGMessageResolver;
import ru.spcex.platform.imdg.api.ImdgProvider;
@Configuration
public class ErrorResolverConfig {
@Bean
public IMessageResolver messageResolver() {
return new SimpleMessageResolver();
public IMessageResolver messageResolver(ImdgProvider imdgProvider) {
return new IMDGMessageResolver(imdgProvider);
}
}

View file

@ -90,8 +90,8 @@ public class UserRoleVerification {
Objects.requireNonNull(roleForVerification);
Long requesterId = req.getUserId();
if (requesterId != null && !userHasRole(requesterId, roleForVerification)) {
log.debug("User {} has no role to allow this action", requesterId);
String errMsg = messageResolver.resolve(new EnumMessage(roleVerificationError, requesterId));
log.info("User {} has no role: {}", requesterId, errMsg);
return new RequestInfoUpdate()
.setId(req.getId())
.setStatus(ru.spcex.clearing.platform.messaging.service.Status.Error)

View file

@ -62,6 +62,10 @@
<groupId>ru.spcex.platform</groupId>
<artifactId>platform-imdg-api-hazelcast-impl</artifactId>
</dependency>
<dependency>
<groupId>ru.spcex.clearing</groupId>
<artifactId>clearing-validation</artifactId>
</dependency>
<dependency>
<groupId>ru.spcex.platform</groupId>
<artifactId>platform-enum</artifactId>

View file

@ -3,12 +3,13 @@ package ru.spcex.clearing.trade.importer.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.enumeration.SimpleMessageResolver;
import ru.spcex.clearing.util.services.IMDGMessageResolver;
import ru.spcex.platform.imdg.api.ImdgProvider;
@Configuration
public class ErrorResolverConfig {
@Bean
public IMessageResolver messageResolver() {
return new SimpleMessageResolver();
public IMessageResolver messageResolver(ImdgProvider imdgProvider) {
return new IMDGMessageResolver(imdgProvider);
}
}

View file

@ -13,7 +13,7 @@ trade-importer.hazelcast.login=dev
trade-importer.hazelcast.password=dev-pass
trade-importer.kafka-consumer.bootstrap-servers=localhost:9092
trade-importer.kafka-consumer.group-id=dev-group- trade-importer
trade-importer.kafka-consumer.group-id=dev-group-trade-importer
trade-importer.kafka-consumer.enable-auto-commit=false
trade-importer.kafka-consumer.session-timeout-ms=30000
trade-importer.kafka-consumer.auto-offset-reset=latest

View file

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- |%X{ru.nbch.scoring.web.logging.mdc_key}-->
<Pattern>%date{HH:mm:ss.SSS} [%thread] %-5level %class{0}:%line - %message%n</Pattern>
<charset>utf-8</charset>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./logs/trade-importer.log</file>
<encoder>
<!-- |%X{ru.nbch.scoring.web.logging.mdc_key}-->
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %class{0}:%msg%n</Pattern>
<charset>utf8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>
./logs/trade-importer.%i.log
</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>10</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>500MB</maxFileSize>
</triggeringPolicy>
</appender>
<root level="warn">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
<logger name="ru.spcex" level="debug" additivity="false">
<appender-ref ref="FILE"/>
<appender-ref ref="CONSOLE"/>
</logger>
</configuration>

View file

@ -98,6 +98,7 @@ public interface Consts {
String SDF03_PROCESS = "sdf03-process";
String SDF11_PROCESS = "sdf11-process";
String EXPORT_PROCESS = "export-process";
String S_TRADES_IMPORTED = "s_trades-imported";
String ACCOUNT_TERMINATION = "account-termination";
String BALANCE_ACCOUNT_NEW = "balance-account-new";
String BALANCE_ACCOUNT_UPDATE = "balance-account-update";

View file

@ -80,6 +80,7 @@ public class QueueConsumer implements AutoCloseable {
consumer.subscribe(callbacks.keySet());
}
Object o = null;
int lastErrors = 0;
while (!closed.get()) {
try {
ConsumerRecords<String, Object> records = consumer.poll(Duration.of(10, ChronoUnit.SECONDS));
@ -95,11 +96,21 @@ public class QueueConsumer implements AutoCloseable {
}
}
}
lastErrors = 0;
} catch (Throwable e) {
log.error(ExceptionUtils.getStackTrace(e));
if (producer != null && o != null) {
sendErrorResponse((BaseRequest<?>) o);
}
if (lastErrors++ > 20) {
log.warn("Too many error at row, {}. Sleep.", lastErrors);
try {
Thread.sleep(1000L);
} catch (InterruptedException ie) {
log.info("Thread interrupted. {}", ExceptionUtils.getStackTrace(ie));
break;
}
}
}
}
} catch (WakeupException e) {

View file

@ -37,6 +37,7 @@
<folder_root_clearing_imdg>${folder_root_clearing}/clearing-parent/imdg</folder_root_clearing_imdg>
<folder_root_dbf-exporter>${folder_root_clearing}/clearing-parent/dbf-exporter</folder_root_dbf-exporter>
<folder_root_dbf-importer>${folder_root_clearing}/clearing-parent/dbf-importer</folder_root_dbf-importer>
<folder_root_trade-importer>${folder_root_clearing}/clearing-parent/trade-importer</folder_root_trade-importer>
<folder_root_account-service>${folder_root_clearing}/clearing-parent/account-service</folder_root_account-service>
<folder_root_balance-service>${folder_root_clearing}/clearing-parent/balance-service</folder_root_balance-service>
<folder_root_company-service>${folder_root_clearing}/clearing-parent/company-service</folder_root_company-service>

View file

@ -191,6 +191,25 @@
</fileSets>
</configuration>
</execution>
<execution>
<id>copy-trade-importer-bin</id>
<phase>prepare-package</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<fileSets>
<fileSet>
<sourceFile>${folder_root_trade-importer}/target/trade-importer.jar</sourceFile>
<destinationFile>${folder.clearing.distr.modules}/trade-importer/trade-importer.jar</destinationFile>
</fileSet>
<fileSet>
<sourceFile>${folder_root_trade-importer}/src/main/resources/application.properties</sourceFile>
<destinationFile>${folder.clearing.distr.modules}/trade-importer/application.properties</destinationFile>
</fileSet>
</fileSets>
</configuration>
</execution>
<execution>
<id>copy-account-service-bin</id>
<phase>prepare-package</phase>

View file

@ -7,6 +7,7 @@ kill -9 $(ps -ef | grep java | grep company-service.jar | awk '{print $2}')
kill -9 $(ps -ef | grep java | grep clearing-service.jar | awk '{print $2}')
kill -9 $(ps -ef | grep java | grep dbf-exporter.jar | awk '{print $2}')
kill -9 $(ps -ef | grep java | grep dbf-importer.jar | awk '{print $2}')
kill -9 $(ps -ef | grep java | grep trade-importer.jar | awk '{print $2}')
kill -9 $(ps -ef | grep java | grep imdg.jar | awk '{print $2}')
kill -9 $(ps -ef | grep java | grep securities-service.jar | awk '{print $2}')
kill -9 $(ps -ef | grep java | grep utility-service.jar | awk '{print $2}')

View file

@ -8,6 +8,7 @@ cd /opt/mfd/clearing/bin
/opt/mfd/clearing/bin/clearing-service.sh
/opt/mfd/clearing/bin/dbf-exporter.sh
/opt/mfd/clearing/bin/dbf-importer.sh
/opt/mfd/clearing/bin/trade-importer.sh
/opt/mfd/clearing/bin/securities-service.sh
/opt/mfd/clearing/bin/utility-service.sh
/opt/mfd/clearing/bin/scheduler-service.sh

View file

@ -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=7100 -jar trade-importer.jar --spring.config.location=$CLEARING_HOME/settings/trade-importer/"
$CMD >/dev/null 2>&1 &