diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/AbstractSession.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/AbstractSession.java index 8a8b4a1d5..65b653253 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/AbstractSession.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/AbstractSession.java @@ -10,8 +10,10 @@ import ru.spcex.platform.enumeration.SessionStatus; 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.enumeration.IMessageResolver; +import java.time.Instant; import java.util.Map; import java.util.concurrent.atomic.AtomicReference; @@ -22,10 +24,12 @@ public abstract class AbstractSession { protected final IMessageResolver messageResolver; protected final AtomicReference currStage = new AtomicReference<>(); protected Session currSession; + protected final ImdgProvider imdgProvider; public AbstractSession( ImdgProvider imdgProvider, IMessageResolver messageResolver) { + this.imdgProvider = imdgProvider; this.sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); this.messageResolver = messageResolver; } @@ -55,6 +59,11 @@ public abstract class AbstractSession { protected void endSession() { synchronized (this.currStage) { + Session session = currSession; + if (session != null) { + session.setSessionStatus(SessionStatus.CLOS.getKey()); + sessionImdg.update(session); + } this.currStage.set(null); this.currSession = null; } @@ -80,16 +89,35 @@ public abstract class AbstractSession { } } - protected boolean checkIsActive() { - Session activeSession = sessionImdg.getSingleObjectByFieldValues(Map.of( - "sectionType", sectionType().getKey(), + protected void initSessionIfPresent() { + Session session = sessionImdg.getSingleObjectByFieldValues(Map.of( + "sessionType", sessionType().getKey(), "section", section().getKey(), - "sessionStatus", SessionStatus.ACTV.getKey()) + "workflowStatus", SessionStatus.ACTV.getKey()) ); - return activeSession != null; + if (session != null) { + synchronized (this.currStage) { + log.info("Session id={} section={} sessionType={} taskType={} found", session.getId(), + session.getSection(), + session.getSessionType(), + session.getSessionStatus() + ); + TaskType taskType = IEnumKey.getEnumByKey(TaskType.class, session.getSessionStatus()); + if (taskType == null) { + log.warn("cannot distinguish taskType {} for session.id={}", session.getSessionStatus(), session.getId()); + session.setSessionStatus(SessionStatus.CLOS.getKey()); + session.setUpdated(Instant.now()); + sessionImdg.update(session); + return; + } + log.info("Session id={} accepted to processing with current step {}.{}", session.getId(), taskType, taskType.getKey()); + this.currStage.set(taskType); + this.currSession = session; + } + } } protected abstract Section section(); - protected abstract SessionType sectionType(); + protected abstract SessionType sessionType(); } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/FinalMkrSession.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/FinalMkrSession.java index 3dd5b038a..c6a9f6fcb 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/FinalMkrSession.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/FinalMkrSession.java @@ -98,7 +98,9 @@ public class FinalMkrSession extends AbstractSession implements InitializingBean rgsPrctBuilder.lessEqual("valueDate", LocalDate.now()) ) ); - inspectionObligations.setSessionType(sectionType()); + inspectionObligations.setSessionType(sessionType()); + imdgProvider.waitAvailable(); + initSessionIfPresent(); } @Override @@ -232,7 +234,7 @@ public class FinalMkrSession extends AbstractSession implements InitializingBean TaskType startStatus = TaskType.StartRevise; Session newSession = new Session(); newSession.setSection(section().getKey()); - newSession.setSessionType(sectionType().getKey()); + newSession.setSessionType(sessionType().getKey()); newSession.setSessionStatus(startStatus.getKey()); newSession.setWorkflowStatus(SessionStatus.ACTV.getKey()); newSession.setClearingDate(LocalDate.now()); @@ -253,7 +255,7 @@ public class FinalMkrSession extends AbstractSession implements InitializingBean } @Override - protected SessionType sectionType() { + protected SessionType sessionType() { return SessionType.FINL; } } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/IntermediateMkrSession.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/IntermediateMkrSession.java index 8fbb17d97..7b89ab7ed 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/IntermediateMkrSession.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/IntermediateMkrSession.java @@ -85,6 +85,8 @@ public class IntermediateMkrSession extends AbstractSession implements Initializ ImdgPredicateBuilder execFondPb = executionDepositImdg.predicateBuilder(); dealsPrepare.addExecutionDepositCondition(execFondPb.regex("firstLegSettlementCode", "(^T0.*$)|(B[^0]\\d*$)")); // dealsPrepare.addExecutionDepositCondition(execFondPb.in("market", marketCodes.get().toArray(new String[0]))); + imdgProvider.waitAvailable(); + initSessionIfPresent(); } @Override @@ -208,7 +210,7 @@ public class IntermediateMkrSession extends AbstractSession implements Initializ TaskType startStatus = TaskType.StartRevise; Session newSession = new Session(); newSession.setSection(section().getKey()); - newSession.setSessionType(sectionType().getKey()); + newSession.setSessionType(sessionType().getKey()); newSession.setSessionStatus(startStatus.getKey()); newSession.setWorkflowStatus(SessionStatus.ACTV.getKey()); newSession.setClearingDate(LocalDate.now()); @@ -229,7 +231,7 @@ public class IntermediateMkrSession extends AbstractSession implements Initializ } @Override - protected SessionType sectionType() { + protected SessionType sessionType() { return SessionType.MEDM; } } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/PrimaryAuctionB0Session.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/PrimaryAuctionB0Session.java index 1f64973bb..94a0b8239 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/PrimaryAuctionB0Session.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/PrimaryAuctionB0Session.java @@ -85,6 +85,8 @@ public class PrimaryAuctionB0Session extends AbstractSession implements Initiali ImdgPredicateBuilder execFondPb = executionFondImdg.predicateBuilder(); dealsPrepare.addExecutionFondCondition(execFondPb.regex("settlementCode", "^B0.*$")); dealsPrepare.addExecutionFondCondition(execFondPb.equals("marketType", MarketType.PRMR.getKey())); + imdgProvider.waitAvailable(); + initSessionIfPresent(); } @Override @@ -196,7 +198,7 @@ public class PrimaryAuctionB0Session extends AbstractSession implements Initiali TaskType startStatus = TaskType.StartRevise; Session newSession = new Session(); newSession.setSection(Section.FOND.getKey()); - newSession.setSessionType(SessionType.IPO0.getKey()); + newSession.setSessionType(sessionType().getKey()); newSession.setSessionStatus(startStatus.getKey()); newSession.setWorkflowStatus(SessionStatus.ACTV.getKey()); newSession.setClearingDate(LocalDate.now()); @@ -216,7 +218,7 @@ public class PrimaryAuctionB0Session extends AbstractSession implements Initiali } @Override - protected SessionType sectionType() { - return SessionType.IPOB; + protected SessionType sessionType() { + return SessionType.IPO0; } } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/PrimaryAuctionBnSession.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/PrimaryAuctionBnSession.java index 445d976ae..523b4fa06 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/PrimaryAuctionBnSession.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/PrimaryAuctionBnSession.java @@ -84,6 +84,8 @@ public class PrimaryAuctionBnSession extends AbstractSession implements Initiali ImdgPredicateBuilder execFondPb = executionFondImdg.predicateBuilder(); dealsPrepare.addExecutionFondCondition(execFondPb.regex("settlementCode", "^B\\d{2}$")); dealsPrepare.addExecutionFondCondition(execFondPb.in("market", marketCodes.get().toArray(new String[0]))); + imdgProvider.waitAvailable(); + initSessionIfPresent(); } @Override @@ -194,7 +196,7 @@ public class PrimaryAuctionBnSession extends AbstractSession implements Initiali TaskType startStatus = TaskType.StartRevise; Session newSession = new Session(); newSession.setSection(Section.FOND.getKey()); - newSession.setSessionType(SessionType.IPOB.getKey()); + newSession.setSessionType(sessionType().getKey()); newSession.setSessionStatus(startStatus.getKey()); newSession.setWorkflowStatus(SessionStatus.ACTV.getKey()); newSession.setClearingDate(LocalDate.now()); @@ -215,7 +217,7 @@ public class PrimaryAuctionBnSession extends AbstractSession implements Initiali } @Override - protected SessionType sectionType() { + protected SessionType sessionType() { return SessionType.IPOB; } } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/PrimaryAuctionT0Session.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/PrimaryAuctionT0Session.java index ebd12cdcd..fb17a07da 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/PrimaryAuctionT0Session.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/PrimaryAuctionT0Session.java @@ -84,6 +84,8 @@ public class PrimaryAuctionT0Session extends AbstractSession implements Initiali ImdgPredicateBuilder execFondPb = executionFondImdg.predicateBuilder(); dealsPrepare.addExecutionFondCondition(execFondPb.regex("settlementCode", "^T0.*$")); dealsPrepare.addExecutionFondCondition(execFondPb.equals("marketType", MarketType.PRMR.getKey())); + imdgProvider.waitAvailable(); + initSessionIfPresent(); } @Override @@ -194,7 +196,7 @@ public class PrimaryAuctionT0Session extends AbstractSession implements Initiali } else { Session newSession = new Session(); newSession.setSection(Section.FOND.getKey()); - newSession.setSessionType(SessionType.IPOT.getKey()); + newSession.setSessionType(sessionType().getKey()); newSession.setSessionStatus(TaskType.StartRevise.getKey()); newSession.setWorkflowStatus(SessionStatus.ACTV.getKey()); newSession.setClearingDate(LocalDate.now()); @@ -214,7 +216,7 @@ public class PrimaryAuctionT0Session extends AbstractSession implements Initiali } @Override - protected SessionType sectionType() { + protected SessionType sessionType() { return SessionType.IPOT; } } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/ReturnDepositSession.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/ReturnDepositSession.java index cc5d7f958..8a0c4a7e6 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/ReturnDepositSession.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/ReturnDepositSession.java @@ -83,7 +83,8 @@ public class ReturnDepositSession extends AbstractSession implements Initializin rgsPrctBuilder.less("valueDate", LocalDate.now()) ) ); - + imdgProvider.waitAvailable(); + initSessionIfPresent(); } @Override @@ -183,7 +184,7 @@ public class ReturnDepositSession extends AbstractSession implements Initializin TaskType startStatus = TaskType.StartRevise; Session newSession = new Session(); newSession.setSection(section().getKey()); - newSession.setSessionType(sectionType().getKey()); + newSession.setSessionType(sessionType().getKey()); newSession.setSessionStatus(startStatus.getKey()); newSession.setWorkflowStatus(SessionStatus.ACTV.getKey()); newSession.setClearingDate(LocalDate.now()); @@ -204,7 +205,7 @@ public class ReturnDepositSession extends AbstractSession implements Initializin } @Override - protected SessionType sectionType() { + protected SessionType sessionType() { return SessionType.XDEP; } } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/SecondaryAuctionT0Session.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/SecondaryAuctionT0Session.java index d2c752416..e5df3e797 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/SecondaryAuctionT0Session.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/SecondaryAuctionT0Session.java @@ -84,6 +84,8 @@ public class SecondaryAuctionT0Session extends AbstractSession implements Initia ImdgPredicateBuilder execFondPb = executionFondImdg.predicateBuilder(); dealsPrepare.addExecutionFondCondition(execFondPb.regex("settlementCode", "^T0.*$")); dealsPrepare.addExecutionFondCondition(execFondPb.in("market", marketCodes.get().toArray(new String[0]))); + imdgProvider.waitAvailable(); + initSessionIfPresent(); } @Override @@ -195,7 +197,7 @@ public class SecondaryAuctionT0Session extends AbstractSession implements Initia TaskType startStatus = TaskType.StartRevise; Session newSession = new Session(); newSession.setSection(Section.FOND.getKey()); - newSession.setSessionType(SessionType.TRDT.getKey()); + newSession.setSessionType(sessionType().getKey()); newSession.setSessionStatus(startStatus.getKey()); newSession.setWorkflowStatus(SessionStatus.ACTV.getKey()); newSession.setClearingDate(LocalDate.now()); @@ -216,7 +218,7 @@ public class SecondaryAuctionT0Session extends AbstractSession implements Initia } @Override - protected SessionType sectionType() { + protected SessionType sessionType() { return SessionType.TRDT; } }