如果 Mule Expression 组件中的其他条件检查没有存储会话变量?
If else condition checking in Mule Expression component not storing out session Variable?
我正在尝试在表达式组件中执行简单的 if else 条件。在表达式组件之后我有记录器。我在这里的查询是我无法看到 test1
但可以在记录器组件中查看 temp
值。为什么?
同时,如果我在 system.out.println 中打印 test1
值。获取值,但为什么不在记录器中?
<quartz:inbound-endpoint responseTimeout="10000" doc:name="Quartz" connector-ref="Quartz" jobName="Feedjob" repeatInterval="36000000" >
<quartz:event-generator-job groupName="Feedjob" jobGroupName="Feedjob"/>
</quartz:inbound-endpoint>
<s3:list-objects config-ref="Amazon_S3" doc:name="Amazon S3" bucketName="${amazon.BucketName}" prefix="master"/>
<foreach doc:name="For Each">
<set-variable variableName="TestValue" value="#[payload.getKey()]" doc:name="Variable"/>
<expression-component doc:name="Expression"><![CDATA[
sessionVars.temp = message.outboundProperties['MULE_CORRELATION_SEQUENCE'] ;
if ( sessionVars.temp == "2"){
sessionVars.test1 = sessionVars.temp ;
System.out.println(sessionVars.test1);
return message.payload;
}
else{
System.out.println(" No test");
return message.payload;
}
]]></expression-component>
<logger message="Payload**********temp:#[sessionVars.temp] test1: #[sessionVars.test1]" level="INFO" doc:name="Logger"/>
</foreach>
<logger message="Outside For each logger**********temp:#[sessionVars.temp] test1: #[sessionVars.test1]" level="INFO" doc:name="Logger"/>
好像是设置了表达式组件sessionVars.temp返回的payload之后,但是出现了sessionVars.test1。它很奇怪。我哪里错了?
我试图通过以下方式重新创建您的场景:-
<set-property propertyName="MULE_CORRELATION_SEQUENCE" value="2" doc:name="Property"/>
<expression-component doc:name="Expression"><![CDATA[
sessionVars.temp = message.outboundProperties['MULE_CORRELATION_SEQUENCE'] ;
if ( sessionVars.temp == "2"){
sessionVars.test1 = sessionVars.temp ;
System.out.println(sessionVars.test1);
return message.payload;
}
else{
System.out.println(" No test");
return message.payload;
}
]]></expression-component>
并且我能够在记录器中获取值:- INFO 2015-08-06 09:19:48,556 [[testcon].HTTP_Listener_Configuration1.worker.01] org.mule.api.processor.LoggerMessageProcessor: Payload**********temp:2 test1: 2
确保您的出站 属性 MULE_CORRELATION_SEQUENCE 不为空或包含值
解决此问题的两种方法:
- 在访问会话变量时使用
#[sessionVars['test1']]
而不是 #[sessionVars.test1]
。
- 在 if 块
之前声明会话变量 sessionVars.test1="";
问题似乎与使用 .
运算符访问变量的方式有关。仅当在第一次未创建这些变量的组件中声明变量时才会发生这种情况(在您的情况下,test1 变量仅在第二次 foreach 迭代中创建,而不是在第一次迭代中创建)。如果您的条件是if ( sessionVars.temp == "1")
,您就不会遇到这个问题。
显然 mule 已经在最新版本中修复了这个问题,3.7 似乎按预期工作。我在 3.5 中遇到了同样的问题。
我正在尝试在表达式组件中执行简单的 if else 条件。在表达式组件之后我有记录器。我在这里的查询是我无法看到 test1
但可以在记录器组件中查看 temp
值。为什么?
同时,如果我在 system.out.println 中打印 test1
值。获取值,但为什么不在记录器中?
<quartz:inbound-endpoint responseTimeout="10000" doc:name="Quartz" connector-ref="Quartz" jobName="Feedjob" repeatInterval="36000000" >
<quartz:event-generator-job groupName="Feedjob" jobGroupName="Feedjob"/>
</quartz:inbound-endpoint>
<s3:list-objects config-ref="Amazon_S3" doc:name="Amazon S3" bucketName="${amazon.BucketName}" prefix="master"/>
<foreach doc:name="For Each">
<set-variable variableName="TestValue" value="#[payload.getKey()]" doc:name="Variable"/>
<expression-component doc:name="Expression"><![CDATA[
sessionVars.temp = message.outboundProperties['MULE_CORRELATION_SEQUENCE'] ;
if ( sessionVars.temp == "2"){
sessionVars.test1 = sessionVars.temp ;
System.out.println(sessionVars.test1);
return message.payload;
}
else{
System.out.println(" No test");
return message.payload;
}
]]></expression-component>
<logger message="Payload**********temp:#[sessionVars.temp] test1: #[sessionVars.test1]" level="INFO" doc:name="Logger"/>
</foreach>
<logger message="Outside For each logger**********temp:#[sessionVars.temp] test1: #[sessionVars.test1]" level="INFO" doc:name="Logger"/>
好像是设置了表达式组件sessionVars.temp返回的payload之后,但是出现了sessionVars.test1。它很奇怪。我哪里错了?
我试图通过以下方式重新创建您的场景:-
<set-property propertyName="MULE_CORRELATION_SEQUENCE" value="2" doc:name="Property"/>
<expression-component doc:name="Expression"><![CDATA[
sessionVars.temp = message.outboundProperties['MULE_CORRELATION_SEQUENCE'] ;
if ( sessionVars.temp == "2"){
sessionVars.test1 = sessionVars.temp ;
System.out.println(sessionVars.test1);
return message.payload;
}
else{
System.out.println(" No test");
return message.payload;
}
]]></expression-component>
并且我能够在记录器中获取值:- INFO 2015-08-06 09:19:48,556 [[testcon].HTTP_Listener_Configuration1.worker.01] org.mule.api.processor.LoggerMessageProcessor: Payload**********temp:2 test1: 2
确保您的出站 属性 MULE_CORRELATION_SEQUENCE 不为空或包含值
解决此问题的两种方法:
- 在访问会话变量时使用
#[sessionVars['test1']]
而不是#[sessionVars.test1]
。 - 在 if 块 之前声明会话变量
sessionVars.test1="";
问题似乎与使用 .
运算符访问变量的方式有关。仅当在第一次未创建这些变量的组件中声明变量时才会发生这种情况(在您的情况下,test1 变量仅在第二次 foreach 迭代中创建,而不是在第一次迭代中创建)。如果您的条件是if ( sessionVars.temp == "1")
,您就不会遇到这个问题。
显然 mule 已经在最新版本中修复了这个问题,3.7 似乎按预期工作。我在 3.5 中遇到了同样的问题。