Я пишу твиттер-приложение в Google App Engine. Он принимает команды как прямые сообщения, поэтому я настроил стороннюю службу cronjob для вызова обработчика, который обрабатывает DM через равные промежутки времени. У меня есть модель «Информация», которая имеет только одну запись, она хранит некоторые общие данные, которые используются во многих местах в приложении (в этом случае, время, когда сообщения были обработаны недавно). Общая схема моего обработчика такова:
class Info(db.Model):
msg_polled = db.DateTimeProperty(auto_now_add = True)
.... More Properties ....
@classmethod
def get_info(cls):
info = cls.all().get()
if not info:
info = cls()
info.put()
return info
---------------------------------------------------------
info = Info.get_info()
msgs = api.GetDirectMessages(since = info.msg_polled)
if not msgs:
return
logging.info('Processing Messages since %s ' % str(info.msg_polled))
for msg in msgs:
...process commands...
logging.info('Processed Message :- @%s : %s' % (msg.sender_screen_name, msg.text))
info.msg_polled = datetime.datetime.now()
info.put()
Но иногда я получаю логи, как это:
I 03-30 07:50AM 10.973
Processing Messages since Sun, 29 Mar 2009 11:41:59 GMT
I 03-30 07:50AM 11.122
Processed Message :- @foo : Foo_Bar
-------------------------------------------------------
I 03-30 07:46AM 08.014
Processing Messages since Sun, 29 Mar 2009 11:41:59 GMT
I 03-30 07:46AM 08.130
Processed Message :- @foo : Foo_Bar
Здесь, похоже, информация не передается в базу данных. Сообщение обрабатывается несколько раз, иногда до 10+, до изменения значения msg_polled. Но я не получаю никаких исключений в Datastore. Это происходит только время от времени.
Любая помощь приветствуется.