Замена сообщения в очереди jms - PullRequest
6 голосов
/ 24 октября 2008

Я использую activemq для передачи запросов между различными процессами. В некоторых случаях у меня есть несколько повторяющихся сообщений (которые являются запросами) в очереди. Я хотел бы иметь только один. Есть ли способ отправить сообщение таким образом, чтобы оно заменило старое сообщение аналогичными атрибутами? Если нет, есть ли способ проверить очередь и проверить наличие сообщений с определенными атрибутами (в этом случае я не буду отправлять новое сообщение, если существует более старое).

Уточнение (основано на ответе Дейва): На самом деле я пытаюсь убедиться, что в очереди нет повторяющихся сообщений, чтобы уменьшить объем обработки, которая происходит, когда потребитель получает сообщение. Поэтому я хотел бы либо заменить сообщение, либо даже не помещать его в очередь.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 27 октября 2008

Это звучит как идеальный вариант использования для Idempotent Consumer , который удаляет дубликаты из очереди или темы.

В следующем примере показано, как это сделать с Apache Camel , который является самым простым способом реализации любого из корпоративных интеграционных шаблонов , особенно если вы используете ActiveMQ который поставляется с интегрированным верблюдом из коробки

from("activemq:queueA").
  idempotentConsumer(memoryMessageIdRepository(200)).
  header("myHeader").
  to("activemq:queueB");

Единственная хитрость в этом заключается в том, чтобы убедиться, что есть простой способ вычислить выражение уникального идентификатора для каждого сообщения - например, извлечь XPath из документа или использовать, как в примере выше, некоторый уникальный заголовок сообщения

1 голос
/ 24 октября 2008

Вы можете просматривать очередь и использовать селекторы для идентификации сообщения. Однако, если у вас мало сообщений, это не очень хорошо масштабируется. Вместо этого ваше сообщение должно быть просто указателем на запись базы данных (или набор записей). Таким образом, вы можете обновить запись, и тот, кто получит сообщение, получит доступ к последней версии записи.

...