【问题标题】:Not fetching latest record after Thread.sleep() in while loop in Java在Java的while循环中的Thread.sleep()之后没有获取最新记录
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2020-10-24
    • 2012-02-06
    • 1970-01-01
    • 2015-05-26
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多