Apscheduler is not running multiple jobs

20 views
Skip to first unread message

Praveen Chaudhary

unread,
Feb 25, 2024, 5:22:27 AM2/25/24
to django...@googlegroups.com
Hello, everyone

I am using an apscheduler to schedule my job in a django project. here is code

def start():
"""
The `start` function creates a report using a scheduler to generate and send reports based on
specified sources and schedules.
"""
logger.info(f" Started creating report")

executors = {
'default': ThreadPoolExecutor(1)
}

scheduler = BackgroundScheduler(executors=executors, daemon=True)

sources, idx_list, job_schedules, triggers = generate_report()

for source, idx, job_schedule, trigger in zip(sources, idx_list, job_schedules, triggers):
job_id = f"daily_report_job_{source.name}_{job_schedule.pk}_{idx}"
logger.info(f" Adding job with ID: {job_id}")

try:
scheduler.add_job(
generate_and_send_report_by_source_name,
trigger=trigger,
id=job_id,
args=[source],
replace_existing=True,

)
except Exception as e:
logger.error(f" Failed to add job with ID {job_id}: {e}")

try:
if scheduler.state == 0:
scheduler.start()
except Exception as e:
logger.error(f" Scheduler failed to start: {e}")


def generate_report():
"""
The `generate_report` function retrieves active sources, iterates through their job schedules,
creates triggers based on the schedule, and returns the sources, job schedules, and triggers.
:return: The `generate_report` function returns four values: `sources`, `idx_list`, `job_schedules`,
and `triggers`.
"""
sources = get_active_sources()
job_schedules = []
triggers = []

if not sources:
logger.error(" Failed to generate report. No active sources found.")
return [], [], []

idx_list = []
for idx, source in enumerate(sources, start=1):
source_job_schedules = source.job_schedule.all()

for job_schedule in source_job_schedules:
if job_schedule.day_of_week is not None:
trigger = CronTrigger(
day_of_week=job_schedule.day_of_week,
hour=job_schedule.hour,
minute=job_schedule.minute
)
else:
trigger = CronTrigger(
hour=job_schedule.hour,
minute=job_schedule.minute
)
triggers.append(trigger)
idx_list.append(idx)
job_schedules.append(job_schedule)

return sources, idx_list, job_schedules, triggers


here is the models.py

class JobSchedule(TimeStamp):
name = models.CharField(max_length=255)
day_of_week = models.IntegerField(choices=DAY_CHOICES, null=True, blank=True)
hour = models.CharField(max_length=10, null=True, blank=True)
minute = models.CharField(max_length=10, null=True, blank=True)

class Meta:
verbose_name = "Job Schedule"
verbose_name_plural = "Job Schedules"

def __str__(self) -> str:
return f"{self.name}"


class Source(TimeStamp):
name = models.CharField(max_length=255, unique=True)
source_type = models.CharField(max_length=100, choices=SOURCE_TYPE, default="View")
query = models.TextField()
destinations = models.ManyToManyField(Destination, related_name="destinations")
job_schedule = models.ManyToManyField(JobSchedule, related_name="schedule")
is_active = models.BooleanField(default=False)

class Meta:
verbose_name = 'Source'
verbose_name_plural = 'Sources'

def __str__(self) -> str:
return f"{self.name}"



the problem is when i create one source with two different job schedule instance, apscheduler is adding only one job

here is my my log message:

apscheduler.schedulerAdded job "generate_and_send_report_by_source_name" to job store "default"


but it works if i create two source instances with two different job schedule instances.

What are the mistakes I am making? I have tried many times to solve this issue but did not recognize what I am missing.


Prabin Chaudhary

Software Engineer

Mobile: +977-9840193890 | prabin...@gmail.com 

Reply all
Reply to author
Forward
0 new messages