(x-posted到guice邮件列表)
我正在试用一个将存在于现有应用程序中的新库。我们现在所有的应用程序都是spring应用程序,我们有一些与spring相关的常用代码,主要与我们倾向于使用的线程模型有关。它基本上给了我们(可以看作是什么)a 逻辑线程。
因此,我们可以向其投入工作,并确保具有给定密钥的作业始终按照提交的顺序在同一管道上结束。通常,这是应用程序生命周期中的单个线程,但如果发生了不好的事情,那么工作线程(支持管道)将被丢弃,管道停用,新工作程序创建并且管道在该工作程序上重新激活。这里的所有接线都是由弹簧提供的。
我的新lib需要将它用于线程模型&我计划使用guice作为逻辑和事物的领域方面,即构建管道上的工作&以及它所代表的逻辑。这对我来说似乎很简单,除了似乎有一件事 非常粗糙,即我想用“管道”(又称逻辑线程)范围注入某些东西。我已经阅读了自定义范围(以及SimpleScope实现)维基页面,但有些事情我不清楚,并且非常感谢澄清...
干杯 马特
答案 0 :(得分:0)
我已经实现了一些可行的但是涉及一些稍微丑陋的设置...仍然对这个&的任何改进感兴趣可能有一些太多的代码要发布真的所以只是把一些片段放在希望照亮
这是SimpleScope示例的一个变体,涉及;
似乎我必须抓取特定的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());
}
总而言之,似乎运作得非常好......至少在我的快速撞击测试带中无论如何