2013-08-01 38 views
0

我在配置sidekiq服务器时出现问题,只要我刷新页面,该进程似乎在前台运行。 /消费者/抓取我需要将其放在后台永久。rails sidekiq后台进程

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 

回答

0

我认为你需要移动此块

@consumer.loop do |message| 
end 

不知何故,因为我认为消耗是在块执行后完成的。

+0

Hassan,@ consumer.loop是一个连续循环,其实现是while(true){process mesesage}。我不知道这个过程是如何从这个 –

+0

实际返回的,现在我已经仔细研究了它,sidekiq不应该返回任何东西。 此行: 返回@message = Message.new(散列)如果散列[“关注”] =='order_create'或散列[“关注”] =='first_payment' 不返回控制权给调用者。 –