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 087553f97..8d1759e04 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 @@ -2,6 +2,7 @@ package ru.spcex.clearing.session.state.factory; import java.util.AbstractMap; import java.util.Map; +import java.util.Optional; import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -11,6 +12,7 @@ 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.imdg.IMDGDistributedNames; 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,6 +22,10 @@ import ru.spcex.clearing.session.state.interceptor.SessionStatusChangingIntercep import ru.spcex.clearing.session.state.listener.MachineStopListener; 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.IEnumKey; @Component @@ -29,9 +35,11 @@ public class SessionStateMachineWrapper { private final Map> factories; private final SessionStatusChangingInterceptor statusChangingInterceptor; private StateMachine currentSession; + private final Imdg ssnImdg; @Autowired public SessionStateMachineWrapper( + ImdgProvider imdgProvider, Map> factories, SessionStatusChangingInterceptor statusChangingInterceptor ) { @@ -45,6 +53,7 @@ public class SessionStateMachineWrapper { }) .collect(Collectors.toMap(AbstractMap.SimpleEntry::getKey, AbstractMap.SimpleEntry::getValue)); this.statusChangingInterceptor = statusChangingInterceptor; + this.ssnImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); } public synchronized void defineAndStartSession(BaseRequest r) { @@ -69,6 +78,13 @@ public class SessionStateMachineWrapper { log.warn("Session already running: type={} id={}", ssnType, id); return; } + Session activeSession = getActiveSession().orElse(null); + if (activeSession != null) { + log.warn("Session already running: type={} id={}", + activeSession.getSessionType(), + activeSession.getId()); + return; + } this.currentSession = build(factory); this.currentSession.addStateListener(new MachineStopListener( this::clearCurrentMachine @@ -115,4 +131,15 @@ public class SessionStateMachineWrapper { ); return stateMachine; } + + private Optional getActiveSession() { + ImdgPredicateBuilder pb = ssnImdg.predicateBuilder(); + Session existActiveSession = ssnImdg.getSingleObjectByPredicate( + pb.or( + pb.equals("workflowStatus", WorkflowStatus.Active.getKey()), + pb.equals("workflowStatus", WorkflowStatus.Pause.getKey()) + ) + ); + return Optional.ofNullable(existActiveSession); + } }