Search code examples
mulemule-componentmule-elmule-esb

Mule flow is not triggering


I am using Groovy inside Poll to check file existence at given location. My flow is working fine, when there is a file. But If I delete that file, flow is not triggering.Below is my code

<flow name="monitor-dst-file-flow">
    <poll doc:name="Poll">
        <schedulers:cron-scheduler expression="0 0 23 ? * TUE-SAT"/>
        <scripting:transformer doc:name="Groovy">
            <scripting:script engine="Groovy"><![CDATA[def endpointBuilder = muleContext.endpointFactory.getEndpointBuilder( 
                "sftp://${user}:${pwForGroovy}@${host}:${port}${inputpath}/?connector=SFTP")                    
                endpointBuilder.addMessageProcessor(new org.mule.routing.MessageFilter(new org.mule.transport.file.filters.FilenameWildcardFilter('test.txt'))) 

def inboundEndpoint = endpointBuilder.buildInboundEndpoint() inboundEndpoint.request(30000L)]]>

        </scripting:transformer>
    </poll>
    <choice doc:name="Choice">
        <when expression="#[message.inboundProperties.originalFilename ==&quot;test.txt&quot;]">
            <logger level="INFO" doc:name="Logger" message="File Exists..."/>
        </when>
        <otherwise>

            <logger message="FILE EXISTS" level="ERROR" doc:name="Logger"/>

            <flow-ref name="email-notification-sub-flow" doc:name="Flow Reference"/>

        </otherwise>
    </choice>
</flow>

Here, if there is no test.txt file, I am not able to debug Choice component.

It says -Polling of monitor-dst-file-flow returned null, the flow will not be invoked. I am not able to identify the exact solution to run my flow. I have to handle that condition, where given file is not there.


Solution

  • You need to return something besides null from the poller's target for the flow to be invoked. I'd recommend doing this in a sub-flow:

    <flow name="monitor-dst-file-flow">
      <poll doc:name="Poll">
        <schedulers:cron-scheduler expression="0 0 23 ? * TUE-SAT"/>
        <flow-ref name="pollerProcessor" doc:name="pollerProcessor"/>
      </poll>
      <choice doc:name="Choice">
        <when expression="#[payload == 'file not found']">
          <logger level="INFO" doc:name="Logger" message="File Exists..."/>
        </when>
        <otherwise>
          <logger message="FILE EXISTS" level="ERROR" doc:name="Logger"/>
          <flow-ref name="email-notification-sub-flow" doc:name="Flow Reference"/>
        </otherwise>
      </choice>
    </flow>
    <sub-flow name="pollerProcessor">
      <scripting:transformer doc:name="Groovy">
        <scripting:script engine="Groovy"><![CDATA[def endpointBuilder = muleContext.endpointFactory.getEndpointBuilder( 
          "sftp://${user}:${pwForGroovy}@${host}:${port}${inputpath}/?connector=SFTP")                    
          endpointBuilder.addMessageProcessor(new org.mule.routing.MessageFilter(new org.mule.transport.file.filters.FilenameWildcardFilter('test.txt'))) 
          def inboundEndpoint = endpointBuilder.buildInboundEndpoint() inboundEndpoint.request(30000L)]]>
        </scripting:script>
      </scripting:transformer>
      <set-payload value="#[payload == null ? 'file not found' : payload]" doc:name="Set Payload"/>
    </sub-flow>