agronholm / apscheduler

Task scheduling library for Python
MIT License
6.18k stars 704 forks source link

AsyncIOScheduler not working with MongoDBJobStore (cannot pickle 'TaskStepMethWrapper' object) #872

Closed difhel closed 4 months ago

difhel commented 7 months ago

Things to check first

Version

3.10.4

What happened?

While I was trying to prepare a minimal reproducible example for #871, I ran into another problem that only appears when using MongoDBJobStore and does not appear with MemoryJobStore.

started
Scheduler started
[scheduler] adding new job
Cause exception while process update id=894654051 by bot id=6523947747
TypeError: cannot pickle 'TaskStepMethWrapper' object
Traceback (most recent call last):
  File "/tmp/mre/.venv/lib/python3.10/site-packages/aiogram/dispatcher/dispatcher.py", line 309, in _process_update
    response = await self.feed_update(bot, update, **kwargs)
  File "/tmp/mre/.venv/lib/python3.10/site-packages/aiogram/dispatcher/dispatcher.py", line 158, in feed_update
    response = await self.update.wrap_outer_middleware(
  File "/tmp/mre/.venv/lib/python3.10/site-packages/aiogram/dispatcher/middlewares/error.py", line 25, in __call__
    return await handler(event, data)
  File "/tmp/mre/.venv/lib/python3.10/site-packages/aiogram/dispatcher/middlewares/user_context.py", line 27, in __call__
    return await handler(event, data)
  File "/tmp/mre/.venv/lib/python3.10/site-packages/aiogram/fsm/middleware.py", line 41, in __call__
    return await handler(event, data)
  File "/tmp/mre/.venv/lib/python3.10/site-packages/aiogram/dispatcher/event/telegram.py", line 121, in trigger
    return await wrapped_inner(event, kwargs)
  File "/tmp/mre/.venv/lib/python3.10/site-packages/aiogram/dispatcher/event/handler.py", line 43, in call
    return await wrapped()
  File "/tmp/mre/.venv/lib/python3.10/site-packages/aiogram/dispatcher/dispatcher.py", line 276, in _listen_update
    return await self.propagate_event(update_type=update_type, event=event, **kwargs)
  File "/tmp/mre/.venv/lib/python3.10/site-packages/aiogram/dispatcher/router.py", line 128, in propagate_event
    return await observer.wrap_outer_middleware(_wrapped, event=event, data=kwargs)
  File "/tmp/mre/.venv/lib/python3.10/site-packages/aiogram/dispatcher/router.py", line 123, in _wrapped
    return await self._propagate_event(
  File "/tmp/mre/.venv/lib/python3.10/site-packages/aiogram/dispatcher/router.py", line 148, in _propagate_event
    response = await observer.trigger(event, **kwargs)
  File "/tmp/mre/.venv/lib/python3.10/site-packages/aiogram/dispatcher/event/telegram.py", line 121, in trigger
    return await wrapped_inner(event, kwargs)
  File "/tmp/mre/.venv/lib/python3.10/site-packages/aiogram/dispatcher/event/handler.py", line 43, in call
    return await wrapped()
  File "/tmp/mre/main.py", line 20, in handler
    job = SchedulerWrapper().add_job(
  File "/tmp/mre/scheduler.py", line 29, in add_job
    return self.scheduler.add_job(*args, **kwargs)
  File "/tmp/mre/.venv/lib/python3.10/site-packages/apscheduler/schedulers/base.py", line 457, in add_job
    self._real_add_job(job, jobstore, replace_existing)
  File "/tmp/mre/.venv/lib/python3.10/site-packages/apscheduler/schedulers/base.py", line 881, in _real_add_job
    store.add_job(job)
  File "/tmp/mre/.venv/lib/python3.10/site-packages/apscheduler/jobstores/mongodb.py", line 89, in add_job
    'job_state': Binary(pickle.dumps(job.__getstate__(), self.pickle_protocol))
TypeError: cannot pickle 'TaskStepMethWrapper' object

How can we reproduce the bug?

  1. git clone https://github.com/difhel/aps-mre-1
  2. cd aps-mre-1
  3. poetry install
  4. poetry shell
  5. Enter your Telegram bot token in main.py:8
  6. python3 main.py
  7. Write "/schedule" to your Telegram bot
  8. It works perfectly, now uncomment lines 6-8 and comment 9-11 in scheduler.py
  9. Restart the bot, write "/schedule" and see what happens
agronholm commented 7 months ago

Is the problem not reproduceable without Telegram code?

agronholm commented 7 months ago

What I'm saying is that a serialization problem is likely not having anything to do with Telegram, so this isn't exactly a "minimal" reproducing example. I don't intend to acquire a Telegram bot token just to run the example.

agronholm commented 4 months ago

Closing due to lack of responses.