Search code examples
pythonscheduled-tasksschedulerjob-schedulingapscheduler

Python package APSscheduler throws an error when starting scheduler if mongodb is used as a jobstore


I'm trying to run some code with APScheduler with MongoDB as a jobstore. I've downloaded pymongo and I tested it, so it does work. APScheduler will work when I instantiate the scheduler, but when I run scheduler.start() it throws the following error:

Traceback (most recent call last):
  File "aps_ro.py", line 56, in <module>
    scheduler.start()
  File "/usr/lib/python3.8/site-packages/apscheduler/schedulers/background.py", line 33, in start
    BaseScheduler.start(self, *args, **kwargs)
  File "/usr/lib/python3.8/site-packages/apscheduler/schedulers/base.py", line 158, in start
    store.start(self, alias)
  File "/usr/lib/python3.8/site-packages/apscheduler/jobstores/mongodb.py", line 57, in start
    self.collection.ensure_index('next_run_time', sparse=True)
  File "/usr/lib/python3.8/site-packages/pymongo/collection.py", line 2028, in ensure_index
    self.__create_index(keys, kwargs, session=None)
  File "/usr/lib/python3.8/site-packages/pymongo/collection.py", line 1881, in __create_index
    with self._socket_for_writes(session) as sock_info:
  File "/usr/lib/python3.8/site-packages/pymongo/collection.py", line 195, in _socket_for_writes
    return self.__database.client._socket_for_writes(session)
  File "/usr/lib/python3.8/site-packages/pymongo/mongo_client.py", line 1266, in _socket_for_writes
    server = self._select_server(writable_server_selector, session)
  File "/usr/lib/python3.8/site-packages/pymongo/mongo_client.py", line 1253, in _select_server
    server = topology.select_server(server_selector)
  File "/usr/lib/python3.8/site-packages/pymongo/topology.py", line 233, in select_server
    return random.choice(self.select_servers(selector,
  File "/usr/lib/python3.8/site-packages/pymongo/topology.py", line 192, in select_servers
    server_descriptions = self._select_servers_loop(
  File "/usr/lib/python3.8/site-packages/pymongo/topology.py", line 208, in _select_servers_loop
    raise ServerSelectionTimeoutError(
pymongo.errors.ServerSelectionTimeoutError: localhost:27017: [Errno 111] Connection refused

My actual code sample is as follows:

jobstores = {
    'mongo': {'type': 'mongodb'},
    'default': SQLAlchemyJobStore(url='sqlite:///jobs.sqlite')
}
executors = {...}
job_defaults = {...}

scheduler = BackgroundScheduler()
scheduler.configure(jobstores=jobstores, executors=executors, job_defaults=job_defaults, timezone=utc)

@scheduler.scheduled_job(trigger='cron', day_of_week=4, hour=22, minute=21, second=0)
def tester():
    print("hello")

scheduler.start()

Solution

  • By default, the mongodb python driver will connect to a database on host localhost and port 27017.

    So you will need to either:

    • make sure mongodb server is running on the same machine as the python code and is running, on the default port (you can test this easily by typing mongo at your favourite shell and checking you get a > prompt and not an error).
    • supply a connection string or connection arguments if mongodb is running on a different server or a different port.