Je suis vraiment novice à Ruby. Je comprends la langue, mais il est vraiment difficile pour moi d'obtenir la bonne façon de structurer le projet, il y a beaucoup d'articles et de tutoriels qui suggèrent de ne pas exécuter avec la simple commande ruby
mais par exemple rackup
. Je ne peux pas avoir une idée de l'utilisation d'autres commandes si mon application utilisant plusieurs gemmes, il est utilisé comme un wrapper?SIdekiq n'effectue pas d'async (Sinatra & Rack)
Comme pour mon projet. Je crée une API simple avec Sinatra
& Rack & Sidekiq
, je commence mon application comme suit.
rackup -p1600 --host 192.168.0.130 config.ru
Mais je viens de commencer à utiliser sidekiq
et il a fallu que je l'ai installé Redis server
, maintenant tout fonctionne sans erreur.
Mais le problème est que ma tâche n'est pas en cours de traitement.
Voici mon exemple
Mon point final
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
Et mon 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
Et 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
Et rien arrive, pas de sortie dans la console, rien. Auparavant, j'ai utilisé fork
au lieu de sidekiq
et cela a bien fonctionné.
S'il vous plaît aidez-moi à trouver le problème.
P.S. Si je fais quelque chose d'autre dans un mauvais sens (ne suivez pas les bonnes pratiques & directives) s'il vous plaît faites le moi savoir.
Cela ne fonctionne toujours pas? tout semble bien, pouvez-vous sûr avec nous les journaux après le déclenchement de la fonction? – amrdruid