Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 将成功和失败处理程序传递给ActiveJob_Ruby_Lambda_Callback_Rails Activejob - Fatal编程技术网

Ruby 将成功和失败处理程序传递给ActiveJob

Ruby 将成功和失败处理程序传递给ActiveJob,ruby,lambda,callback,rails-activejob,Ruby,Lambda,Callback,Rails Activejob,我有一个ActiveJob,它应该通过HTTP从外部系统加载一段数据。当该作业完成时,我希望将第二个作业排队,该作业执行一些后处理,然后将数据提交到其他外部系统 我不想让第一份工作知道第二份工作,因为 封装 可重用性 基本上,这不关第一份工作的事 类似地,我不希望第一个作业关心如果数据加载失败会发生什么——可能用户收到通知,可能我们在超时后重试,可能我们只是记录并举手——同样,它可能会根据异常的详细信息而变化,而且作业不需要包含逻辑,也不需要连接到其他系统来处理它 在Java(这是我最有经验的地

我有一个ActiveJob,它应该通过HTTP从外部系统加载一段数据。当该作业完成时,我希望将第二个作业排队,该作业执行一些后处理,然后将数据提交到其他外部系统

我不想让第一份工作知道第二份工作,因为

  • 封装
  • 可重用性
  • 基本上,这不关第一份工作的事
  • 类似地,我不希望第一个作业关心如果数据加载失败会发生什么——可能用户收到通知,可能我们在超时后重试,可能我们只是记录并举手——同样,它可能会根据异常的详细信息而变化,而且作业不需要包含逻辑,也不需要连接到其他系统来处理它

    在Java(这是我最有经验的地方)中,我可以使用类似Guava的东西在事件发生后添加成功和失败回调:

    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进行传递