diff --git a/clearing-parent/backend-api/src/main/resources/meta/data.xml b/clearing-parent/backend-api/src/main/resources/meta/data.xml
index 0686abe70..fbb1ae3e8 100644
--- a/clearing-parent/backend-api/src/main/resources/meta/data.xml
+++ b/clearing-parent/backend-api/src/main/resources/meta/data.xml
@@ -463,6 +463,7 @@
+
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/ClearingError.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/ClearingError.java
index 01dbb950e..7e7ac687a 100644
--- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/ClearingError.java
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/ClearingError.java
@@ -28,6 +28,7 @@ public enum ClearingError implements IErrorEnumId {
NewDealsNotFound(5423L),
IdentifiedFundsExceedObligations(5424L),
ObligationsAlreadyCalculated(5425L),
+ ActiveSessionIsPresent(5428L),
//ошибки "перенесенные" из balance-service,
CompanyNotFoundB(5211L),
CurrencyNotFound(5213L),
@@ -38,8 +39,6 @@ public enum ClearingError implements IErrorEnumId {
BalanceInsufficient(5222L),
TCRegistryNotFound(3022L),
WrongField(5004L),
-
- ActiveSessionIsPresent(-1L),
;
private final Long id;
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/EventsReceiver.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/EventsReceiver.java
index c6344e6ce..a4d10dff0 100644
--- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/EventsReceiver.java
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/EventsReceiver.java
@@ -7,6 +7,7 @@ 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.balance.StatementRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.clearing.CreateRegistryRequest;
@@ -21,18 +22,23 @@ import ru.spcex.clearing.platform.messaging.domain.cud.registry.RegistrySplitDep
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.utilities.STradesImportedRequest;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
+import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
+import ru.spcex.clearing.platform.messaging.service.Status;
import ru.spcex.clearing.service.executors.Sdf06Executor;
import ru.spcex.clearing.service.executors.Sdf10Executor;
import ru.spcex.clearing.service.payment.PaymentInstructionOutboundService;
import ru.spcex.clearing.session.stage.*;
import ru.spcex.clearing.session.stage.impl.BalanceRevise;
import ru.spcex.platform.enumeration.Task;
+import ru.spcex.platform.utils.enumeration.IMessageResolver;
+import ru.spcex.platform.utils.error.ValidationException;
import static ru.spcex.clearing.platform.messaging.domain.Consts.S_TRADES_IMPORTED;
@Service
public class EventsReceiver extends QueueConsumer implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass());
+ private final IMessageResolver errorResolver;
private final ClearingService clearingService;
private final RegistryService registryService;
private final PrimaryAuctionBnSession primaryAuctionBnSession;
@@ -51,6 +57,7 @@ public class EventsReceiver extends QueueConsumer implements InitializingBean {
@Autowired
public EventsReceiver(Consumer kafkaQueue, Producer kafkaResponseQueue,
+ IMessageResolver errorResolver,
ClearingService clearingService,
RegistryService registryService,
PrimaryAuctionBnSession primaryAuctionBnSession,
@@ -59,6 +66,7 @@ public class EventsReceiver extends QueueConsumer implements InitializingBean {
Sdf06Executor sdf06Executor,
Sdf10Executor sdf10Executor, BalanceRevise balanceRevise, Sdf05Sender sdf05Sender, PaymentInstructionOutboundService pmtOutboundService) {
super(kafkaQueue, kafkaResponseQueue);
+ this.errorResolver = errorResolver;
this.clearingService = clearingService;
this.registryService = registryService;
this.primaryAuctionBnSession = primaryAuctionBnSession;
@@ -95,7 +103,14 @@ public class EventsReceiver extends QueueConsumer implements InitializingBean {
.forDestination(Consts.CONTINUE_CLEARING, callbacks::put);
callback(LauncherCommandRequest.class)
- .setConsumer(sessionManager::defineAndStartSession)
+ .setFunction(r -> {
+ try {
+ sessionManager.defineAndStartSession(r);
+ } catch (ValidationException ve) {
+ return makeErrorResponse(r, ve);
+ }
+ return null;
+ })
.forDestination(Task.startOfClearing.topic(), callbacks::put);
callback(PIClearingOutbondActionNewRequest.class)
@@ -160,4 +175,14 @@ public class EventsReceiver extends QueueConsumer implements InitializingBean {
.forDestination(Task.sdf05WithCode9Final.topic(), callbacks::put);
init();
}
+
+ RequestInfoUpdate makeErrorResponse(BaseRequest> r, ValidationException ve) {
+ String errorText = errorResolver.resolve(ve.getEnumMsg());
+ log.error("Error at {}: {}", r, errorText);
+ RequestInfoUpdate errorMsg = new RequestInfoUpdate();
+ errorMsg.setId(r.getId());
+ errorMsg.setStatus(Status.Error);
+ errorMsg.setMessage(errorText);
+ return errorMsg;
+ }
}
diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/SessionManager.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/SessionManager.java
index a9d6e99c4..7a4ea185b 100644
--- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/SessionManager.java
+++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/SessionManager.java
@@ -4,6 +4,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.misc.Session;
+import ru.spcex.clearing.error.ClearingError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest;
@@ -13,6 +14,7 @@ import ru.spcex.platform.enumeration.SessionType;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.utils.enumeration.IEnumKey;
+import ru.spcex.platform.utils.error.ValidationException;
import java.util.Map;
@@ -46,7 +48,7 @@ public class SessionManager {
sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class);
}
- public void defineAndStartSession(BaseRequest r) { //task sclr section fond sessiontype trdt
+ public void defineAndStartSession(BaseRequest r) throws ValidationException { //task sclr section fond sessiontype trdt
LauncherCommandRequest payload = r.getRequestPayload();
// Long sessionId = commandRequest.getSessionId();
SessionType sessionType = IEnumKey.getEnumByKey(SessionType.class, payload.getSessionType());
@@ -75,13 +77,13 @@ public class SessionManager {
}
}
- protected void checkActiveSession() {
+ protected void checkActiveSession() throws ValidationException {
Session existActiveSession = sessionImdg.getFirstObjectByFieldValues(Map.of(
"workflowStatus", SessionStatus.ACTV.getKey()
));
if (existActiveSession != null) {
log.warn("Can not start new session, cause exist active session.id={}", existActiveSession.getId());
- throw new RuntimeException("ActiveSessionIsPresent " + existActiveSession);
+ throw new ValidationException(ClearingError.ActiveSessionIsPresent, String.valueOf(existActiveSession.getId()));
}
}
}
diff --git a/clearing-parent/db-scripts/src/main/resources/db/DATA.sql b/clearing-parent/db-scripts/src/main/resources/db/DATA.sql
index 092623992..7b4e4f753 100644
--- a/clearing-parent/db-scripts/src/main/resources/db/DATA.sql
+++ b/clearing-parent/db-scripts/src/main/resources/db/DATA.sql
@@ -896,6 +896,8 @@ INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5426, 'CLRN', 'Реж
INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5427, 'CLRN', 'Найдено больше одной записи %s.') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
+INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5428, 'CLRN', 'Активная клиринговая сессия уже существует.') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
+
INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5600, 'DBFI', 'Общая ошибка модуля dbf-importer.') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5800, 'DBFE', 'Общая ошибка модуля dbf-exporter.') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;