代码之家  ›  专栏  ›  技术社区  ›  MLZ

获取Rails ActiveJob结果以JSON形式返回控制器的最佳方法?

  •  1
  • MLZ  · 技术社区  · 7 年前

    我正在构建一个web服务,它接受字符串,对其进行解析并将其作为JSON返回。在我的控制器中,我调用一个ActiveJob来运行一个服务来解析数据。我想将ActiveJob的结果返回给我的控制器,以便将其作为JSON返回,但我不确定如何执行。最简单的方法是什么?

    class GeocoderService
      require 'ruby_postal/parser'
    
      def initialize(address)
        @address = address
      end
    
      def parse_address
        address_group = {}
        result = Postal::Parser.parse_address(@address)
        result.each do |r|
          address_group[r.values[0]] = r.values[1]
        end
        address_group
      end
    
    class ParseAddressJob < ApplicationJob
      queue_as :default
    
      def perform(address)
        geo = GeocoderService.new(address)
        result = geo.parse_address
      end
    
    end
    
    class LocationsController < ApplicationController
    
    
    
    def create
        if geo_params[:address]
          ParseAddressJob.perform_later(geo_params[:address])
          render json: result
        else
          render json: { error: "Invalid address"}, status: 400
        end
      end
    
      private
    
      def geo_params
        params.require(:geo).permit(:address)
      end
    end
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   Billy Kimble    7 年前

    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消费者建立自己的排队系统。流程如下所示:

    1. 用户向您的端点发出请求
    2. 端点在名为GeorgeSults的数据库表中插入一条状态为“正在处理”的记录,并插入一条空响应文本。获取此记录的ID。
    3. 您的端点会在您现在所做的操作中触发作业,但现在您也会传入您创建的GeorgeSults记录的ID。
    4. 端点为用户提供了一个URL,用于在GeorgeSults中检查此记录。
    5. 您的消费者开始轮询此端点,直到他们看到“完成”状态
    6. 后台作业完成后,它会将其在GeoResults中的记录(因为它有ID)更新为“完成”状态,并分配地理位置响应文本。
    7. 您的消费者看到更新,并获取响应。