2016-12-26 44 views
0

我真的是Ruby的新手。我理解語言,但我很難找到正確的方式來構建項目,有很多文章和教程建議不要使用簡單的ruby命令運行,但例如rackup。如果我的應用程序使用多個gem,那麼我無法使用其他命令的想法,這些命令用作包裝器?SIdekiq不執行異步(Sinatra&Rack)

至於我的項目。我創建簡單的API與Sinatra & Rack & Sidekiq,我開始我的應用程序如下。

rackup -p1600 --host 192.168.0.130 config.ru 

但我使用sidekiq剛剛開始,它需要Redis server我已經安裝了它,現在一切工作沒有錯誤。

但問題是我的任務沒有被處理。

這裏是我的榜樣

我的終點

post '/items' do 
    item_url = params[:item_url] 
    halt(400, {error: 'Item url is not provided'}.to_json) if item_url.nil? 
    begin 
     item_handler = ItemHandler.new item_url 
     item_handler.start_processing 
     item_handler.item_status.to_json 
    rescue APIErrors::AlreadyExistsError => e 
     halt(409, {error: e.message}.to_json) 
    rescue APIErrors::InvalidPayloadError => e 
     halt(400, {error: e.message}.to_json) 
    end 
    end 

而且我ItemHandler

Sidekiq.configure_server do |config| 
    config.redis = {password: 'password'} 
end 
Sidekiq.configure_client do |config| 
    config.redis = {password: 'password'} 
end 

class ItemHandler 
... 
... 
... 
    def start_processing 
    ItemWorker.perform_async(@item.id) 
    end 

而且finnally ItemWorker

require 'sidekiq' 

class ItemWorker 
    include Sidekiq::Worker 
    attr_accessor :item 

    def perform(id) 
    # Get item model 
    @item = ItemModel.where(_id: id) 
    logger.info "Doing hard work" 
    puts @item.status 
    # Start item processing 
    process_item 
    end 

    def process_item 
    logger.info "Doing hard work" 
    puts 'Start processing' 
    @item.status = ItemModel::STATUS[:downloading] 
    @item.save 
    result = download_item_file 
    if result > RESULT_OK 
     @item.status = ItemModel::STATUS[:failed_download] 
     @item.save 
     puts 'Failed to download file' 
    else 
     puts 'File downloaded' 
     @item.status = ItemModel::STATUS[:downloaded] 
     @item.save 
    end 
    end 

    def download_item_file 
    return if @item.nil? 
    dl_command = EXTERNAL_DOWNLOAD.dup 
    dl_command['|url|'] = @item.url 
    system dl_command 
    $?.exitstatus 
    end 
end 

並沒有什麼發生,在控制檯沒有輸出,什麼都沒有。以前我用fork而不是sidekiq,它工作正常。

請幫我找到問題。

P.S.如果我以錯誤的方式做其他事情(不遵循最佳做法&指南),請告訴我。

+1

它仍然無法使用?一切似乎都很好,你可以確定在觸發該功能後我們的日誌? – amrdruid

回答

1

下面是一個完整的示例應用程序使用sidekiq/redissinatra壞:

~/sinatra_projects$ tree myapp/  
myapp/ 
├── config.ru 
├── item_handler.rb 
├── item_worker.rb 
└── sinatra_app.rb 

sinatra_app.rb

require 'sinatra' 
require_relative 'item_handler' #=>look for item_handler.rb in the same directory as this file 

get '/' do 
    "hello world" 
end 

post '/item' do 
    puts "--->#{params[:item_url]}<---" 

    item_handler = ItemHandler.new params[:item_url] 
    item_handler.start_processing 

    "Thanks for the work\n" 
end 

item_handler.rb

require_relative 'item_worker' #look for item_worker.rb in the same directory as this file 

class ItemHandler 
    def initialize(url) 
    @url = url 
    end 

    def start_processing 
    ItemWorker.perform_async @url 
    end 
end 

item_worker.rb

require 'sidekiq' 

Sidekiq.configure_server do |config| 
    #Not much documentation on what you can/should do in here 
end 

Sidekiq.configure_client do |config| 
    #Not much documentation on what you can/should do in here 
end 

class ItemWorker 
    include Sidekiq::Worker 

    def perform(url) 
    logger.info "Things are happening" 

    case url 
    when /joe_blow.com/ 
     sleep 5 
     logger.info "joe_blow.com took a really long time" 
    when /twitter_clone.com/ 
     sleep 3 
     logger.info "twitter_clone.com was pretty slow" 
    else /google.com/ 
     sleep 1 
     logger.info "google.com response was the quickest" 
    end 

    end 

end 

配置。RU

require_relative 'sinatra_app' #=>look for sinatra_app.rb in the same directory as this file 

run Sinatra::Application 

要得到的東西和運行:

1)Download並安裝Redis的(不一樣的Redis的寶石),然後在terminal_window1啓動redis的:

$ ~/Downloads/redis-3.2.6/src$ ./redis-server 

2)安裝sidekiq gem(它也將安裝redis gem,因爲它是依賴項):

$ gem install sidekiq 

3)terminal_window2開始sidekiq:

~/sinatra_projects/myproj$ sidekiq -r ./item_worker.rb 

4)啓動西納特拉應用在terminal_window3:

~/sinatra_projects/myproj$ rackup config.ru 

5)發送POST請求到您的應用程序在terminal_window4:

$ curl --data "item_url=http://joe_blow.com" http://localhost:9292/item 

立即捲曲窗口將顯示輸出:

Thanks for the work 

和sidekiq窗口將顯示輸出:

2016-12-28T02:34:59.149Z 12387 TID-oxt2yycrk ItemWorker JID-b9190f121541d82f21483497 INFO: start 
2016-12-28T02:34:59.149Z 12387 TID-oxt2yycrk ItemWorker JID-b9190f121541d82f21483497 INFO: Things are happening 

五秒鐘後,sidekiq窗口會顯示:

2016-12-28T02:35:04.153Z 12387 TID-oxt2yycrk ItemWorker JID-b9190f121541d82f21483497 INFO: joe_blow.com took a really long time 
2016-12-28T02:35:04.154Z 12387 TID-oxt2yycrk ItemWorker JID-b9190f121541d82f21483497 INFO: done: 5.004 sec 

如果您發送快速連續3個捲曲請求(up_arrow +返回):

$ curl --data "item_url=http://joe_blow.com" http://localhost:9292/item 
Thanks for the work 
$ curl --data "item_url=http://joe_blow.com" http://localhost:9292/item 
Thanks for the work 
$ curl --data "item_url=http://joe_blow.com" http://localhost:9292/item 
Thanks for the work 

然後在sideqik窗口中您會看到:

2016-12-28T02:38:01.218Z 12387 TID-oxt2yycrk ItemWorker JID-3c8db3dc597789eefaf3d7e6 INFO: start 
2016-12-28T02:38:01.218Z 12387 TID-oxt2yycrk ItemWorker JID-3c8db3dc597789eefaf3d7e6 INFO: Things are happening 
2016-12-28T02:38:01.983Z 12387 TID-oxt319uyc ItemWorker JID-d5a4f4fa5388b2fdb94b8549 INFO: start 
2016-12-28T02:38:01.983Z 12387 TID-oxt319uyc ItemWorker JID-d5a4f4fa5388b2fdb94b8549 INFO: Things are happening 
2016-12-28T02:38:02.602Z 12387 TID-oxt2y8eec ItemWorker JID-dd8b2ce2e558f5a88a1836fa INFO: start 
2016-12-28T02:38:02.602Z 12387 TID-oxt2y8eec ItemWorker JID-dd8b2ce2e558f5a88a1836fa INFO: Things are happening 

...時光流逝...

2016-12-28T02:38:06.220Z 12387 TID-oxt2yycrk ItemWorker JID-3c8db3dc597789eefaf3d7e6 INFO: joe_blow.com took a really long time 
2016-12-28T02:38:06.220Z 12387 TID-oxt2yycrk ItemWorker JID-3c8db3dc597789eefaf3d7e6 INFO: done: 5.003 sec 
2016-12-28T02:38:06.985Z 12387 TID-oxt319uyc ItemWorker JID-d5a4f4fa5388b2fdb94b8549 INFO: joe_blow.com took a really long time 
2016-12-28T02:38:06.985Z 12387 TID-oxt319uyc ItemWorker JID-d5a4f4fa5388b2fdb94b8549 INFO: done: 5.002 sec 
2016-12-28T02:38:07.603Z 12387 TID-oxt2y8eec ItemWorker JID-dd8b2ce2e558f5a88a1836fa INFO: joe_blow.com took a really long time 
2016-12-28T02:38:07.603Z 12387 TID-oxt2y8eec ItemWorker JID-dd8b2ce2e558f5a88a1836fa INFO: done: 5.001 sec 

而不是採取總共15秒的運行所有三名工人5秒所有三名工人完成之後。

1

謝謝大家的幫助,我才意識到一個重要的事情,使sidekiq工作,首先應當啓動:))

所以我只是用這個命令來啓動「sidekiq」,現在工作正常。

sidekiq -r ./item_downloader.rb 

+1

感謝您發佈該信息。我從你的例子中創建了一個更簡單的應用程序,我也看不到任何日誌消息。我一直把頭撞在牆上一天。從你的文章中不清楚你應該在'sidekiq'命令中指定哪個文件 - 我指定了包含內含行'include Sidekiq:Worker'的類的文件,例如, item_worker.rb。然後在我發出sideqik命令的終端窗口(v。我發出了機架配置命令的窗口或我開始redis的窗口)中,我可以看到記錄的消息。 – 7stud