diff --git a/rq/worker.py b/rq/worker.py index 7602c2e..c782fd6 100644 --- a/rq/worker.py +++ b/rq/worker.py @@ -540,7 +540,10 @@ class Worker(object): queues = as_text(queues) self._state = as_text(state or '?') self._job_id = job_id or None - self.last_heartbeat = utcparse(as_text(last_heartbeat)) + if last_heartbeat: + self.last_heartbeat = utcparse(as_text(last_heartbeat)) + else: + self.last_heartbeat = None self.birth_date = utcparse(as_text(birth)) if failed_job_count: self.failed_job_count = int(as_text(failed_job_count)) diff --git a/tests/test_worker.py b/tests/test_worker.py index 3f76e4d..565a899 100644 --- a/tests/test_worker.py +++ b/tests/test_worker.py @@ -202,12 +202,16 @@ class TestWorker(RQTestCase): q = Queue() w = Worker([q]) w.register_birth() - w.heartbeat() last_heartbeat = self.testconn.hget(w.key, 'last_heartbeat') self.assertTrue(last_heartbeat is not None) w = Worker.find_by_key(w.key) - self.assertIsInstance(w.last_heartbeat, datetime) + self.assertIsInstance(w.last_heartbeat, datetime) + + # worker.refresh() shouldn't fail if last_heartbeat is None + # for compatibility reasons + self.testconn.hdel(w.key, 'last_heartbeat') + w.refresh() def test_work_fails(self): """Failing jobs are put on the failed queue."""