Господа, столкнулся с весьма занятной проблемой.
Использую Миранду в связке с ejabberd в корпоративной среде. У некоторых пользователей есть потребность в мобильном клиенте. Используется клиент Bria Mobile. Других вариантов нет, т.к. на телефонах нужен SIP и общая управляемая адресная книга. На андроид еще можно куда-то рыпнуться, на айфонах больше вариантов нет никаких. Это была преамбула, теперь по сути проблемы.
Периодически не доходят сообщения из миранды в bria. Причем, оба клиента онлайн. Из других клиентов (пробовал другую bria, jitsi, pidgin) сообщения прекрасно доходят. Из bria в миранду сообщения так же доходят без проблем. Из миранды в другие клиенты так же никаких нареканий. Проблема возникает только в направлении миранда -> бриа.
После долгих мучений при диагностике выяснилось следующее. При формировании XML-сообщения в качестве атрибута id тега message проставляется "mir_" + порядковый номер, который, как я понял, начинается с 1 при каждом запуске миранды. У bria, в свою очередь, есть база данных с архивом сообщений. После просмотра андроидовского logcat в процессе работы bria выяснилось, что она берет значение id, кладет его в базу в поле, на котором стоит ограничение уникальности. Возникают ошибки такого содержания:
04-09 12:44:44.614 29314 29314 D ImLocalStorage: add to db: mir_39, conv: 1 [common.controller.im.refactoring.ImLocalStorage.addMessage:226]
04-09 12:44:44.630 29314 29206 E ImLocalStorage: Error has occurred during Put operation. object = com.bria.common.controller.im.refactoring.db.entities.InstantMessageData@523f28f [common.controller.im.refactoring.ImLocalStorage.lambda$addMessage$5:248]
04-09 12:44:44.634 29314 29206 E ImLocalStorage: android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: Messages.externalId (code 2067) [common.controller.im.refactoring.ImLocalStorage.lambda$addMessage$5:249]
И действительно, после того, как я в bria очистил историю, сообщения стали прекрасно доходить. После перезапуска миранды, когда счетчик id обнулился, снова стали возникать проблемы.
В связи с этим у меня вопрос к сообществу: есть ли возможность сделать так, чтобы счетчик начинался не с 1, а, например, с какого-то случайного значения или с unix-time для того, чтобы обеспечить его уникальность в рамках всей переписки?
Например, я обратил внимание, что у pidgin id выглядит "purple74d1eff8", "purple74d1effa", т.е. там какое-то длинное hex число, которое так же в каждом последующем сообщении увеличивается на 1. У jitsi наоборот, при каждом запуске случайным образом формируется префикс, например: "99q5a-98", "VNNGo-1641". Поэтому с ними таких проблем не возникает. Но эти клиенты невозможно использовать ввиду отсутствия необходимого функционала.
Понятно, что в спецификации XMPP нет указания, что поле id должно быть уникально в рамках всей переписки, но, как оказалось, могут возникать проблемы. Здесь, конечно, практически полностью вина разработчиков bria, которым взбрело в голову в качестве ключа ставить id сообщения, которое может быть не уникальным, но боюсь они вряд ли будут переделывать схему в обозримом будущем, а проблема очень сильно напрягает.
Спасибо.