В настоящее время я пытаюсь установить приоритетность сообщений (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 всякий раз, когда мне нужно проверить приоритет, но это бы напрягло базу данных, и я хотел бы знать, есть ли более элегантное решение дляпроблема.