diff --git a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/CompanyService.java b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/CompanyService.java index 798e4c72f..98ac9eb3b 100644 --- a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/CompanyService.java +++ b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/CompanyService.java @@ -10,7 +10,6 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.CompanySymbols; -import ru.clearing.classes.statics.data.company.relation.Relation; import ru.spcex.clearing.company.error.CompanyErrors; import ru.spcex.clearing.company.util.RequestHelper; import ru.spcex.clearing.imdg.IMDGDistributedNames; @@ -32,21 +31,17 @@ import ru.spcex.platform.utils.error.ValidationException; import ru.spcex.platform.utils.validation.IValidator; import java.time.Instant; -import java.util.Collection; import java.util.Map; import java.util.Objects; import java.util.function.Function; -// todo добавить транзакции! Это важно из-за AccountNotification @Service public class CompanyService extends QueueConsumer implements InitializingBean { private final Logger log = LoggerFactory.getLogger(getClass()); private final RequestHelper requestHelper; private final ImdgProvider imdgProvider; - // private final Imdg companyMap; - private final Imdg companySymnbolsMap; - // private final Imdg relationMap; + private final Imdg companySymbolsMap; private final ImdgId idSequence; protected UserRoleVerification userRoleVerification; protected IMessageResolver messageResolver; @@ -81,11 +76,8 @@ public class CompanyService extends QueueConsumer implements InitializingBean { this.imdgProvider = imdgProvider; this.messageResolver = messageResolver; this.requestHelper = new RequestHelper(log, messageResolver); -// this.companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); -// this.relationMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Relation, Relation.class); - - this.companySymnbolsMap = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); + this.companySymbolsMap = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); this.idSequence = imdgProvider.getImdgIdGenerator(); this.userRoleVerification = userRoleVerification; this.validationHelper = validationHelper; @@ -213,6 +205,7 @@ public class CompanyService extends QueueConsumer implements InitializingBean { } else { log.trace("Null new WorkflowStatus"); } + companyMap.update(company); txOk = true; } finally { if (txOk) @@ -269,7 +262,7 @@ public class CompanyService extends QueueConsumer implements InitializingBean { company.setUpdated(Instant.now()); - CompanySymbols companySymbol = companySymnbolsMap.getSingleObjectByFieldValues(Map.of("companyId", company.getId())); + CompanySymbols companySymbol = companySymbolsMap.getSingleObjectByFieldValues(Map.of("companyId", company.getId())); if (companySymbol == null) { log.warn("CompanySymbols not found for companyId={}", company.getId()); } else { @@ -279,10 +272,10 @@ public class CompanyService extends QueueConsumer implements InitializingBean { String prevStatus = company.getWorkflowStatus(); company.setWorkflowStatus(WorkflowStatus.Blocked.getKey()); - log.debug("Update company.id={}", company.getId()); - companyMap.update(company); relationHelper.onChangeWorkflowStatus(transaction, company, prevStatus, company.getWorkflowStatus()); + log.debug("Update company.id={}", company.getId()); + companyMap.update(company); txOk = true; } finally { @@ -292,9 +285,6 @@ public class CompanyService extends QueueConsumer implements InitializingBean { transaction.rollbackTransaction(); } return null; - -// Company company = companyMap.getSingleObjectByID(req.getId()); -// companyMap.delete(company); } } diff --git a/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/CompanyServiceTest.java b/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/CompanyServiceTest.java index eacb5cd11..2112c5b8d 100644 --- a/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/CompanyServiceTest.java +++ b/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/CompanyServiceTest.java @@ -130,9 +130,18 @@ class CompanyServiceTest { //ASSERT waitingWhenAddedRecordAndCheckIt(ID, mockProducer, producerRecord); - Company resultDeleting = companyImdg.getSingleObjectByID(ID); + //Company resultDeleting = companyImdg.getSingleObjectByID(ID); + Company resultDeleting = companyImdg.getSingleObjectBySQL("id=" + ID); Assertions.assertEquals(WorkflowStatus.Blocked.getKey(), resultDeleting.getWorkflowStatus()); - //Assertions.assertNull(resultDeleting); + + { + // Hazelcast 3.12.4 возможно имеет ошибку с NearCache (https://github.com/hazelcast/hazelcast/issues/16577) и её устранили в версии 3.12.7+. + // метод устранения проблемы: вместо return map.get(paramLong); использовать return map.getEntryView(paramLong).getValue(); + Company resultDeletingDirectGet = companyImdg.getSingleObjectByID(ID); + if (!resultDeleting.getWorkflowStatus().equals(resultDeletingDirectGet.getWorkflowStatus())) { + System.out.println("WARNING: Hazelcast error: WorkflowStatus " + resultDeletingDirectGet.getWorkflowStatus() + " and " + resultDeleting.getWorkflowStatus() + " together!"); + } + } } diff --git a/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgTransactionProviderHazelcast.java b/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgTransactionProviderHazelcast.java index f36ccea77..34e9ea3b1 100644 --- a/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgTransactionProviderHazelcast.java +++ b/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgTransactionProviderHazelcast.java @@ -11,9 +11,12 @@ import ru.spcex.platform.imdg.api.ImdgTransaction; public class ImdgTransactionProviderHazelcast implements ImdgTransaction { private TransactionContext ctx; private HazelcastInstance hz; + private boolean txStatus; @Override public Imdg getImdg(String key, Class clazz) { + if (!txStatus) + throw new IllegalStateException("Transaction was not open"); ImdgTransactionalHazelcast imdg = new ImdgTransactionalHazelcast<>(); imdg.setMap(ctx.getMap(key)); imdg.setHzInstance(hz); @@ -35,16 +38,19 @@ public class ImdgTransactionProviderHazelcast implements ImdgTransaction { @Override public void commitTransaction() { this.ctx.commitTransaction(); + txStatus = false; } @Override public void beginTransaction() { this.ctx.beginTransaction(); + txStatus = true; } @Override public void rollbackTransaction() { this.ctx.rollbackTransaction(); + txStatus = false; } public TransactionContext getCtx() { diff --git a/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/service/HazelcastServiceBase.java b/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/service/HazelcastServiceBase.java index c515841f7..0fb7b039f 100644 --- a/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/service/HazelcastServiceBase.java +++ b/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/service/HazelcastServiceBase.java @@ -268,21 +268,18 @@ public abstract class HazelcastServiceBase } } + /** + * Переподключение во время транзакции не предусмотрено. + * Транзакция - объект с коротким жизненным циклом. + * @return + */ @Override public ImdgTransaction newTransaction() { ImdgTransactionProviderHazelcast transactionalContext = new ImdgTransactionProviderHazelcast(); - statusSubscribe(new IHazelcastClusterStatus() { - @Override - public void getAvailable(HazelcastInstance hazelcastNotInited) { - transactionalContext.setHz(hazelcastInstance); - transactionalContext.setCtx(hazelcastNotInited.newTransactionContext( - new TransactionOptions().setTransactionType(TransactionOptions.TransactionType.TWO_PHASE) - )); - } - @Override - public void getUnavailable(HazelcastInstance hazelcastNotInited) { - } - }); + transactionalContext.setHz(hazelcastInstance); + transactionalContext.setCtx(hazelcastInstance.newTransactionContext( + new TransactionOptions().setTransactionType(TransactionOptions.TransactionType.TWO_PHASE) + )); return transactionalContext; }