После обновления комбу получение ‹› не сериализуется JSON для task_id

Я получаю ERROR EncodeError(TypeError('6JQAKHNMG9 is not JSON serializable',),)после обновления.

Успешно установлен:

  • amqp-2.1.4
  • бильярд-3.5.0.2
  • сельдерей-4.0.2
  • комбу-4.0.2
  • pytz-2017.2

(Изначально требуется для установки Flower 0.9.1)

Бегал:

  • amqp == 1.4.9
  • бильярд==3.3.0.23
  • сельдерей==3.1.23
  • комбу == 3.0.35
  • питц==2016.10

Теперь я получаю:

05/10/2017 06:37:55.045 ERROR EncodeError(TypeError('6JQAKHNMG9 is not JSON serializable',),)
Traceback (most recent call last):
  File "/usr/local/src/gonzo/api/version1_0/application/api_main.py", line 191, in post
    retries=3)
  File "/usr/local/lib/python2.7/dist-packages/celery/app/base.py", line 737, in send_task
    amqp.send_task_message(P, name, message, **options)
  File "/usr/local/lib/python2.7/dist-packages/celery/app/amqp.py", line 558, in send_task_message
    **properties
  File "/usr/local/lib/python2.7/dist-packages/kombu/messaging.py", line 169, in publish
    compression, headers)
  File "/usr/local/lib/python2.7/dist-packages/kombu/messaging.py", line 252, in _prepare
    body) = dumps(body, serializer=serializer)
  File "/usr/local/lib/python2.7/dist-packages/kombu/serialization.py", line 221, in dumps
    payload = encoder(data)
  File "/usr/lib/python2.7/contextlib.py", line 35, in __exit__
    self.gen.throw(type, value, traceback)
  File "/usr/local/lib/python2.7/dist-packages/kombu/serialization.py", line 54, in _reraise_errors
    reraise(wrapper, wrapper(exc), sys.exc_info()[2])
  File "/usr/local/lib/python2.7/dist-packages/kombu/serialization.py", line 50, in _reraise_errors
    yield
  File "/usr/local/lib/python2.7/dist-packages/kombu/serialization.py", line 221, in dumps
    payload = encoder(data)
  File "/usr/local/lib/python2.7/dist-packages/kombu/utils/json.py", line 72, in dumps
    **dict(default_kwargs, **kwargs))
  File "/usr/lib/python2.7/json/__init__.py", line 251, in dumps
    sort_keys=sort_keys, **kw).encode(obj)
  File "/usr/lib/python2.7/json/encoder.py", line 207, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python2.7/json/encoder.py", line 270, in iterencode
    return _iterencode(o, 0)
  File "/usr/local/lib/python2.7/dist-packages/kombu/utils/json.py", line 62, in default
    return super(JSONEncoder, self).default(o)
  File "/usr/lib/python2.7/json/encoder.py", line 184, in default
    raise TypeError(repr(o) + " is not JSON serializable")
EncodeError: 6JQAKHNMG9 is not JSON serializable

Мой код:

Я передаю пользовательский «task_id», который представляет собой строку (не объект JSON), он работал до обновления (если я верну версии, он снова работает), какой может быть правильный формат для передачи пользовательского task_id?

celery.send_task('process_campaign',
                             exchange='gonzo',
                             queue='gold',
                             routing_key='gonzo.gold',
                             kwargs={'campaign_instance': campaign_instance},
                             task_id=campaign_instance.reference,
                             retries=3)

Я старался:

task_id=json.dumps(campaign_instance.reference) or
task_id={'task_id': campaign_instance.reference}

Та же ошибка, есть идеи, я не могу найти документацию по этой проблеме?


person gogasca    schedule 10.05.2017    source источник


Ответы (1)


Начиная с version 4.0, сериализатором по умолчанию в celery является 'json'. Раньше по умолчанию было 'pickle'. (Я не знаю деталей для kombu версий пакета)

При отправке сообщения вы передаете аргумент campaign_instance, который, вероятно, не сериализуем JSON, но сериализуем PICKLE, поэтому он работал раньше.

Вы можете изменить сериализатор по умолчанию в настройках, указав 'pickle', что является кратчайшим путем: http://docs.celeryproject.org/en/latest/userguide/configuration.html#std:setting-task_serializer

Или вы можете изменить свой код, чтобы передавать в вашу задачу только сериализуемые аргументы JSON.

person arthur    schedule 10.05.2017
comment
[2017-05-13 00:22:03,916: CRITICAL/MainProcess] Не удается декодировать тело сообщения: ContentDisallowed('Отказ от десериализации ненадежного содержимого типа pickle (application/x-python-serialize)',) [type:u 'application/x-python-serialize' encoding:u'binary' headers:{}] После удаления рассола я получил другую ошибку. Перейдет в формат Json. - person gogasca; 13.05.2017