ActiveJob用于创建在后台运行的任务,并从HTTP请求/响应流异步运行。控制器将任务交给ActiveJob,然后在将来作业运行时控制器返回。如果你需要一个作业的输出,因为它是用户需要的,那么你不应该使用作业——你应该直接调用作业调用的代码并阻塞,直到代码完成,这样你才能获得输出。
def create
if geo_params[:address]
geo = GeocoderService.new(geo_params[:address])
result = geo.parse_address
render json: result
else
render json: { error: "Invalid address"}, status: 400
end
end
如果您真正关心控制器操作在等待地理定位API的响应时将执行的阻塞,那么您可以为API消费者建立自己的排队系统。流程如下所示:
-
用户向您的端点发出请求
-
端点在名为GeorgeSults的数据库表中插入一条状态为“正在处理”的记录,并插入一条空响应文本。获取此记录的ID。
-
您的端点会在您现在所做的操作中触发作业,但现在您也会传入您创建的GeorgeSults记录的ID。
-
端点为用户提供了一个URL,用于在GeorgeSults中检查此记录。
-
您的消费者开始轮询此端点,直到他们看到“完成”状态
-
后台作业完成后,它会将其在GeoResults中的记录(因为它有ID)更新为“完成”状态,并分配地理位置响应文本。
-
您的消费者看到更新,并获取响应。