2013-08-01 7 views
0

У меня проблема с настройкой сервера sidekiq, процесс, кажется, работает на переднем плане, как только я обновляю свою страницу./consumer/fetch Мне нужно постоянно помещать его в фоновом режиме.rails sidekiq background process

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 - непрерывный цикл, реализация выполняется (правда) {process mesesage}. я не знаю, как процесс возвращается из этого –

+0

, теперь, когда я более подробно рассмотрю его, sidekiq не должен возвращать вам что-либо. Эта строка: return @message = Message.new (hash) if hash ["concern"] == 'order_create' или hash ["concern"] == 'first_payment' не возвращает управление обратно вызывающему. –