在使用Mule ESB定义流程时,有时会使用自定义的Java Component,例如:spring
<flow name="testFlow"> <xx:inbound-endpoint doc name="xxx" /> <component class="xxx.xxx" doc:name="Java Component"> </component> </flow>
默认状况下Mule引用自定义Component时,是request方式,即从inbound endpoint每推送一个Mule Message到Component节点时,建立一个Component instance去处理这条Message,处理完后instance被销毁。code
正常状况下,request方式能够知足通常要求,可是若是Component中存在用于统计数据(例如处理时间,处理条数)等的属性时,每次新建一个instance都会重置这些属性,致使全部Mule Message处理完后没法统计这些数据。component
针对这个问题,咱们有如下两种解决方法:xml
1)将这些统计数据的属性设置为static。class
2)将Java Component实例引用方式改成singleton方式。test
第二种方法有两种设置方式:object
<flow name="testFlow"> <xx:inbound-endpoint doc name="xxx" /> <component doc:name="Java Component"> <singleton-object class="xxx.xxx"/> </component> </flow>
<spring:beans> <spring:bean id="xxId" name="xxName" class="xxx.xxx" scope="singleton" /> </spring:beans> <flow name="testFlow"> <xx:inbound-endpoint doc name="xxx" /> <component doc:name="Java Component"> <spring-object bean="xxName"/> </component> </flow>
用这两种方式设置的singleton访问均可以保证数据正常被统计,固然,在统计完成后须要将这些属性归零。request