2

(x-发布到 guice 邮件列表)

我正在一个将存在于现有应用程序中的新库上试用 Guice。我们现在所有的应用程序都是 Spring 应用程序,我们有一些与 Spring 相关的通用代码,主要与我们倾向于使用的线程模型有关。它基本上给了我们(可以被视为)一个逻辑线索。

所以我们可以向它抛出作业,它确保具有给定键的作业总是按照提交的顺序在同一个管道上结束。通常这是应用程序生命周期中的单个线程,但如果发生坏事,那么工作线程(支持管道)将被丢弃,管道停用,创建新的工作人员并在该工作人员上重新激活管道。这里的所有接线都由弹簧提供。

我的新库需要将其用于线程模型,并且我计划将 guice 用于事物的逻辑和域方面,即构建管道上的工作以及它所代表的逻辑。这对我来说似乎很简单,除了一件看起来很粗糙的事情,即我想用“管道”(又名逻辑线程)范围注入某些东西。我已经阅读了自定义范围(和 SimpleScope 实现)维基页面,但有些事情对我来说并不清楚,非常感谢澄清......

  1. 管道在 JVM 的生命周期中存活,因此似乎我需要进入一个范围但从不退出,这有什么缺点吗?
  2. 在 Spring 托管 bean 中触发范围条目有哪些选项?它只是创建spring上下文然后使用SpringIntegration将spring bean吸入guice上下文的情况吗?
  3. 这听起来真的很不稳定,我应该用一个由我的管道 ID 键入的单例来包装它吗?

干杯马特

4

1 回答 1

0

我已经实现了一些可行的东西,但涉及一些有点难看的设置......仍然对对此的任何改进感兴趣并且可能有太多代码要发布,所以只需放一些片段,希望能照亮

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

  • 提出春季ctx
  • 从中获取特定的 bean(即管道键的注册表)
  • 将它与 beanfactory 一起传递给 Guice 模块
  • 将该注册表提供给 Scope impl,以便在激活管道时输入范围(稍后会在某些 spring bean 被初始化时发生)

看来我必须抓住特定的bean,而不是在beanfactory上执行bindAll之后通过Named访问它,因为Scope实例是自己在模块中新建的,即

    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());
}

总而言之,似乎运行得非常好……至少在我快速完成的测试工具中

于 2009-07-03T19:25:25.077 回答