2016-05-03 2 views
0

У меня есть работник sidekiq, который подключается к удаленной базе данных odbc, извлекает данные и затем обновляет локальную базу данных. Теперь я раскалываю рабочего на двух рабочих. Один будет подключаться и извлекать данные, а другой - обновлять записи.Sidekiq: передать объект как параметр

Соединение возвращает объект #<OCI8::Cursor:0x00000007703f30>, что я передаю параметры второму работнику.

SecondWorker.perform_async({:odbc => connection}) 

Во второй работник я попытался использовать его:

def perform(options) 
    order_odbc = options['odbc'] 
end 

Но он рассматривает объект как строку

"#<OCI8::Cursor:0x00000006bddf48>":String 

Есть ли другой способ передать объекты в параметрах? (string, integer и т. Д.).

ответ

2

Sidekiq recommends, что аргументы для задания передаются как простые типы данных (string, integer и т. Д.).

Мой вопрос для вас - и я понимаю, что это не может быть вариантом в ваших деловых правилах и ограничениях - это «вам действительно нужен второй рабочий»?

Я могу рассмотреть вариант с обслуживанием или другим классом, выполняющим работу; вместо того, чтобы отталкивать другого работника.

# Inside First Worker 
SomeCoolClass.delay.method(params) 

С delay, этот метод будет обрабатывать асинхронно, и в моем опыте, я не имел проблемы со сложными объектами в таких случаях (в зависимости от вопросов, которые я имел, когда я проходил мимо сложные объекты/данные для работника) ,

Как я уже упоминал, может не работать для вашего приложения, но он хотел предложить предложение, поскольку он работал для меня в моих прецедентах.

+0

Спасибо. Цель состоит в том, чтобы минимизировать рабочую нагрузку первого рабочего, когда он сначала подключается к серверу, извлекает данные и затем обновляет записи. Поэтому я решил начать новый рабочий. – Arif

+0

Поскольку вы будете использовать другой метод (т. Е. Код, который будет представлять «второго рабочего») в качестве метода асинхронизации, он освобождает самого Рабочего. Я не уверен, но может ошибаться, что вы получите какие-либо «выгоды» от перевода этого кода второму работнику. Используя вызов async 'delay', рабочий перемещается и т. Д. –

0

Вы можете преобразовать свой объект в хэш. Это не лучший способ, но он работает.

Дополнительная информация here преобразовать объект в хэш.

Смежные вопросы