【发布时间】:2015-08-03 14:50:58
【问题描述】:
我在我的应用程序中实现了一种生产者-消费者模式。一方面,生产者推动实体处理从不同来源收到的进程,另一方面,我有消费者将这些事件从队列中取出并处理它们。
生产者和消费者都是 spring bean 并且是自动发现的,并且都需要链接到这个共享队列。我知道我可以在 xml 文件或 Java 配置中定义我的 bean,并将此队列作为参数作为构造函数参数或通过 setter 传递,但是有没有办法自动导入它。我想到的唯一想法是为这个队列创建一个包装器,然后注入这个包装器:
@Component
public class QueueWrapper {
private final BlockingQueue<MyObject> sharedQueue = new LinkedBlockingQueue<>();
public void put(MyObject toPut) {
sharedQueue.put(toPut);
}
public MyObject take() {
return sharedQueue.take();
}
}
@Component
public class Producer {
@Autowire
private QueueWrapper queue;
....
}
@Component
public class Consumer {
@Autowire
private QueueWrapper queue;
....
}
是否值得创建这个包装器?我知道@Resource 注释,但我只将它与列表、地图和集合一起使用,实际上不知道如何配置资源Java 配置文件。 Spring 文档页面中的 XML 列表示例:
<util:list id="emails">
<value>pechorin@hero.org</value>
<value>raskolnikov@slums.org</value>
<value>stavrogin@gov.org</value>
<value>porfiry@gov.org</value>
</util:list>
然后是Java类:
@Component
public class SomeClass {
@Resource(name="emails")
private List<String> emails;
}
有没有办法在 java 配置中创建队列作为此类资源?还是有其他方法可以将共享队列注入不同的 bean?
【问题讨论】:
-
可能是一个
@Component class ProducerConsumerConfiguration有一个getQueue()方法。但这更多是概念上的差异,仍然是某种包装。