active session check

This commit is contained in:
ialbert 2025-07-16 18:19:58 +03:00
parent 3e804be783
commit 627f8caf27

View file

@ -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<SessionType, StateMachineFactory<TaskType, SsnEvent>> factories;
private final SessionStatusChangingInterceptor statusChangingInterceptor;
private StateMachine<TaskType, SsnEvent> currentSession;
private final Imdg<Session> ssnImdg;
@Autowired
public SessionStateMachineWrapper(
ImdgProvider imdgProvider,
Map<String, StateMachineFactory<TaskType, SsnEvent>> 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<LauncherCommandRequest> 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<Session> 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);
}
}