|
|
|
ActiveMQ JMS -- странности topic-ов
|
|||
|---|---|---|---|
|
#18+
У, долго придётся описывать, а вам -- читать -- потерпим... Есть message broker, по JMS, в частности, это Appache ActiveMQ (5.7). В нём есть очередь (queue) и топик (topic). Мои сообщения посылаются в очередь, затем есть специальный сервис, который каждое сообщение складывает в БД. И, поскольку есть много клиентов, которые хотят получить набор последних сообщений, чтобы не читать всё из БД, этот сервис после записи сообщения в БД (при этом сообщению выдаётся идентификатор) записывает каждое сохранённое сообщение в топик. Топик слушается конечным клиентом, и там идея такая: сначала из БД запросом выбирается актуальная для него выборка, затем поступающие сообщения из топика смешиваются с набором данных, поступившим из БД (у каждого сообщения есть идентификатор, так что дубликаты -- не проблема, удаляются). Таким образом происходит обновление данных у конечного клиента. НО есть проблемы. Вроде бы как topic славен тем, что не гарантирует доставку, и что сообщения доставляются только тем subscribers, которые в данный момент слушают топик. Т.е. -- чуть отошёл -- всё пропустил. Это конечно если подписка на топик не durable. У меня она НЕ durable. Меня это всё устраивает, мне так и надо (см. выше принцип обновления). Проблема в том, что на практике получается ровно наоборот, топики выглядят как durable, когда клиент отсоединяется (выключаю приложение) и подсоединяется снова (запускаю), то он начинает получать не последние сообщения, а с задержкой. Причём получает их ровно по одному, синхронно с посылкой сообщения. Я написал тестовый стенд, который посылает нумерованные сообщения по одному в 4 секунды, и ровно в момент (ну плюс минус конечно) посылки стендом нового сообщения клиент получает своё сообщение, причём оно не обязательно последнее (то, которое послал стенд). Т.е. чётко вижу следующие аномалии: клиент (non-durable subscriber to a non-persistant topic) получает сообщения только по одному, хотя я точно знаю, что в топик должны были быть уже посланы более новые сообщения, и не в кол-ве 1 (я вижу их в БД уже записанными, так что они должны были слаться и в топик). клиент получает старые сообщения даже после дисконекта. Я перезапускаю приложение, оно запрашивает соощения из БД, и начинает получать по одному в 4 секунды СТАРЫЕ сообщения, которые у него уже есть, а не новые (новые оно тоже получит, но позже). Вопросы даже как-то и не сформулировать... Что делать ? Может я что-то глобально не так понял ? Мне хочется добиться именно вышеописанного поведения топиков -- чтобы сообщения сразу их него исчезали, как только поступают. Expiration time им я не ставлю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2013, 12:53:37 |
|
||
|
ActiveMQ JMS -- странности topic-ов
|
|||
|---|---|---|---|
|
#18+
Non-persistent - означает лишь то, что сообщения не переживут рестарт брокера. Никто не говорит вам, что они не будут доставлены клиентам, которые подключились позднее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2013, 15:39:50 |
|
||
|
ActiveMQ JMS -- странности topic-ов
|
|||
|---|---|---|---|
|
#18+
cdtyjvNon-persistent - означает лишь то, что сообщения не переживут рестарт брокера. Никто не говорит вам, что они не будут доставлены клиентам, которые подключились позднее. Я это знаю. Указал для полноты картины. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2013, 15:50:24 |
|
||
|
ActiveMQ JMS -- странности topic-ов
|
|||
|---|---|---|---|
|
#18+
MasterZiv , А в чем тогда ваш вопрос заключается? Вы явно пишете, что не используете TTL. Ну вот сообщения и хранятья в топике. Дюрабилити на это никак не влияет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2013, 16:26:53 |
|
||
|
ActiveMQ JMS -- странности topic-ов
|
|||
|---|---|---|---|
|
#18+
cdtyjv, Что надо сделать, чтобы сообщения по поступлению в топик посылались всем активным подписчикам, и после этого тут же удалялись ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2013, 16:51:59 |
|
||
|
ActiveMQ JMS -- странности topic-ов
|
|||
|---|---|---|---|
|
#18+
MasterZiv, Вот у парня противоположная проблема - он хочет получать прошлые сообщения, но не получает. Может быть натолкнет вас на что-то: http://stackoverflow.com/questions/1839444/activemq-how-to-dequeue-older-messages ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2013, 17:33:20 |
|
||
|
ActiveMQ JMS -- странности topic-ов
|
|||
|---|---|---|---|
|
#18+
В общем, был сам дурак. Посылал сообщение в топик через транзакционную сессию, которую открывал для чтения сообщений из очереди. Сессия была транзакционная, а .commit() я не ставил. Как только сделал отдельную сессию, нетранзакционную (с автоACKNOLAGE) -- всё встало на свои места. (ну или можно было бы .commit()) вставить в нужное место. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2013, 14:41:27 |
|
||
|
|

start [/forum/search_topic.php?author=Dark4444&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
7ms |
get forum list: |
9ms |
get settings: |
5ms |
get forum list: |
24ms |
check forum access: |
8ms |
check topic access: |
8ms |
track hit: |
42ms |
get topic data: |
19ms |
get forum data: |
5ms |
get page messages: |
77ms |
get tp. blocked users: |
3ms |
| others: | 570ms |
| total: | 777ms |

| 0 / 0 |
