company-service поправил работу с hazelcast (его надо обновить - слишком старая версия с багом в транзакции)

This commit is contained in:
AKurakin 2023-04-06 17:56:17 +03:00
parent 0b1dc8f98d
commit c4b3c918c3
4 changed files with 32 additions and 30 deletions

View file

@ -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<Company> companyMap;
private final Imdg<CompanySymbols> companySymnbolsMap;
// private final Imdg<Relation> relationMap;
private final Imdg<CompanySymbols> 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);
}
}

View file

@ -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!");
}
}
}

View file

@ -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 <T extends SpcexObjectBase> Imdg<T> getImdg(String key, Class<T> clazz) {
if (!txStatus)
throw new IllegalStateException("Transaction was not open");
ImdgTransactionalHazelcast<T> 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() {

View file

@ -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;
}