【问题标题】:Java multi-threaded shared objects and bean autowiringJava 多线程共享对象和 bean 自动装配
【发布时间】:2015-07-01 15:23:22
【问题描述】:

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

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

示例用例:

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

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

【问题讨论】:

  • 与其将子节点耦合到父节点,您是否考虑过将参数封装到某种上下文对象中并将其传递给子工作者,可能使用队列?
  • 同样的问题:孩子使用的地图共享“上下文”的关键是什么?或者,传递它与将指针传递给父级一样......它不能自动装配
  • 你的父母如何获得所有这些属性?
  • 不同,3 个主要用途:AMQ 消息、HTTP 请求、DB(基于用户的东西)
  • 一个孩子可以同时属于多个父母吗?

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


【解决方案1】:

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

我实现了一个 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);

并根据需要使用它(由子线程池执行器中的多个子进程同时完成

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

欢迎批评!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-13
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    相关资源
    最近更新 更多