Multithreading mulejava组件和线程安全

Multithreading mulejava组件和线程安全,multithreading,mule,Multithreading,Mule,本文摘录如下: 当您直接在组件或pooled component元素上指定类时,默认情况下使用PrototypeObjectFactory,并为每次调用创建一个新实例,或者在PooledJavaComponent的情况下创建一个新的pooled组件 我已经将一个Java类配置为Mule Java组件,如下所示: 。类SalesOrderProductsHandler已经实现了org.mule.api.lifecycle.Callable,并且有一个名为targetProductsIndex的状态

本文摘录如下:

当您直接在组件或pooled component元素上指定类时,默认情况下使用PrototypeObjectFactory,并为每次调用创建一个新实例,或者在PooledJavaComponent的情况下创建一个新的pooled组件

我已经将一个Java类配置为Mule Java组件,如下所示:

。类
SalesOrderProductsHandler
已经实现了
org.mule.api.lifecycle.Callable
,并且有一个名为targetProductsIndex的状态变量

我的问题如下:


每次有新请求时,是否会创建一个新的
com.mycompany.salesforderProductsHandler实例?

文档绝对正确。与:

<component class="com.mycompany.SalesOrderProductsHandler" />


对于每个调用,您将获得一个新的
com.mycompany.SalesOrderProductsHandler实例。

只是为了确认:这里每个调用意味着每个传入请求,不是吗?如果这是正确的,我可以在Java组件中有任何状态而不担心线程安全吗?“每次调用意味着每个传入请求”出于好奇,我只想知道:如果我的组件在
缓存中
范围内,会发生什么?组件仍然是线程安全的吗?否则,我应该做的是,在每次调用组件后清除/重置状态,即在返回
onCall()
方法之前恢复到状态变量的默认值就足够了。最好的做法是使组件无状态,并且不必担心线程安全。恢复到默认值不会使其成为线程安全的,删除所有状态将导致线程安全。缓存作用域不会更改实例化策略,但会影响“每个传入请求调用一个组件”的假设,因为并非所有传入请求都会命中该组件。好的。总结一下对我问题的回答:没有
缓存
作用域、
聚合器
或其他路由消息处理器与我的Java组件关联,但具有该状态。正如您在一篇评论中提到的,至少在上述声明有效的情况下,它是线程安全的。