Jader Wallauer
Jader Wallauer

Reputation: 215

How to access postgreSQL database using Mule pattern?

Im able to log some message but how to change it to access a database and send those messages and store there?

i know the database part is disconected from the pattern but tried somethings and nothing worked so far..

code:

<scripting:transformer name="noopLoggingTransformer">
    <scripting:script engine="groovy">
        log.info "insert into inbound_messages (payload, timestamp, agent, ip_from, endpoint, soap_operation) values ('',now(), ${message.getInboundProperty('user-agent')}, ${message.getInboundProperty('MULE_REMOTE_CLIENT_ADDRESS')}, ${message.getInboundProperty('http.request')}, '');"
        message
    </scripting:script>
</scripting:transformer>

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

<jdbc-ee:postgresql-data-source name="dbconection" 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="dbconection" validateConnections="false" transactionPerMessage="true" queryTimeout="10" pollingFrequency="10000" doc:name="JDBC"> 
    <jdbc-ee:query key="querymsg" value="insert into inbound_messages (payload, timestamp, agent, ip_from, endpoint, soap_operation) values ('', now(), '','','')"></jdbc-ee:query>  
</jdbc-ee:connector>

What i did after was try a different aproach:

<flow name="logradouros-autenticacao" doc:name="logradouros-autenticacao"> 
    <servlet:inbound-endpoint path="${webservice.logradouros.in.autenticacao.path}" responseTimeout="10000" doc:name="HTTP"></servlet:inbound-endpoint>  
    <async doc:name="Async"> 
        <flow-ref name="log-request" doc:name="Flow Reference"></flow-ref>  
    </async>  
    <outbound-endpoint exchange-pattern="request-response" address="${webservice.logradouros.out.protocol}://${webservice.logradouros.out.host}/${webservice.logradouros.out.autenticacao.path}" doc:name="Generic"></outbound-endpoint>  
</flow>

<flow name="log-request" doc:name="log-request"> 
    <logger message="1-&gt; #[groovy:payload.getClass()]" level="INFO" doc:name="Logger"></logger>  
    <jdbc-ee:outbound-endpoint exchange-pattern="one-way" queryKey="insertMsg" responseTimeout="10000" queryTimeout="-1" connector-ref="jdbcConnector" doc:name="Persist raw message"></jdbc-ee:outbound-endpoint>  
    <logger message="#[header:INBOUND:Host] #[header:INBOUND:http.method] #[message.inboundProperties.entrySet().toString()] #[groovy:payload.toString()] #[groovy: return message.getInboundPropertyNames().toString()] #[groovy: return message.getInboundProperty('request.parameters').toString()]" level="INFO" category="mule.http.accesslog" doc:name="Logger"></logger>  
    <logger message="#[message.outboundProperties.entrySet().toString()]" level="INFO" category="mule.http.accesslog" doc:name="Logger"></logger>  
</flow>

its not 100% but it may workout, the approach through pattern wasnt working...

Upvotes: 0

Views: 827

Answers (1)

David Dossot
David Dossot

Reputation: 33413

In your transformer, use muleContext.client to dispatch messages to VM queue consumed by another flow, which will take care of insert data in the DB.

So in your case, something similar to the following should work:

<scripting:transformer name="noopLoggingTransformer">
    <scripting:script engine="groovy">
        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/LogradouroServico.svc" wsdlFile="LogradouroServicos.wsdl" />

<flow name="log-request" doc:name="log-request"> 
    <vm:inbound-endpoint path="log-request.in" />
    <logger message="1-&gt; #[groovy:payload.getClass()]" level="INFO" doc:name="Logger" />
    <jdbc-ee:outbound-endpoint exchange-pattern="one-way" queryKey="insertMsg" responseTimeout="10000" queryTimeout="-1" connector-ref="jdbcConnector" doc:name="Persist raw message" />
    <!-- TODO use MEL, not these old style expressions -->
    <logger message="#[header:INBOUND:Host] #[header:INBOUND:http.method] #[message.inboundProperties.entrySet().toString()] #[groovy:payload.toString()] #[groovy: return message.getInboundPropertyNames().toString()] #[groovy: return message.getInboundProperty('request.parameters').toString()]" level="INFO" category="mule.http.accesslog" doc:name="Logger" />  
    <logger message="#[message.outboundProperties.entrySet().toString()]" level="INFO" category="mule.http.accesslog" doc:name="Logger" />
</flow>

Upvotes: 1

Related Questions