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 0471f96ee..5a4698be4 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 @@ -126,7 +126,11 @@ public class EventsReceiver extends QueueConsumerV2 implements InitializingBean callback(LauncherCommandRequest.class) .setFunction(r -> { - stateMachineWrapper.defineAndStartSession(r); + try { + stateMachineWrapper.defineAndStartSession(r); + } catch (ValidationException e) { + return makeErrorResponse(r, e); + } return null; }) .forDestination(Task.startOfClearing.topic(), callbacks::put); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/factory/SessionStateMachineWrapper.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/factory/SessionStateMachineWrapper.java index 8d1759e04..987812b5d 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/factory/SessionStateMachineWrapper.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/factory/SessionStateMachineWrapper.java @@ -12,7 +12,9 @@ import org.springframework.statemachine.StateMachine; import org.springframework.statemachine.config.StateMachineFactory; import org.springframework.stereotype.Component; import ru.clearing.classes.statics.data.misc.Session; +import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.notification.NotificationSender; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; import ru.spcex.clearing.session.stage.TaskType; @@ -20,13 +22,18 @@ import ru.spcex.clearing.session.state.DataEnum; import ru.spcex.clearing.session.state.SsnEvent; import ru.spcex.clearing.session.state.interceptor.SessionStatusChangingInterceptor; import ru.spcex.clearing.session.state.listener.MachineStopListener; +import ru.spcex.platform.enumeration.ObjectType; +import ru.spcex.platform.enumeration.Priority; import ru.spcex.platform.enumeration.Section; import ru.spcex.platform.enumeration.SessionType; import ru.spcex.platform.enumeration.WorkflowStatus; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; +import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.IEnumKey; +import ru.spcex.platform.utils.enumeration.IMessageResolver; +import ru.spcex.platform.utils.error.ValidationException; @Component public class SessionStateMachineWrapper { @@ -36,12 +43,16 @@ public class SessionStateMachineWrapper { private final SessionStatusChangingInterceptor statusChangingInterceptor; private StateMachine currentSession; private final Imdg ssnImdg; + private final NotificationSender notification; + private final IMessageResolver msgs; @Autowired public SessionStateMachineWrapper( ImdgProvider imdgProvider, Map> factories, - SessionStatusChangingInterceptor statusChangingInterceptor + SessionStatusChangingInterceptor statusChangingInterceptor, + NotificationSender notification, + IMessageResolver msgs ) { this.factories = factories .entrySet() @@ -54,9 +65,11 @@ public class SessionStateMachineWrapper { .collect(Collectors.toMap(AbstractMap.SimpleEntry::getKey, AbstractMap.SimpleEntry::getValue)); this.statusChangingInterceptor = statusChangingInterceptor; this.ssnImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); + this.notification = notification; + this.msgs = msgs; } - public synchronized void defineAndStartSession(BaseRequest r) { + public synchronized void defineAndStartSession(BaseRequest r) throws ValidationException { LauncherCommandRequest payload = r.getRequestPayload(); SessionType sessionType = IEnumKey.getEnumByKey(SessionType.class, payload.getSessionType()); Section section = IEnumKey.getEnumByKey(Section.class, payload.getSection()); @@ -69,6 +82,7 @@ public class SessionStateMachineWrapper { log.info("no spring state machine factory for {}", sessionType); return; } + EnumMessage err = null; if (this.currentSession != null) { Session session = currentSession .getExtendedState() @@ -76,15 +90,20 @@ public class SessionStateMachineWrapper { Long id = session != null ? session.getId() : null; String ssnType = session != null ? session.getSessionType() : null; log.warn("Session already running: type={} id={}", ssnType, id); - return; + err = new EnumMessage(ClearingError.ActiveSessionIsPresent, String.valueOf(id)); } Session activeSession = getActiveSession().orElse(null); if (activeSession != null) { log.warn("Session already running: type={} id={}", activeSession.getSessionType(), activeSession.getId()); - return; + err = new EnumMessage(ClearingError.ActiveSessionIsPresent, String.valueOf(activeSession.getId())); } + if (err != null) { + notification.sendNotification(ObjectType.session, msgs.resolve(err), Priority.HIGH); + throw new ValidationException(err); + } + this.currentSession = build(factory); this.currentSession.addStateListener(new MachineStopListener( this::clearCurrentMachine