在Java中的while循环中的Thread.sleep()之后没有获取最新记录

时间:2018-03-29 10:45:46

标签: java multithreading

这是我的代码

//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;
}

1 个答案:

答案 0 :(得分:0)

storeHeartbeat是局部变量吗?如果是,则线程不缓存该变量,否则将 volatile 添加到您的类字段或使用 ThreadLocal 类。如果你使用hibernate,它可能是hibernate缓存的问题。更确切地说,我应该看到更多你的代码