Мы переходим с Mule 3 на Mule 4, и в одной из наших функций нам нужно публиковать сообщения в теме, а в дальнейшем другой компонент мула потребляет из очереди, которая подключена к теме.
Здесь ничего особенного .
Чтобы убедиться, что мы можем отслеживать поток через журналы, мы отправляли атрибут «TrackingId» при публикации сообщений в теме (Mule 3).
message.setOutboundProperty("XYZ_TrackingID", flowVars['idFromUI']);
return payload;
Однако, когда я пытаюсь сделать то же самое в Mule 4, мы получаем следующее исключение:
ERROR 2020-12-20 10:09:12,214 [[MuleRuntime].cpuIntensive.14: [mycomponent].my_Flow.CPU_INTENSIVE
@66024695] org.mule.runtime.core.internal.exception.OnErrorPropagateHandler:
Message : groovy.lang.MissingMethodException: No signature of method:
org.mule.runtime.api.el.BindingContextUtils$MessageWrapper.setOutboundProperty() is applicable for
argument types: (java.lang.String, org.mule.weave.v2.el.ByteArrayBasedCursorStream) values:
[XYZ_TrackingID, "1234567"].\nError type : (set debug level logging or '-
Dmule.verbose.exceptions=true' for
everything)\n********************************************************************************
Проверил интернет, и кажется, что в настройках Mule4 исходящие свойства удалены, как здесь
Итак, как мне добиться того же в Mule 4?
Даже не пытайтесь сделать это по нескольким причинам. Для одного сообщения структура другая, поэтому выходных свойств больше не существует, и этого метода даже не существует. С другой стороны, компоненты Mule 4, такие как компонент Groovy, могут возвращать только значение и не могут изменять событие. Они не могут решить, чему будет присвоено это значение. Вы можете установить цель в конфигурации (полезная нагрузка или переменная) и не изменять атрибуты. Обратите внимание, что на переменные в Mule 4 ссылаются с помощью var.
, а не flowVars.
, как в Mule 3 (т.е. vars.idFromUI
).
Существует более простой способ установить свойства сообщения в JMS-коннекторе Mule 4. Используйте элемент свойств и передайте ему объект со свойствами.
Например, это может быть что-то вроде этого:
<jms:publish config-ref = "JMS_config" destination = "${bridgeDestination}" destinationType = "TOPIC">
<jms:message>
<jms:body>#["bridged_" ++ payload]</jms:body>
<jms:properties>#[{
XYZ_TrackingID: vars.idFromUI
}]</jms:properties>
</jms:message>
</jms:publish>
Он есть в документации: https://docs.mulesoft.com/jms-connector/1.0/jms-publish#setting-user-properties. Я адаптировал свой пример оттуда.
Я не уверен, что Correlation Id
служит идентификатором отслеживания для вашего сценария. Но вы можете передать CID, как показано ниже. Это есть в документации по мулу.
https://docs.mulesoft.com/jms-connector/1.7/jms-publish
<jms:publish config-ref = "JMS_config" sendCorrelationId = "ALWAYS" destination = "#[attributes.headers.replyTo.destination]">
<jms:message correlationId = "#[attributes.headers.correlationId]"/>
</jms:publish>
Если вашим приоритетом является настройка идентификатора отслеживания, который вы хотите опубликовать, попробуйте передать следующий формат. Имена ключей могут отличаться в зависимости от вашего варианта использования.
<jms:publish config-ref = "JMS_config" destination = "${bridgeDestination}" destinationType = "TOPIC">
<jms:message>
<jms:body>#["bridged_" ++ payload]</jms:body>
<jms:properties>#[{
AUTH_TYPE: 'jwt',
AUTH_TOKEN: attributes.queryParams.token
}]</jms:properties>
</jms:message>
</jms:publish>
В приведенном выше выражении attributes.queryParams.token
в основном пытается получить доступ к параметрам запроса token
, которые передаются в JMS как свойство AUTH_TOKEN
имя-ключа, используемое API ранее через HTTP-прослушиватель или запросчик.
Однако attributes.headers.correlationId
— это заголовок. И queryParams, и заголовки являются частью атрибутов в Mule 4.
спасибо, это похоже на предыдущий ответ, который решает мою проблему, спасибо