From c4b3c918c3e6a928bba629099381046e1e56ccc7 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Thu, 6 Apr 2023 17:56:17 +0300 Subject: [PATCH] =?UTF-8?q?company-service=20=D0=BF=D0=BE=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=B8=D0=BB=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=83?= =?UTF-8?q?=20=D1=81=20hazelcast=20(=D0=B5=D0=B3=D0=BE=20=D0=BD=D0=B0?= =?UTF-8?q?=D0=B4=D0=BE=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8=D1=82=D1=8C?= =?UTF-8?q?=20-=20=D1=81=D0=BB=D0=B8=D1=88=D0=BA=D0=BE=D0=BC=20=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D1=80=D0=B0=D1=8F=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8?= =?UTF-8?q?=D1=8F=20=D1=81=20=D0=B1=D0=B0=D0=B3=D0=BE=D0=BC=20=D0=B2=20?= =?UTF-8?q?=D1=82=D1=80=D0=B0=D0=BD=D0=B7=D0=B0=D0=BA=D1=86=D0=B8=D0=B8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../company/service/CompanyService.java | 22 +++++-------------- .../company/service/CompanyServiceTest.java | 13 +++++++++-- .../ImdgTransactionProviderHazelcast.java | 6 +++++ .../service/HazelcastServiceBase.java | 21 ++++++++---------- 4 files changed, 32 insertions(+), 30 deletions(-) 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; }