def test_defer_message_dispatch(ctx): from datetime import datetime, timedelta from eventlet import sleep, spawn, with_timeout from eventlet.event import Event from melkman.messaging import MessageDispatch, always_ack from melkman.scheduler import defer_message from melkman.scheduler.worker import ScheduledMessageService sms = ScheduledMessageService(ctx) sched = spawn(sms.run) w = MessageDispatch(ctx) message_type = 'test_dispatch_send_recv' work_result = Event() @always_ack def handler(job, message): work_result.send(sum(job['values'])) worker = w.start_worker(message_type, handler) try: now = datetime.utcnow() wait = timedelta(seconds=2) # w.send({'values': [1, 2]}, message_type) defer_message(now + wait, {'values': [1 ,2]}, message_type, ctx) sleep(3) assert with_timeout(2, work_result.wait) == 3 finally: worker.kill() worker.wait() sched.kill() sched.wait()
def schedule_feed_index(url, timestamp, context, message_id=None, skip_reschedule=False): """ request that the url specified be fetched and indexed at a specific time in the future. """ message = {'url': url} if skip_reschedule: message['skip_reschedule'] = True options = {} if message_id is not None: options['message_id'] = message_id defer_message(timestamp, message, INDEX_FEED_COMMAND, context, **options)