【发布时间】:2018-09-08 07:04:52
【问题描述】:
这是我的代码
//This will load storeHeartbeat record from db
StoreHeartbeat storeHeartbeat = storeHeartbeatService.findByStoreId(context, locationId);
while (true)
{
if (storeHeartbeat.getCurrentHeatbeatDatetime().isAfter(jobTriggeredTime))
break;
else
TimeUnit.MILLISECONDS.sleep(300000);
//Again loading storeHeartbeat to get updated value.
storeHeartbeat = storeHeartbeatService.findByStoreId(context, locationId);
}
这里我有一个无限循环,我正在检查一个条件,如果条件匹配我想退出循环,否则我想睡 5 分钟,然后通过从 db 加载最新的心跳记录重试.
问题:我没有得到更新的心跳记录,总是得到最初加载的旧记录,即使我正在更新记录(当线程处于睡眠状态时)。
任何建议我在这里缺少什么? 是否有任何线程缓存保存旧值?如果是这样,我该如何实现?
注意:条件可以正常工作,没有问题
编辑:这是我的 findByStoreId 方法
@Override
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
public StoreHeartbeat findByStoreId(Context context, String storeId)
{
QStoreHeartbeatEntity qStoreHeartbeat = QStoreHeartbeatEntity.storeHeartbeatEntity;
JPQLQuery query = createQueryObject(context);
StoreHeartbeat result = (StoreHeartbeat) query.from(qStoreHeartbeat).where(
qStoreHeartbeat.storeId.eq(storeId == null ? "XXXXXXXXXXXX" : storeId)).uniqueResult(qStoreHeartbeat);
return result;
}
【问题讨论】:
-
代码似乎没问题。你调试后检查过吗,findByStoreId 每 5 分钟返回什么。另外,你能分享一下那个函数的代码吗?
-
您的函数 findByStoreId() 似乎没有为您提供给定上下文 locationId 的最新值。需要更多信息来回答这个问题
-
Note : Condition works fine no issue with it你确定吗?您使用的是哪种持久性?您可能有缓存问题,但在持久层中 -
请发帖minimal reproducible example。其中包括来自 storeHeartbeatService 的相关代码。
-
@AmanChhabra - 是的,我调试了,它正在返回旧记录。
标签: java multithreading