使用RabbitMQ和WebSockets通知用户作业完成的最佳方法

时间:2017-08-05 05:30:14

标签: php python yii2 rabbitmq

我使用Yii2和yii2-queue扩展来在RabbitMQ中的某些队列中推送作业。 这些作业正在将xls | csv文件导入数据库。在作业结束时,我将消息发送到另一个队列 - 通过python pika监听,并通过websocket发送给客户端。

php,一段工作代码,发送新邮件

if (!empty($imported)) {

            $connection = new AMQPStreamConnection($queue->host, $queue->port, $queue->user, $queue->password);
            $channel = $connection->channel();

            $channel->queue_declare('import_queue', true, true, false, false);

            $message = 'Catalog, imported items: ' . count($imported);
            $message = new AMQPMessage($message, [
                'content_type' => 'text/plain',
                'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT
            ]);

            $channel->basic_publish(
                $message, '', 'import_queue'
            );

            $channel->close();
            $connection->close();
        }

python代码。

credentials = pika.PlainCredentials('admin', 'password')
parameters = pika.ConnectionParameters('localhost',
                                       5672,
                                       '/',
                                       credentials)

amqp_conn = pika.BlockingConnection(parameters)
amqp_ch = amqp_conn.channel()

def threaded_rmq():
    amqp_ch.queue_declare(queue="import_queue", durable=True)
    amqp_ch.basic_consume(callback, queue="import_queue", no_ack=True)
    amqp_ch.start_consuming()


def callback(ch, method, properties, body):
    data = {'type': 'imported_catalog_items', 'message': body}
    json_data = json.dumps(data)
    for client in clients:
        client.sendMessage(u'' + json_data)

def disconnect_to_rabbitmq():
    amqp_ch.stop_consuming()
    amqp_conn.close()

问题: 我不知道什么时候完成上一份工作。 当用户发送文件时,我会阻止html表单并应用加载程序图标。 我设置session var来阻止它。我想在执行所有作业时取消阻止表单(删除加载程序),并通知用户"导入作业已完成"。

最好的方法是什么?感谢。

0 个答案:

没有答案