В документации Camel для компонента JMS описан параметр forceSendOriginalMessage
, в котором говорится:
При использовании mapJmsMessage = false Camel создаст новое сообщение JMS для отправки новому Пункт назначения JMS, если вы коснетесь заголовков (получить или установить) во время маршрута. Установите для этого параметра значение true, чтобы заставить Camel отправлять исходное сообщение JMS, которое было получено.
forceSendOriginalMessage
по умолчанию false
.
В документах говорится об этом mapJmsMessage
:
Указывает, должен ли Camel автоматически сопоставлять полученное сообщение JMS с подходящим типом полезной нагрузки, например javax.jms.TextMessage, в строку String et c.
mapJmsMessage
по умолчанию true
.
Поэтому кажется, что вам нужно установить mapJmsMessage=false
& forceSendOriginalMessage=true
.
Имейте в виду, что Camel будет использовать JMS API для получения сообщения и его повторной отправки. Даже если новое сообщение будет иметь тот же текст и заголовки, что и старое сообщение, оно будет немного отличаться, поскольку спецификация JMS диктует, что при отправке сообщения брокер должен назначить ему идентификатор сообщения и метку времени. Поэтому JMSMessageID и JMSTimestamp в новом сообщении будут отличаться от старого сообщения, и в действительности это никак не обойти. Если вам необходимо уникально идентифицировать сообщение, вы должны установить корреляционный идентификатор в исходном сообщении и использовать его для идентификации сообщения, а не JMSMessageID. Кроме того, если вам нужно сохранить исходное время отправки сообщения, задайте его в пользовательском свойстве.
Причина, по которой JMSMessageID и JMSTimestamp не изменяются при перемещении сообщений через консоль управления, заключается в том, что посредник перемещает сообщения внутри с помощью совершенно другого механизма, чем JMS.