Как я могу запретить XMPP-клиенту в Heroku дублировать обработку полученных сообщений?

message Обратный вызов моего sleekxmpp chatbot на Herroku вызывается 2 раза после одного отправленного ему сообщения, когда это должно быть выполнено только один раз.

У меня есть чатбот по python и sleekxmpp, работающий на Heroku. Он настроен как отдельный веб-процесс и подключается к локальному XMPP-серверу (работает в моей локальной сети). Бот успешно подключается и получает сообщения, которые я ему отправляю. Тем не менее, его message обратный вызов выполняется два раза после каждого полученного сообщения.

Я проверил, что на сервер XMPP приходит только одно сообщение. Я также убедился, что приложение не масштабируется на нескольких динамо.

Исследуя, я не смог найти информацию, которая бы указала мне направление решения проблемы.

import json
import logging
import threading

import sleekxmpp
from flask import Flask, request


def xmpp_run():
    xmpp.register_plugin('xep_0030')  # Service Discovery
    xmpp.register_plugin('xep_0004')  # Data Forms
    xmpp.register_plugin('xep_0060')  # PubSub
    xmpp.register_plugin('xep_0199')  # XMPP Ping
    xmpp.register_plugin('xep_0071')  # Lightweight text markup in message

    if xmpp.connect((XMPPSERVER, 5222)):
        xmpp.process(block=True)
        print("Done")
    else:
        print("Unable to connect.")

""" XMPP Bot """
class XMPPBot(sleekxmpp.ClientXMPP):

    def __init__(self, jid, password):
        sleekxmpp.ClientXMPP.__init__(self, jid, password)
        self.add_event_handler("session_start", self.start)
        self.add_event_handler("message", self.message)

    def start(self, event):
        self.send_presence()
        self.get_roster()

    def message(self, msg):
        app.logger.debug('Inside XMPPBot.message method')
        app.logger.debug('msg: ' + str(msg))


app = Flask(__name__)
app.debug = True
xmpp = XMPPBot('username', 'password')
threading.Thread(target=xmpp_run).start()

logging.basicConfig(level=logging.INFO,
                    format='%(levelname)-8s %(message)s')
XMPPSERVER = 'x.x.x.x'



@app.route('/webhook', methods=['GET', 'POST'])
def webhook():
    app.logger.debug('Received webhook request')
    if request.method == 'GET':
        app.logger.debug('GET request received')
        """ Some initialization code runs here """
    elif request.method == 'POST':
        request_json = request.get_json(force=True)
        app.logger.debug('Incoming POST request: ' + json.dumps(request_json))
        """ Some processing code runs here """
    return ''

Я ожидаю, что когда я отправлю сообщение, XMPPBot.message() метод выполняется только один раз. Вместо этого он выполняется 2 раза. После повторного развертывания он часто выполняется 4 раза для первых нескольких полученных сообщений, а затем переходит к 2.

Код выше регистрирует сообщение Inside XMPPBot.message method при каждом исполнении. Вот вывод файла журнала:

2019-07-19T15:19:51.769859+00:00 app[web.1]: --------------------------------------------------------------------------------
2019-07-19T15:19:51.769878+00:00 app[web.1]: DEBUG in main [/app/main.py:36]:
2019-07-19T15:19:51.769880+00:00 app[web.1]: Inside XMPPBot.message method
2019-07-19T15:19:51.769881+00:00 app[web.1]: --------------------------------------------------------------------------------
2019-07-19T15:19:51.769887+00:00 app[web.1]: DEBUG    Inside XMPPBot.message method
2019-07-19T15:19:51.770036+00:00 app[web.1]: --------------------------------------------------------------------------------
2019-07-19T15:19:51.770038+00:00 app[web.1]: DEBUG in main [/app/main.py:37]:
2019-07-19T15:19:51.770044+00:00 app[web.1]: msg: <message xml:lang="en" to="x@xxx/1234512345" from="y@xxx/12341234" type="chat" id="123456"><active xmlns="http://jabber.org/protocol/chatstates" /><body>hi</body></message>
2019-07-19T15:19:51.770045+00:00 app[web.1]: --------------------------------------------------------------------------------
2019-07-19T15:19:51.770070+00:00 app[web.1]: DEBUG    msg: <message xml:lang="en" to="x@xxx/1234512345" from="y@xxx/12341234" type="chat" id="123456"><active xmlns="http://jabber.org/protocol/chatstates" /><body>hi</body></message>
2019-07-19T15:19:51.770568+00:00 app[web.1]: --------------------------------------------------------------------------------
2019-07-19T15:19:51.770569+00:00 app[web.1]: DEBUG in main [/app/main.py:36]:
2019-07-19T15:19:51.770570+00:00 app[web.1]: Inside XMPPBot.message method
2019-07-19T15:19:51.770573+00:00 app[web.1]: --------------------------------------------------------------------------------
2019-07-19T15:19:51.770611+00:00 app[web.1]: DEBUG    Inside XMPPBot.message method
2019-07-19T15:19:51.770842+00:00 app[web.1]: --------------------------------------------------------------------------------
2019-07-19T15:19:51.770843+00:00 app[web.1]: DEBUG in main [/app/main.py:37]:
2019-07-19T15:19:51.770844+00:00 app[web.1]: msg: <message xml:lang="en" to="x@xxx/1234512345" from="y@xxx/12341234" type="chat" id="123456"><active xmlns="http://jabber.org/protocol/chatstates" /><body>hi</body></message>
2019-07-19T15:19:51.770847+00:00 app[web.1]: --------------------------------------------------------------------------------
2019-07-19T15:19:51.770877+00:00 app[web.1]: DEBUG    msg: <message xml:lang="en" to="x@xxx/1234512345" from="y@xxx/12341234" type="chat" id="123456"><active xmlns="http://jabber.org/protocol/chatstates" /><body>hi</body></message>

0 ответов

Другие вопросы по тегам