سلام
دوستان من تویه یکی از اکشن های کنترلر ام یه کار زمانبری رو دارم انجام میدم که حدود 3 دقیقه طول میکشه انجام بشه ولی به صورت عادی تو سرور به این اررور بر میخورم :
روش خاصی یا جم خوبی رو سراغ دارید که دیگه این اتفاق نیوفته ؟
سلام
دوستان من تویه یکی از اکشن های کنترلر ام یه کار زمانبری رو دارم انجام میدم که حدود 3 دقیقه طول میکشه انجام بشه ولی به صورت عادی تو سرور به این اررور بر میخورم :
روش خاصی یا جم خوبی رو سراغ دارید که دیگه این اتفاق نیوفته ؟
background job چیزی هست که شما نیاز داری. sidekiq
رو ببین. در ضمن عکسی که گذاشتین اصلا معلوم نیست
ممنون ، ولی sidekiq نیازمنده redis هست ، نمیشه بدون redis کار کنه ؟ چون برای یه کار ساده نمیخوام redis نصب کنم ، نمیشه از active job استفاده کنم این مشکلم رو حل میکنه ؟
برای توضیح کارم که تویه کنترلر دارم انجام میدم این هست که من یه فایلی csv که شامل 4000 رکورد هست رو دونه به دونه میخونم و میریزم تو دیتابیس حالا چون طول میکشه در حد 3 دقیقه است میخوام دیگه اررور بهم نده برای اینکه طول کشیده و میخوام بره هر چقدر که زمان میخواد انجامش بده و بعد بهم callback بده
از activejob هم میشه استفاده کنید اگرredis و نمیشه اضافه کنید هدف اصلی اینکه که کاری طول میکشه در background انجام بشه و درخواست و block نکنه
الان برای تست یه جاب ساختم و تابع perform رو به این شکل توش نوشتم :
(def perform(file_location
…
end
و بعد داخل کنترلر ام به این شکل استفادش کردم :
(SyncStudentsJob.perform_now(file_location
و درست هم کارکرد ولی باز مرورگر ام منتظر جواب بود
به نظرتون به شکل درستی دارم استفادش میکنم ؟
باید از متد perfom_later استفاده کنید
ممنون ، من تویه اون فاکشن در داخل job ام مقدار بازگشتی دارم ولی گویا بهم مقدار بازگشتی نمیده ؟ برای این هم پیشنهادی دارید ؟
با استفاده از background job دستور non blocking اجرا میشه و چون در یک thread جدا این اجرا میشه دسترسی به داده بازگشتی این متد در thread اصلی نداریم اگر. به داده نیاز داریدمیتونید داده رو در دیتابیس ذخیره کنید
خیلی ممنونم
من با active job زدم ولی نشد ، یعنی باز این اررور رو داد و دوباره با sideqkiq و با متد perform_async استفاده کردم و باز این اررور داده :
اررور :
WARN: Net::OpenTimeout: execution expired
در log نوشته request_helper_database
وجود نداره دیتابیس و اول بسازید
RAILS_ENV=production روبا دستور sidekiq زدم درست شد اون دیتابیس چون databse development ندارم ، مشکل رو پیدا کردم ، مشکل این بود که چون با جم paperclip استفاده کرده بودم و تویه job میخواستم یک فایل رو open کنم و بعد اون فایل رو با paperclip باز میکردم با این آدرس مثلا : atach.files.url که این به من آدرس url میداد و اون اررور رو میداد :
WARN: Net::OpenTimeout: execution expired
ولی اومدم atach.files.path که آدرس فیزیکی اش رو به من داد و اون مشکلات دیگه بر طرف شد
ممنونم از دوستان