طولانی شدن کار کنترلر


#1

سلام
دوستان من تویه یکی از اکشن های کنترلر ام یه کار زمانبری رو دارم انجام میدم که حدود 3 دقیقه طول میکشه انجام بشه ولی به صورت عادی تو سرور به این اررور بر میخورم :‌

روش خاصی یا جم خوبی رو سراغ دارید که دیگه این اتفاق نیوفته ؟


#2

background job چیزی هست که شما نیاز داری. sidekiq رو ببین. در ضمن عکسی که گذاشتین اصلا معلوم نیست


#3

ممنون ، ولی sidekiq نیازمنده redis هست ، نمیشه بدون redis کار کنه ؟ چون برای یه کار ساده نمیخوام redis نصب کنم ، نمیشه از active job استفاده کنم این مشکلم رو حل میکنه ؟
برای توضیح کارم که تویه کنترلر دارم انجام میدم این هست که من یه فایلی csv که شامل 4000 رکورد هست رو دونه به دونه میخونم و میریزم تو دیتابیس حالا چون طول میکشه در حد 3 دقیقه است میخوام دیگه اررور بهم نده برای اینکه طول کشیده و میخوام بره هر چقدر که زمان میخواد انجامش بده و بعد بهم callback بده


#4

از activejob هم میشه استفاده کنید اگرredis و نمیشه اضافه کنید هدف اصلی اینکه که کاری طول میکشه در background انجام بشه و درخواست و block نکنه


#5

الان برای تست یه جاب ساختم و تابع perform رو به این شکل توش نوشتم :‌

(def perform(file_location

end
و بعد داخل کنترلر ام به این شکل استفادش کردم :‌
(SyncStudentsJob.perform_now(file_location
و درست هم کارکرد ولی باز مرورگر ام منتظر جواب بود :pensive:
به نظرتون به شکل درستی دارم استفادش میکنم ؟


#6

باید از متد perfom_later استفاده کنید


#7

ممنون ، من تویه اون فاکشن در داخل job ام مقدار بازگشتی دارم ولی گویا بهم مقدار بازگشتی نمیده ؟ برای این هم پیشنهادی دارید ؟‌


#8

با استفاده از background job دستور non blocking اجرا میشه و چون در یک thread جدا این اجرا میشه دسترسی به داده بازگشتی این متد در thread اصلی نداریم اگر. به داده نیاز داریدمیتونید داده رو در دیتابیس ذخیره کنید


#9

خیلی ممنونم


#10

من با active job زدم ولی نشد ، یعنی باز این اررور رو داد و دوباره با sideqkiq و با متد perform_async استفاده کردم و باز این اررور داده :‌

اررور :
WARN: Net::OpenTimeout: execution expired


#11

در log نوشته request_helper_database
وجود نداره دیتابیس و اول بسازید


#12

RAILS_ENV=production روبا دستور sidekiq زدم درست شد اون دیتابیس چون databse development ندارم ، مشکل رو پیدا کردم ، مشکل این بود که چون با جم paperclip استفاده کرده بودم و تویه job میخواستم یک فایل رو open کنم و بعد اون فایل رو با paperclip باز میکردم با این آدرس مثلا : atach.files.url که این به من آدرس url میداد و اون اررور رو میداد :‌
WARN: Net::OpenTimeout: execution expired
ولی اومدم atach.files.path که آدرس فیزیکی اش رو به من داد و اون مشکلات دیگه بر طرف شد
ممنونم از دوستان