Java多线程共享对象和bean自动装配

时间:2015-07-01 15:23:22

标签: java multithreading spring concurrency inversion-of-control

我们有一个基于弹簧的应用程序,它有两个级别的可运行程序: 父节点(调度程序)和子节点(加载程序),其中在ThreadPoolExecutor中运行的每个父节点都有一组子节点(同样在ThreadPoolExecutors中),它们需要一组父特定值(它们当前通过调用parent.getSomeProperty()获得)

我的问题是:我如何自动装配单亲及其子女使用的豆子?或者有没有办法让那些孩子意识到他们的“会话”/“上下文”有点说(这可以是通过散列“某事”获得的简单ID?

示例用例:

  • 每个调度程序都有一组用户属性(如UserID,3rdParty令牌/密码,计数器,isAborted..etc),其中载入程序引用
  • 加载程序从第三方不同端点获取数据并生成公共Obejects(具有来自父级和第三方的属性)并将它们放入单个FastMap(Javolution)中,由另一个执行DB INSERT / UPDATE的bean批量使用另一个线程

我正在将调度程序“parent”传递给它的所有子节点,这使得使用AppContext.getBean(...)静音,然后设置公共值/传递父节点。

1 个答案:

答案 0 :(得分:0)

由于我没有得到任何答案,我将发布我自己的实现,到目前为止:

我实现了一个SharedStore静态对象,它主要有两个方法:

void putShared(Object o, String objectKey)
<T> T getShared(String objectKey, int parentCode, Class<T> type)

父线程调用put,而子节点调用gets:

//Parent:
SomeClass someObject;
putShared(someObject, "someObjectKey");

这使用Thread.CurrentThread()。hashCode()将对象放入并发哈希映射

孩子在构造函数中有一个键集:

//Child constructor in BaseRunnable abstract class
private int parentKey = Thread.currentThread().hashCode();

并使用:

调用getMethod
//Child
getShared("someKey", parentKey, SomeClass.class);

并根据需要使用它(由孩子中的ThreadPoolExecutor中的多个孩子同时完成

所有Runnable bean都是带有惰性init的自动化原型,并扩展了基本抽象类,它实现了默认构造函数并设置了parentKey,其余的东西如DAO和3rdParty api obejects都是正常自动装配的。

批评赞赏!