Что происходит, если сообщение JMS отправляется без заголовка JMSPriority - PullRequest
0 голосов
/ 03 января 2019

В настоящее время я пытаюсь установить приоритетность сообщений (JMS), проходящих через сложное приложение.

В той части, которая меня больше всего касается, пользователи вставляют сообщения в таблицу в БД, например, таблицу INPUT со столбцами DESTINATION, PRIORITY, MESSAGE.Столбец приоритета не является обязательным, остальные обязательны.

Затем приложение берет информацию из записей в этой таблице и создает JMS с заголовком JMSPriority = PRIORITY.Тело заполнено столбцом BODY, а затем JMS отправляется в очередь, указанную в DESTINATION.

КОДОВЫЕ ПОКРЫТИЯ:

//pull requests from database and set headers
from(RouteConstants.READ_REQUESTS_FROM_DATABASE) //this is a route formed by SQL 
    .transacted("PROPAGATION_REQUIRED_JBOSS")
    .process(setHeaderProperties) 
    .to("direct:jms");

//send JMS to destination
from("direct:jms").setBody(simple("${property.MESSAGE}"))
.convertBodyTo(String.class).recipientList(
simple("jms:queue:${property.DESTINATION}?
exchangePattern=InOnly&jmsMessageType=Text&preserveMessageQos=true
&disableReplyTo=true"));

public class SetHeaderProperties implements Processor {
    public void process(Exchange exchange) throws Exception {
      LinkedCaseInsensitiveMap body = (LinkedCaseInsensitiveMap) exchange.getIn().getBody();
      exchange.setProperty("MESSAGE", body.get("MESSAGE").toString());
      exchange.setProperty("DESTINATION", body.get("DESTINATION").toString());
      Long priority = getPriorityQuery(); //DAO method that returns value of PRIORITY or null if empty
      if(priority != null) exchange.setProperty("PRIORITY", priority);
}

//Receive the JMS. Consider this point to be the same that the message was sent to in the second snippet
from("jms:queue:input-msgs").
log(LoggingLevel.DEBUG, CAMEL_LOGGER_NAME, "Received JMSPriority: ${header.JMSPriority}").    //This getter is problematic, see below snippets
process(generalMessageProcessor);

Приложение ведет себя так, как должно, пока заполнен столбец PRIORITY,Когда значение PRIORITY равно null, метод получения всегда возвращает 4.Я понимаю, что приоритет 4 является значением по умолчанию, и я согласен с обработкой сообщения как такового, но я должен иметь возможность различать, когда приоритет 4 был установлен как фиксированное значение в таблице базы данных и, следовательно, запрошен, илиесли приоритет не был установлен вообще и, следовательно, программа должна вести себя немного по-другому внутри следующего процессора.

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

Наивный ответ, который, я полагаю, сработал бы, состоит в том, чтобы повторно вызывать запрос DAO всякий раз, когда мне нужно проверить приоритет, но это бы напрягло базу данных, и я хотел бы знать, есть ли более элегантное решение дляпроблема.

1 Ответ

0 голосов
/ 04 января 2019

Да, значение 4 является приоритетом JMS по умолчанию.Следовательно, у каждого сообщения есть приоритет, и такого понятия, как приоритет null или его отсутствие вообще не существует.

Однако один довольно простой обходной путь, который не напрягает базу данных, заключается в установке другого заголовка сообщения.как prioritySetByApplication или как вам нравится.Затем вы можете использовать этот заголовок, чтобы различать приоритет по умолчанию и «явный» приоритет 4.

...