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组件关联,但具有该状态。正如您在一篇评论中提到的,至少在上述声明有效的情况下,它是线程安全的。