这是我的代码
//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;
}
答案 0 :(得分:0)
storeHeartbeat是局部变量吗?如果是,则线程不缓存该变量,否则将 volatile
添加到您的类字段或使用 ThreadLocal
类。如果你使用hibernate,它可能是hibernate缓存的问题。更确切地说,我应该看到更多你的代码