设置会话变量可用于分割器的所有会话

时间:2016-07-14 05:19:52

标签: session variables mule splitter

我遇到的情况是我使用集合聚合器在一个流中读取多个文件。然后我使用拆分器将文件拆分为逐个处理。现在,我想将文件的一些元素放入一个地图中,我希望这个地图可用于所有分割器会话,以便我可以为每个文件填充它。

使用文件处理的范围进行设置,即在拆分器打开后使其可用于当前的文件处理会话。但是,我想在分割器之前将会话变量声明为null。分裂后,所有会话都可以使用吗?

我认为这就像我在第一个文件进程中看到的那样。我还想知道如何将会话变量设置为null。我好像没找到它。对此情况的任何其他解决方案将不胜感激。

这是我的流程:

<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:json="http://www.mulesoft.org/schema/mule/json"
    xmlns:mulexml="http://www.mulesoft.org/schema/mule/xml"
    xmlns:file="http://www.mulesoft.org/schema/mule/file" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
    xmlns:spring="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.mulesoft.org/schema/mule/json http://www.mulesoft.org/schema/mule/json/current/mule-json.xsd
http://www.mulesoft.org/schema/mule/xml http://www.mulesoft.org/schema/mule/xml/current/mule-xml.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/file http://www.mulesoft.org/schema/mule/file/current/mule-file.xsd">
    <flow name="dictionary_keywordsFlow">
        <file:inbound-endpoint path="D:\mJunction\CATALOG INTEGRATION TO BE MODIFIED\sOURCE FILES\Read_dir" connector-ref="Filefinal" pollingFrequency="10000" responseTimeout="10000" doc:name="File" moveToDirectory="D:\mJunction\CATALOG INTEGRATION TO BE MODIFIED\sOURCE FILES\Read_dir\backup">
            <file:filename-regex-filter pattern="BSL.*" caseSensitive="true"/>
        </file:inbound-endpoint>
        <!-- <set-session-variable value="#[message.inboundProperties['originalFilename']]" variableName="filename" doc:name="Session Variable" /> -->
        <set-property propertyName="MULE_CORRELATION_ID" value="#[message.inboundProperties['originalFilename']]" doc:name="Property"/>
        <collection-aggregator failOnTimeout="true" doc:name="Collection Aggregator"/>
       <!--  <custom-transformer class="AddContainerMapSessionvalue" doc:name="Java"/> -->
         <splitter expression="#[payload]" doc:name="Splitter"/>
            <logger message="&gt;&gt;&gt; flow to extract keywords and create dictionary" level="INFO" doc:name="Logger"/>
            <logger message="Payload received for maeterial list is #[payload]" level="INFO" doc:name="Original Payload"/>
            <splitter expression="#[xpath3('//CATALOGUE',payload,'NODESET')]" doc:name="Splitter"/>
            <mulexml:dom-to-xml-transformer doc:name="DOM to XML"/>
            <json:xml-to-json-transformer doc:name="XML to JSON"/>
            <json:json-to-object-transformer returnClass="java.util.Map" doc:name="JSON to Object"/>
            <logger message="payload is #[payload]" level="INFO" doc:name="Logger"/>
            <custom-transformer class="com.mjunction.transformers.DictionarykeywordsGenerator" doc:name="Java"/>
            <logger message="payload is #[payload]" level="INFO" doc:name="Logger"/>
            <logger message="session variable is #[sessionVars.container_map]" level="INFO" doc:name="Logger"/>
            <json:object-to-json-transformer doc:name="Object to JSON"/>
             <file:outbound-endpoint path="src/main/resources/dictionaryfiles/output" outputPattern="output.txt" connector-ref="Filefinal" responseTimeout="10000" doc:name="File"/>




    </flow>
</mule>

谢谢, 阿伦

1 个答案:

答案 0 :(得分:0)

您可以定义空会话变量,如下所示

 <set-session-variable variableName="fileName" value="#['']" doc:name="Session Variable"/>.

是的,如果您在拆分器之前定义会话变量并存储地图(希望您从初始有效负载获取此地图)将通过会话提供。

如果您使用会话分割器,每次如果您在会话中提取和存储的有效负载结构相同,当然它会覆盖,这种情况下您可以使用缓存类型的概念。请参阅:https://docs.mulesoft.com/mule-user-guide/v/3.7/cache-scopeor当您为firstTime拆分存储它并将案例用于下一个会话时,请执行小条件检查#[sessionVars['fileName'] != null? 'true':'']。基于此,您可以构建待定逻辑。