2009-07-02 37 views
1

(X-张贴到吉斯邮件列表)吉斯定制范围和Spring管理豆

我对将生活在一个现有的应用程序中的新的图书馆试用吉斯。我们现在所有的应用程序都是Spring应用程序,我们有一些与Spring相关的通用代码,主要是处理我们倾向于使用的线程模型。它基本上给我们(可以看作是)一个逻辑线程 。

因此,我们可以在它上面投掷作业,并确保具有给定关键点的作业总是以它们提交的顺序结束在同一个管道上。通常情况下,这是应用程序生命周期的单个线程,但如果发生不良事件,则工作线程(支持管道)将被废弃,管道停用,创建新工人并在该工人上重新激活管道。这里的所有接线都是由弹簧提供的。

我的新的lib需要&我打算使用吉斯对事物的逻辑&域方面,即构建是那张管道&和它所代表的逻辑工作使用的线程模型。这似乎对我来说很简单,除了一件看起来很粗糙的东西,即我想用“管道”(又名逻辑线程)作用域注入某些东西。我读过的定制范围(和SimpleScope实现)的维基页面,但有些事情是我不明白和澄清,将不胜感激......

  1. 管存活的JVM的生命因此看来我需要进入一个范围,但永远不会退出,这有什么缺点?
  2. 我有什么选择来触发春季托管bean的范围条目?是否只是创建Spring上下文,然后使用SpringIntegration将spring bean吸引到guice环境中?
  3. 这听起来真的很脆弱,我应该用一个由我的管道ID键入的单例来包装它呢?

干杯 马特

回答

0

我实现了一些东西,工作,但涉及到一些稍微难看设置...依然有兴趣的任何改进这个&有可能是有点过分代码张贴真的那么公正在希望照片中加入一些片段

这是SimpleScope示例中的一个变体,其涉及;

  • 带来了春天CTX
  • 抓住一个特定豆出来的(即管道键的注册表)
  • 顺便指出,与Bean工厂
  • 给该注册表沿吉斯模块范围impl因此范围是在管道激活时输入的(后来发生在某些弹簧豆被初始化时)

看来我必须抓住特定的bean,而不是通过Nam访问它ED上的beanfactory做bindAll作为Scope实例new'ed自己的模块,即

PipeScope<SecurityId> pipeScope = new PipeScope<SecurityId>(); 
    pipeScope.setPipeIdRegistry(pipeIdRegistry); 
    bindScope(Pipe.class, pipeScope); 
    bind(PipeScope.class) 
      .annotatedWith(Names.named("pipeScope")) 
      .toInstance(pipeScope); 
    SpringIntegration.bindAll(binder(), beanFactory); 

我有新的事实,这意味着我需要明确地提供注册表到模块后,可以”因为它是鸡蛋&鸡蛋的情况,所以看不到这条路。

的PipeScope基本上存储值对管道键(实际上是一个键的列表),而不是一个ThreadLocal,所以我进入像

public void enter(List<K> scopedKeys) { 
    checkState(values.get(scopedKeys) == null, "A scoping block is already in progress"); 
    values.put(scopedKeys, Maps.<Key<?>, Object>newHashMap()); 
} 

一切的一切似乎便能很好地工作......至少在我的反应迅速打开测试设备