我遇到的问题是,在某些极少数情况下(<1%),现有实体无法正确更新。在所有其他情况下,它都按预期运行。
堆栈:JPA和Hibernate,Wildfly10(群集),Ubuntu,PostgreSQL(主/从设置)
发生了什么事?
PAID
。浏览器每3秒执行一次请求,以拉出ContractEntity的状态setContractToPaidAndNotifyUsers()
。这应将ContractEntity的状态更改为PAID
,但保持在状态STARTED
。没有记录错误,此后发生的其他函数调用也可以正常工作(发送电子邮件)。因此,我认为在提交数据库事务时会发生错误。
这是webhook调用的功能:
@Stateless
public class ContractBoundary {
@Inject
private ContractControl contractControl;
private void setContractToPaidAndNotifyUsers(PaymentEntity paymentEntity, ContractEntity contractEntity, final String paidResourceId) {
// This is not working (no error, but the contract remains on status STARTED
contractEntity.setStatus(ContractStatusEnum.PAID);
contractEntity.setPaidResourceId(paidResourceId);
ContractEntity updatedContractEntity = contractControl.update(contractEntity);
// These are working
mailControl.sendMoneyArrivedMailToPayee(
contractBoundary.getContractLink(updatedContractEntity.getContractCode()),
updatedContractEntity.getTitle(), updatedContractEntity.getPayer(), updatedContractEntity.getPayee(),
eventMoneyArrivedForPayee);
mailControl.sendMoneyArrivedMailToPayer(
contractBoundary.getContractLink(updatedContractEntity.getContractCode()), contractEntity.getTitle(),
updatedContractEntity.getPayer(), updatedContractEntity.getPayee(), eventMoneyArrivedForPayer);
}
}
这是contractControl
中的更新功能
public class ContractControl extends BasicCrudControl {
// ... more CRUD functions
public ContractEntity update(final ContractEntity contract) {
ContractEntity update = super.update(contract);
return update;
}
}
这是BasicCRUDControl的更新功能:
protected <T> T update(final T entityToUpdate) {
T t = this.em.merge(entityToUpdate);
return t;
}
我必须在em.flush();
函数中运行em.refresh();
或update
吗?
因为它仅在某些情况下发生,所以我认为在调用Webhook的同时执行来自用户浏览器的请求时可能会出现问题,这可能会导致一些麻烦。
我还认识到ContractControl
没有@Stateless
注释,这会导致问题,因为ContractBoundary
被标记为无状态并且正在注入ContractControl
吗?
感谢您的帮助!