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 org.springframework.stereotype.Service;
|
||||||
import ru.clearing.classes.statics.data.company.Company;
|
import ru.clearing.classes.statics.data.company.Company;
|
||||||
import ru.clearing.classes.statics.data.company.CompanySymbols;
|
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.error.CompanyErrors;
|
||||||
import ru.spcex.clearing.company.util.RequestHelper;
|
import ru.spcex.clearing.company.util.RequestHelper;
|
||||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
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 ru.spcex.platform.utils.validation.IValidator;
|
||||||
|
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
// todo добавить транзакции! Это важно из-за AccountNotification
|
|
||||||
@Service
|
@Service
|
||||||
public class CompanyService extends QueueConsumer implements InitializingBean {
|
public class CompanyService extends QueueConsumer implements InitializingBean {
|
||||||
|
|
||||||
private final Logger log = LoggerFactory.getLogger(getClass());
|
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||||
private final RequestHelper requestHelper;
|
private final RequestHelper requestHelper;
|
||||||
private final ImdgProvider imdgProvider;
|
private final ImdgProvider imdgProvider;
|
||||||
// private final Imdg<Company> companyMap;
|
private final Imdg<CompanySymbols> companySymbolsMap;
|
||||||
private final Imdg<CompanySymbols> companySymnbolsMap;
|
|
||||||
// private final Imdg<Relation> relationMap;
|
|
||||||
private final ImdgId idSequence;
|
private final ImdgId idSequence;
|
||||||
protected UserRoleVerification userRoleVerification;
|
protected UserRoleVerification userRoleVerification;
|
||||||
protected IMessageResolver messageResolver;
|
protected IMessageResolver messageResolver;
|
||||||
|
|
@ -81,11 +76,8 @@ public class CompanyService extends QueueConsumer implements InitializingBean {
|
||||||
this.imdgProvider = imdgProvider;
|
this.imdgProvider = imdgProvider;
|
||||||
this.messageResolver = messageResolver;
|
this.messageResolver = messageResolver;
|
||||||
this.requestHelper = new RequestHelper(log, 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.companySymbolsMap = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
|
||||||
this.companySymnbolsMap = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
|
|
||||||
this.idSequence = imdgProvider.getImdgIdGenerator();
|
this.idSequence = imdgProvider.getImdgIdGenerator();
|
||||||
this.userRoleVerification = userRoleVerification;
|
this.userRoleVerification = userRoleVerification;
|
||||||
this.validationHelper = validationHelper;
|
this.validationHelper = validationHelper;
|
||||||
|
|
@ -213,6 +205,7 @@ public class CompanyService extends QueueConsumer implements InitializingBean {
|
||||||
} else {
|
} else {
|
||||||
log.trace("Null new WorkflowStatus");
|
log.trace("Null new WorkflowStatus");
|
||||||
}
|
}
|
||||||
|
companyMap.update(company);
|
||||||
txOk = true;
|
txOk = true;
|
||||||
} finally {
|
} finally {
|
||||||
if (txOk)
|
if (txOk)
|
||||||
|
|
@ -269,7 +262,7 @@ public class CompanyService extends QueueConsumer implements InitializingBean {
|
||||||
|
|
||||||
company.setUpdated(Instant.now());
|
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) {
|
if (companySymbol == null) {
|
||||||
log.warn("CompanySymbols not found for companyId={}", company.getId());
|
log.warn("CompanySymbols not found for companyId={}", company.getId());
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -279,10 +272,10 @@ public class CompanyService extends QueueConsumer implements InitializingBean {
|
||||||
|
|
||||||
String prevStatus = company.getWorkflowStatus();
|
String prevStatus = company.getWorkflowStatus();
|
||||||
company.setWorkflowStatus(WorkflowStatus.Blocked.getKey());
|
company.setWorkflowStatus(WorkflowStatus.Blocked.getKey());
|
||||||
log.debug("Update company.id={}", company.getId());
|
|
||||||
companyMap.update(company);
|
|
||||||
|
|
||||||
relationHelper.onChangeWorkflowStatus(transaction, company, prevStatus, company.getWorkflowStatus());
|
relationHelper.onChangeWorkflowStatus(transaction, company, prevStatus, company.getWorkflowStatus());
|
||||||
|
log.debug("Update company.id={}", company.getId());
|
||||||
|
companyMap.update(company);
|
||||||
|
|
||||||
txOk = true;
|
txOk = true;
|
||||||
} finally {
|
} finally {
|
||||||
|
|
@ -292,9 +285,6 @@ public class CompanyService extends QueueConsumer implements InitializingBean {
|
||||||
transaction.rollbackTransaction();
|
transaction.rollbackTransaction();
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
// Company company = companyMap.getSingleObjectByID(req.getId());
|
|
||||||
// companyMap.delete(company);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -130,9 +130,18 @@ class CompanyServiceTest {
|
||||||
//ASSERT
|
//ASSERT
|
||||||
waitingWhenAddedRecordAndCheckIt(ID, mockProducer, producerRecord);
|
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.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 {
|
public class ImdgTransactionProviderHazelcast implements ImdgTransaction {
|
||||||
private TransactionContext ctx;
|
private TransactionContext ctx;
|
||||||
private HazelcastInstance hz;
|
private HazelcastInstance hz;
|
||||||
|
private boolean txStatus;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <T extends SpcexObjectBase> Imdg<T> getImdg(String key, Class<T> clazz) {
|
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<>();
|
ImdgTransactionalHazelcast<T> imdg = new ImdgTransactionalHazelcast<>();
|
||||||
imdg.setMap(ctx.getMap(key));
|
imdg.setMap(ctx.getMap(key));
|
||||||
imdg.setHzInstance(hz);
|
imdg.setHzInstance(hz);
|
||||||
|
|
@ -35,16 +38,19 @@ public class ImdgTransactionProviderHazelcast implements ImdgTransaction {
|
||||||
@Override
|
@Override
|
||||||
public void commitTransaction() {
|
public void commitTransaction() {
|
||||||
this.ctx.commitTransaction();
|
this.ctx.commitTransaction();
|
||||||
|
txStatus = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void beginTransaction() {
|
public void beginTransaction() {
|
||||||
this.ctx.beginTransaction();
|
this.ctx.beginTransaction();
|
||||||
|
txStatus = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void rollbackTransaction() {
|
public void rollbackTransaction() {
|
||||||
this.ctx.rollbackTransaction();
|
this.ctx.rollbackTransaction();
|
||||||
|
txStatus = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public TransactionContext getCtx() {
|
public TransactionContext getCtx() {
|
||||||
|
|
|
||||||
|
|
@ -268,21 +268,18 @@ public abstract class HazelcastServiceBase
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Переподключение во время транзакции не предусмотрено.
|
||||||
|
* Транзакция - объект с коротким жизненным циклом.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public ImdgTransaction newTransaction() {
|
public ImdgTransaction newTransaction() {
|
||||||
ImdgTransactionProviderHazelcast transactionalContext = new ImdgTransactionProviderHazelcast();
|
ImdgTransactionProviderHazelcast transactionalContext = new ImdgTransactionProviderHazelcast();
|
||||||
statusSubscribe(new IHazelcastClusterStatus() {
|
transactionalContext.setHz(hazelcastInstance);
|
||||||
@Override
|
transactionalContext.setCtx(hazelcastInstance.newTransactionContext(
|
||||||
public void getAvailable(HazelcastInstance hazelcastNotInited) {
|
new TransactionOptions().setTransactionType(TransactionOptions.TransactionType.TWO_PHASE)
|
||||||
transactionalContext.setHz(hazelcastInstance);
|
));
|
||||||
transactionalContext.setCtx(hazelcastNotInited.newTransactionContext(
|
|
||||||
new TransactionOptions().setTransactionType(TransactionOptions.TransactionType.TWO_PHASE)
|
|
||||||
));
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public void getUnavailable(HazelcastInstance hazelcastNotInited) {
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return transactionalContext;
|
return transactionalContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue