Sidekiq可以运行带有等待的循环并查看对数据库的更改吗?

问题描述

我有一个sidekiq工作人员,等待远程客户端所做的记录发生更改。类似于以下内容

#myworker async process to wait for client to confirm status

 perform(myRecordID)
   sendClient(myRecordID)
   didClientAckNowledge = false
   while !didClientAckNowledge
    didClientAckNowledge = myRecords.find(myRecordID).status == :ACK_OK
    if didClientAckNowledge 
      break
    end
    # wait for client to perform an update on the record to confirm status
    sleep 5.seconds
   end
   Rails.logger.info("client got the message")
end
   

我的问题是,尽管我可以看到客户端实际上已经执行了确认并使用正确的状态更新(ACK_OK)更新了记录,但是我的sidekiq线程继续看到myRecord的旧状态。

我确定这里的逻辑存在缺陷,但是sidekiq进程似乎无法“看到”对数据库的更改...但是,如果使用Rails控制台,我可以看到客户端实际上已经更新了数据库符合预期...

谢谢!

编辑1

好吧,这是一个想法,而不是循环,我将在5秒内安排对工作人员的另一个呼叫...这是更新的代码

perform(myRecordID,retry_count)
   retry_count -= 1
   if retry_count < 1
      return
   end
   sendClient(myRecordID)
   didClientAckNowledge = false
   if !didClientAckNowledge
    didClientAckNowledge = myRecords.find(myRecordID).status == :ACK_OK
    if didClientAckNowledge 
      Rails.logger.info("client got the message")
      return
    end
    # wait for client to perform an update on the record to confirm status
    myWorker.perform_in(5.seconds)
   end
   Rails.logger.info("client got the message")
end

这似乎可行,但还会进行更多测试。.一个挑战是需要重试计数,这意味着我需要在调用工人之间保持某种变量...

edit2 可能可以通过将时间传递给第一个调用,然后在调用一个实例之前检查是否已超过超时来完成此操作……假设时间还没有停滞不前在异步调用中...

edit3 添加retry_count参数使我们可以控制该工作程序产生的次数...

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...