songtianlun
2e438166ee
- Add manual task execution buttons for BatchGenerateWeatherArtsWorker, RefreshSitemapWorker, and CleanAhoyDataWorker - Improve browser blocking functionality in ApplicationController - Refactor Sidekiq jobs management to include statistics and task execution - Update various jobs to conform to new standards This feature allows for more fine-grained control over Sidekiq tasks and improves the overall user experience.
38 lines
1.0 KiB
Ruby
38 lines
1.0 KiB
Ruby
# app/jobs/batch_generate_weather_arts_job.rb
|
|
class BatchGenerateWeatherArtsJob < ApplicationJob
|
|
queue_as :default
|
|
|
|
GENERATION_INTERVAL = 24.hours
|
|
MAX_DURATION = 50.minutes
|
|
SLEEP_DURATION = 120.seconds
|
|
|
|
def perform(*args)
|
|
start_time = Time.current
|
|
|
|
cities_to_process = get_eligible_cities
|
|
|
|
cities_to_process.each do |city|
|
|
break if Time.current - start_time > MAX_DURATION
|
|
Rails.logger.info "Generating weather art for #{city.name}"
|
|
|
|
GenerateWeatherArtJob.perform_later(city.id)
|
|
sleep SLEEP_DURATION
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def get_eligible_cities
|
|
cutoff_time = Time.current - GENERATION_INTERVAL
|
|
|
|
City.active
|
|
.joins("LEFT JOIN (
|
|
SELECT city_id, MAX(created_at) as last_generation_time
|
|
FROM weather_arts
|
|
GROUP BY city_id
|
|
) latest_arts ON cities.id = latest_arts.city_id")
|
|
.where("latest_arts.last_generation_time IS NULL OR latest_arts.last_generation_time < ?", cutoff_time)
|
|
.order(:priority)
|
|
end
|
|
end
|