我正在使用slack API。我的脚本做一堆外部处理,在某些情况下,它可能需要大约3-6秒。正在发生的事情是Slack API期望在3秒内响应200,因为我的函数在3秒内没有完成,它再次重试,然后它最终发布相同的自动响应2-3次。
我通过注释所有的函数来确认这一点,我没有问题,它发布了对slack的响应。然后我增加了睡眠10,它做了3次相同的反应,所以唯一不同的是它花了更长的时间。
从我读到的,我需要有线程响应。然后,我需要首先响应线程1中的slack API,然后继续处理我的函数。
这是我尝试的:
def events
Thread.new do
json = {
"text": "Here is your 200 response immediately slack",
}
render(json: json)
end
puts "--------------------------------Json response started----------------------"
sleep 30
puts "--------------------------------Json response completed----------------------"
puts "this is a successful response"
end
当我测试它时,同样的问题发生了,所以我尝试使用在线API测试器,它点击页面,等待30秒,然后返回200响应,但我需要它立即响应200,然后处理其余的,否则我会得到重复。
我是否正确使用线程,或者是否有另一种方法来绕过这个Slack API 3秒响应限制?我是rails和slack API的新手,所以这里有点迷路了。
欣赏你的眼睛:)
如果你不需要在响应中使用代码的结果,我建议使用ActionJob在后台运行代码。首先,运行以下命令创建一个ActiveJob作业:
bin/rails generate job do_stuff
然后打开在app/jobs/do_stuff_job.rb
中创建的文件并编辑#perform
函数以包含您的代码(因此示例中的puts
语句和sleep 30
)。最后,从控制器动作中,你可以调用DoStuff.perform_later
,你的作业将在后台运行!你的最终控制器动作看起来像这样:
def events
DoStuff.perform_later # this schedules DoStuff to be done later, in
# the background, so it will return immediately
# and continue to the next line.
json = {
"text": "Here is your 200 response immediately slack",
}
render(json: json)
end
作为题外话,我强烈建议不要在rails中使用
Thread.new
。它可以创建一些真正令人困惑的行为,特别是在测试脚本中,有很多原因,但通常是因为它如何与打开的连接,特别是ActiveRecord交互。