แสดงรายการงานที่เข้าคิวด้วย ActiveJob AsyncAdapter

มีวิธีที่ฉันสามารถดูได้ว่ามีงานเหลืออยู่ในคิวกี่งาน (อาจจะตรวจสอบแต่ละงานด้วยซ้ำ)


person alexandernst    schedule 13.10.2016    source แหล่งที่มา
comment
สวัสดี โปรดแจ้งให้เราทราบว่าคำแนะนำด้านล่างใช้ได้ผลหรือไม่หากคุณลองแล้ว - ฉันค่อนข้างสงสัยแต่ยังไม่มีเวลาทดสอบ :) (อาจเป็นช่วงสุดสัปดาห์)   -  person Andrey Deineko    schedule 14.10.2016
comment
เหมือนกันที่นี่ :) ไม่สามารถทดสอบได้ในวันนี้ มาดูกันว่าพรุ่งนี้เช้าจะได้ไปหรือเปล่า ;)   -  person alexandernst    schedule 14.10.2016


คำตอบ (1)


หลังจากเจาะลึกเข้าไปใน ซอร์สโค้ด นี่คือสิ่งที่ฉันพบ:

ActiveJob::QueueAdapters::AsyncAdapter ใช้ Concurrent Ruby เธรดพูลเพื่อกำหนดเวลาและดำเนินงาน

เมื่อคุณเริ่มต้นอะแดปเตอร์ในการกำหนดค่าของคุณ คุณจะต้องส่ง ตัวเลือกตัวดำเนินการ ซึ่งจะกลายเป็นอาร์กิวเมนต์ไปยังเมธอด initialize ของ Concurrent::ThreadPoolExecutor คลาส

อินสแตนซ์ที่สร้างขึ้นของคลาส Concurrent::ThreadPoolExecutor มีวิธีการดังกล่าว เช่น:

  • queue_length - จำนวนงานใน คิวที่รอการดำเนินการ
  • scheduled_task_count - จำนวนงานที่มี มีกำหนดประหารชีวิตบนสระน้ำตั้งแต่การก่อสร้าง

ที่กล่าวว่าฉันคิดว่าบางสิ่งบางอย่างในบรรทัดเหล่านี้ควรทำเพื่อคุณ:

ActiveJob::Base
  .queue_adapter
  .instance_variable_get(:@scheduler)
  .instance_variable_get(:@async_executor)
  .public_send(:queue_length)

ข้างต้นทำสิ่งต่อไปนี้:

  1. รับอะแดปเตอร์ของคุณ
  2. รับ instance_variable @scheduler นั่นชี้ไปที่
  3. อินสแตนซ์ของ Concurrent::ThreadPoolExecutor (ตัวแปรอินสแตนซ์ของคลาส Scheduler - @async_executor)
  4. ซึ่งคุณสามารถเรียกใช้วิธีการตามที่อธิบายไว้ข้างต้น (queue_length, scheduled_task_count และ อื่นๆ)

แม้ว่าฉันจะไม่ได้ทดสอบ ดังนั้นอย่าลืมตรวจสอบการพิมพ์ผิดหรืออะไรก็ตามอีกครั้ง

person Andrey Deineko    schedule 13.10.2016
comment
โอเค ฉันแค่พยายาม ดูเหมือนจะไม่ทำงาน มันจะคืนค่า 0 เสมอ - person alexandernst; 14.10.2016
comment
@alexandernst ลองคิดดูว่ามันจะคืนค่าจำนวนเต็ม ดังนั้นฉันค่อนข้างแน่ใจว่ามันใช้งานได้ในแง่หนึ่งว่ามันเรียกวิธีการที่ถูกต้อง คุณลองวิธีอื่นแล้วหรือยัง? นอกจากนี้คุณแน่ใจ 1,000% ว่าไม่ควรส่งคืน 0 หรือไม่ - person Andrey Deineko; 15.10.2016
comment
ฉันลองวิธีแก้ปัญหานี้ ฉันพยายาม queue_length, scheduled_task_count, completed_task_count พวกเขาทั้งหมดกลับมาเสมอ 0 - person mario199; 26.11.2018
comment
การรับ async_executor ของอะแดปเตอร์กำลังส่งคืนอินสแตนซ์ Concurrent::ThreadPoolExecutor ปัญหาคือจำนวน Concurrent::ThreadPoolExecutor ไม่ได้รับการอัพเดตด้วยเหตุผลบางประการ - person robertoplancarte; 08.06.2020