Основное требование, с которым я сталкиваюсь, заключается в том, что потребители не могут конкурировать за одно сообщение по теме.Например, у меня есть клиент, который публикует события колл-центра.Несколько систем подписываются на эти события.Одной из этих систем является приложение для маршрутизации вызовов, в котором запущено несколько экземпляров.Если каждый экземпляр подписывается, то вызов направляется всем им.Однако, если сообщение помещается в очередь и все экземпляры потребляют одну и ту же очередь, то только один получит сообщение, и вызов будет передан этому оператору.Если приложение публикации преобразует темы в очередь, колл-центр работает, но все другие приложения-подписчики не получают сообщение.
Решение (реализованное в WebSphere MQ) заключалось в создании административной подписки натема и доставить сообщения в очередь, из которой потребляются все экземпляры приложения.Таким образом, приложения-производители по-прежнему являются издателями, все динамические подписчики по-прежнему получают копии сообщения, а экземпляры приложения центра обработки вызовов конкурируют за один экземпляр каждого опубликованного сообщения.
Кроме того, вы не можете использовать семантику просмотра втема, тогда как вы можете в очереди.С темами вы можете указать селекторы для фильтрации сообщений, которые возвращаются, но это об этом.С помощью очередей вы можете просматривать, сбрасывать указатель обзора, а затем просматривать еще несколько.
Если вы помещаете сообщение в очередь, а для его получения ничего нет, сообщение остается в очереди.Если вы поместите сообщение в тему, и у вас нет активных подписчиков или постоянных подписок, сообщение будет отклонено.Поэтому сообщения в очереди естественным образом долговечны, тогда как сообщения по теме могут или не могут быть.
С точки зрения чистого JMS очередь и тема являются экземплярами назначения и являются взаимозаменяемыми, если вы не пытаетесь просматривать,Приложение может не знать, является ли открытое место назначения очередью или темой, если оно не использует instanceOf () во время выполнения для выяснения.