Ruby 将成功和失败处理程序传递给ActiveJob
我有一个ActiveJob,它应该通过HTTP从外部系统加载一段数据。当该作业完成时,我希望将第二个作业排队,该作业执行一些后处理,然后将数据提交到其他外部系统 我不想让第一份工作知道第二份工作,因为Ruby 将成功和失败处理程序传递给ActiveJob,ruby,lambda,callback,rails-activejob,Ruby,Lambda,Callback,Rails Activejob,我有一个ActiveJob,它应该通过HTTP从外部系统加载一段数据。当该作业完成时,我希望将第二个作业排队,该作业执行一些后处理,然后将数据提交到其他外部系统 我不想让第一份工作知道第二份工作,因为 封装 可重用性 基本上,这不关第一份工作的事 类似地,我不希望第一个作业关心如果数据加载失败会发生什么——可能用户收到通知,可能我们在超时后重试,可能我们只是记录并举手——同样,它可能会根据异常的详细信息而变化,而且作业不需要包含逻辑,也不需要连接到其他系统来处理它 在Java(这是我最有经验的地
MyDataLoader loader = new MyDataLoader(someDataSource)
ListenableFuture<Data> future = executor.submit(loader);
Futures.addCallback(future, new FutureCallback<Data>() {
public void onSuccess(Data result) {
processData(result);
}
public void onFailure(Throwable t) {
handleFailure(t);
}
});
(旁注:我不知道将lambdas声明为参数的yardoc语法是什么。这看起来正确吗,或者,如果不正确,可能是合理的?)
然后,调用者必须传入以下内容:
MyRecordLoader.perform_later(
some_data_source,
method(:process_data),
method(:handle_failure)
)
这并不可怕,至少在通话方面是这样,但它似乎很笨重,我不禁怀疑这其中有一个共同的模式,我只是没有找到。我有点担心,作为一个Ruby/Rails新手,我只是想让ActiveJob做一些本来就不该做的事情。我发现的所有ActiveJob示例都是“激发并忘记”——异步“返回”结果似乎不是ActiveJob用例
另外,我也不清楚,对于在单独进程中运行作业的后端(如Resque)来说,这是否会起作用
“Ruby方式”是什么
更新:正如dre hh所说,ActiveJob在这里不是合适的工具。它也是不可靠的,并且在这种情况下过于复杂。我改为使用它,它更适合用例,而且由于任务主要是IO绑定的,所以即使在MRI上也足够快。ActiveJob不是一个像未来或承诺一样的异步库 它只是一个在后台执行任务的界面。当前线程/进程未收到此操作的任何结果 例如,当使用Sidekiq作为ActiveJob队列时,它将把perform方法的参数序列化到redis存储中。在rails应用程序上下文中运行的另一个守护进程将监视redis队列,并用序列化数据实例化您的工作者
所以传递回调可能没问题,但是为什么要将它们作为另一个类上的方法呢。如果回调是动态的(在不同的调用中改变),那么传递回调是有意义的。但是,在调用类上实现它们时,只需将这些方法移到您的作业工类中。我不需要原始过程来获得结果,我只需要在调用时可用的代码/数据来处理结果(或者处理失败)。但也许你是对的,ActiveJob在这里是错误的工具。不,如果你不需要结果就可以了。我只想让RecordLoader更智能,让失败和成功的方法自己实现。因此,您不需要将它们作为PROC进行传递