从Celery任务向频道发送消息

问题描述 投票:1回答:1

Django 2.1.1,Django Channels 2.1.3,Celery 4.2.1

我在Celery中设置了一个任务,在任务结束时,我需要向客户端发送一个websocket消息。但是,websocket消息永远不会发送。没有抛出任何错误,它只是根本不发送。

我使用Redis作为后端设置了一个通道层。从普通的Django视图执行此操作可以正常工作。但是当在Celery任务中运行时,它会将消息发送到Channels,我可以看到Channels确实运行了我在下面的consumer.py代码中显示的代码,但客户端从未收到websocket消息。

tasks.朋友

def import_job(self):
    # (do task calculations, store in data dict)
    message = {'type': 'send_my_data',
               'data': json.dumps(thecalcs) }
    channel_layer = get_channel_layer()
    async_to_sync(channel_layer.group_send)('core-data', message)

consumers.朋友

class AsyncDataConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        self.channel_group_name = 'core-data'

        # Join the group
        await self.channel_layer.group_add(
            self.channel_group_name,
            self.channel_name
        )
        await self.accept()

    async def disconnect(self, close_code):
        # Leave the group
        await self.channel_layer.group_discard(
            self.channel_group_name,
            self.channel_name
        )

    # Receive message from WebSocket
    async def receive(self, text_data=None, bytes_data=None):
        pass

    # Receive message from the group
    async def send_my_data(self, event):
        text = event['data']
        # Send message to WebSocket
        await self.send(text_data=text)

settings.朋友

CHANNEL_LAYERS = {
    'default': {
        'BACKEND': 'channels_redis.core.RedisChannelLayer',
        'CONFIG': {
            "hosts": [('127.0.0.1', 6379)],
        },
    },
}

由于没有异常/错误,我完全不知道这个过程的哪个部分失败了。

  1. 芹菜触发任务?是
  2. 任务运行并向通道层发送消息?是
  3. 消费者从组中接收消息并执行send()?是
  4. 客户收到websocket消息?没有

这是Channels和Redis之间的问题吗?这是渠道和客户之间的问题吗?

django celery django-channels celerybeat
1个回答
2
投票

事实证明,Celery在任务期间吞下了我的代码中的异常。我需要实现更彻底的日志记录来捕获这些异常。

© www.soinside.com 2019 - 2024. All rights reserved.