How to check if a file exists in Mule esb

I want to use selection flow control, which will select one route when a file named # [function: dateStamp: dd-MM-yyyy] .xml exists and another route when this file does not exist.

Is it possible to write the β€œwhen” part of the choice to check for a file?

+4
source share
4 answers

You can use MEL:

<configuration> <expression-language> <import class="java.text.SimpleDateFormat" /> <global-functions><![CDATA[ def xmlFileExists() { filePath = '/tmp/' + new SimpleDateFormat('dd-MM-yyyy').format(new Date()) + '.xml'; new File(filePath).isFile(); } ]]></global-functions> </expression-language> </configuration> ... <choice> <when expression="#[xmlFileExists()]"> ... </when> <otherwise> ... </otherwise> </choice> 
+9
source

Not sure what it will look like, but you can always do it in plain Java. Place the Java component before choosing:

 <component doc:name="CheckFileExists"> <singleton-object class="com.example.CheckFileExist"> </singleton-object> </component> 

Check the file in Java code and add a message property to the invocation area.

Then make a selection using the invocation property:

 <choice doc:name="Choice"> <when expression="message.getInvocationProperty('thevariable')" evaluator="groovy"> <processor-chain> .... </processor-chain> </when> <choice> 
+3
source

If you want to check the availability of files at a specific time or during an interval, you can use quartz with the query module

 <flow name="filePollQuartzFlow1" doc:name="filePollQuartzFlow1"> <quartz:inbound-endpoint jobName="job" repeatInterval="60000" startDelay="1000" responseTimeout="10000" doc:name="Quartz"> <quartz:event-generator-job/> </quartz:inbound-endpoint> <mulerequester:request config-ref="Mule_Requester" resource="file://#[function:dateStamp:dd-MM-yyyy].xml" doc:name="Request a message from a directory"/> <choice doc:name="Choice"> <when expression="#[message.payload==null]"> <logger message="NO FILE FOUND" level="ERROR" doc:name="Log Null Payload"/> </when> <otherwise> <byte-array-to-string-transformer doc:name="Byte Array to String"/> <logger message="FILE FOUND: #[message.payload]" level="ERROR" doc:name="Log Payload"/> </otherwise> </choice> </flow> 
+1
source

Here is how I did it:

 <flow name="stateFileFlow" doc:name="stateFileFlow"> <file:inbound-endpoint connector-ref="input" path="/path" doc:name="File"> <file:filename-regex-filter pattern="(^ABC).xml" caseSensitive="true"/> </file:inbound-endpoint> <choice doc:name="Choice"> <when expression="#[message.outboundProperties['filename'] == null]"> <logger level="WARN" doc:name="Logger" message="NO FILE"/> </when> <otherwise> <logger level="WARN" doc:name="Logger" message="FILE EXISTS"/> <file:outbound-endpoint connector-ref="output" path="/path" doc:name="File"/> </otherwise> </choice> </flow> 

And this is one more thing that simplifies working with an existing message:

 <sub-flow name="stateFileFlow" doc:name="stateFileFlow"> <message-properties-transformer scope="invocation" overwrite="true" doc:name="Message Properties"> <add-message-property key="path" value="/path" /> <add-message-property key="format" value="dd-MM-yyyy" /> <add-message-property key="extension" value="flag" /> </message-properties-transformer> <scripting:component doc:name="asdf"> <scripting:script engine="groovy"> <scripting:text> def format = message.getInvocationProperty('format'); def path = message.getInvocationProperty('path'); def fileName = new Date().format(format) + "." + message.getInvocationProperty('extension'); def filePath = path + File.separator + fileName; def exists = new File(filePath).isFile(); message.setProperty('exists',exists, org.mule.api.transport.PropertyScope.OUTBOUND); message.setProperty('filename',fileName, org.mule.api.transport.PropertyScope.OUTBOUND); return message.payload; </scripting:text> </scripting:script> </scripting:component> <choice doc:name="Choice"> <when expression="#[message.outboundProperties['exists'].toString() == 'true']"> <logger level="INFO" doc:name="Logger" message="FILE EXISTS"/> </when> <otherwise> <logger level="INFO" doc:name="Logger" message="CREATING FILE #[message]"/> <file:outbound-endpoint connector-ref="output" path="/path" doc:name="File"/> </otherwise> </choice> </sub-flow> 
0
source

Source: https://habr.com/ru/post/1495962/


All Articles