Jader Wallauer
Jader Wallauer

Reputation: 215

Get message inbound properties

im having trouble getting message inbound properties, somehow its coming as null, here is the code:

<scripting:transformer name="noopLoggingTransformer">
    <scripting:script engine="groovy">
        log.info "${message.getInboundProperty('user-agent')}"
        muleContext.client.dispatch('vm://log-request.in', message)
        message
     </scripting:script>
</scripting:transformer>

<pattern:web-service-proxy name="service" transformer-refs="noopLoggingTransformer" inboundAddress="${serverName}/services/Logradouros/LogradouroServico" outboundAddress="${targetServer}/servicos/v2/service.svc" wsdlFile="LogradouroServicos.wsdl">
</pattern:web-service-proxy>

<jdbc-ee:postgresql-data-source name="WSA" user="${database.user}" password="${database.pass}" url="${database.url}" transactionIsolation="UNSPECIFIED" doc:name="PostgreSQL Data Source">
</jdbc-ee:postgresql-data-source>

<jdbc-ee:connector name="jdbcConnector" dataSource-ref="WSA" validateConnections="false" transactionPerMessage="true" queryTimeout="10" pollingFrequency="10000" doc:name="JDBC"> 
    <jdbc-ee:query key="wsadb" value="insert into inbound_messages (payload, timestamp, agent, ip_from, endpoint, soap_operation) values ('', now(), #[groovy: return message.getInboundProperty('user-agent').toString()], #[groovy: return message.getInboundProperty('MULE_REMOTE_CLIENT_ADDRESS').toString()], #[groovy: return message.getInboundProperty('http.request').toString()], '');"></jdbc-ee:query>  
</jdbc-ee:connector>

<flow name="log-request" doc:name="log-request"> 
    <vm:inbound-endpoint path="log-request.in" />
    <logger message="#[message.inboundProperties['user-agent']]" level="INFO" doc:name="Logger"/>
    <jdbc-ee:outbound-endpoint exchange-pattern="one-way" queryKey="wsadb" responseTimeout="10000" queryTimeout="-1" connector-ref="jdbcConnector" doc:name="Persist raw message" />
</flow>

What it prints out is "null" and i dont know how to make it print the property from message...

Upvotes: 2

Views: 18348

Answers (2)

Charu Khurana
Charu Khurana

Reputation: 4551

Property name is User-Agent and as David pointed out, #message.inboundProperties['User-Agent']] is the MEL way to get it.

Did you make sure User-Agent property is set on the mule message when you're trying to access it. It's not always there

Remember inbound properties are not propagated unless you copy property manually like by

<copy-properties propertyName="*"/>

Upvotes: 1

David Dossot
David Dossot

Reputation: 33413

No need to use Groovy:

<logger message="#[message.inboundProperties['user-agent']]" level="INFO" doc:name="Logger"/>

But your bigger issue is that you are not propagating the inbound properties to the outbound scope prior to dispatching to vm://log-request.in.

You need to propagate the properties you want to carry forward:

<scripting:transformer name="noopLoggingTransformer">
    <scripting:script engine="groovy">
        def props = [:]
        props['User-Agent'] = message.getProperty('User-Agent', org.mule.api.transport.PropertyScope.INBOUND)
        muleContext.client.dispatch('vm://log-request.in', payload, props)
        message
     </scripting:script>
</scripting:transformer>

Of course, you can iterate the inbound property names to copy them all.

Upvotes: 9

Related Questions