【问题标题】:rails sidekiq background processrails sidekiq后台进程
【发布时间】:2013-08-01 17:33:28
【问题描述】:

我在配置 sidekiq 服务器时遇到问题,只要我刷新我的页面,该进程似乎就在前台运行。 /consumers/fetch 我需要将其永久置于后台。

consumers_controller.rb

require 'kafka'

class ConsumersController < ApplicationController

  def fetch

    @consumer = Kafka::Consumer.new( { :host => ENV["host"],
        :port => ENV["port"],
        :topic => ENV["topic"]})

    @consumer.loop do |message|
      logger.info "-------------#{message.inspect}--------------"
      logger.info "-------------#{message.first.payload.inspect}--------------"
      unless message.blank?
        ConsumerWorker.perform_async(message.first.payload)
      end
    end
  end
end

consumer_worker.rb

class ConsumerWorker

  include Sidekiq::Worker

  def perform(message)
    payload = message.first["payload"]
    hash = JSON.parse(payload)
    return @message = Message.new(hash) if hash["concern"] == 'order_create' or hash["concern"] == 'first_payment'
  end

end

message.rb

class Message

  attr_reader :bundle_id, :order_id, :order_number, :event

  def initialize(message)
    @payload = message["payload"]
    @bundle_id = @payload["bundle_id"]
    @order_id  = @payload["order_id"]
    @order_number = @payload["order_number"]
    @event = message["concern"]
  end
end

【问题讨论】:

    标签: ruby ruby-on-rails-3 background-process sidekiq


    【解决方案1】:

    我认为你需要移动这个块

    @consumer.loop do |message|
    end
    

    不知何故在你的工作人员内部,因为我认为消费是在块执行之后完成的。

    【讨论】:

    • Hassan,@consumer.loop 是一个连续循环,实现是 while(true){ process mesesage }。我不知道这个过程是如何返回的
    • 实际上,既然我已经仔细研究了它,sidekiq 应该不会给你任何回报。此行: return @message = Message.new(hash) if hash["concern"] == 'order_create' 或 hash["concern"] == 'first_payment' 没有将控制权返回给调用者。
    猜你喜欢
    • 2022-08-28
    • 2016-05-02
    • 2016-01-03
    • 2013-04-02
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    相关资源
    最近更新 更多