company-service поправил работу с hazelcast (его надо обновить - слишком старая версия с багом в транзакции)
This commit is contained in:
parent
0b1dc8f98d
commit
c4b3c918c3
4 changed files with 32 additions and 30 deletions
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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!");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue