我在应用程序中实现了一种生产者-消费者模式。一方面生产者推动实体处理从不同来源接收到的事件,另一方面我让消费者从队列中取出事件并对其进行处理。
生产者和消费者都是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?
发布于 2016-05-12 16:40:44
Don Bottstein建议的将会起作用,你只需要像这样使用它。
@Configuration
public class QueueConfig {
@Bean
public BlockingQueue<MyObject> blockingQueue() {
return new LinkedBlockingQueue<>();
}
}
然后在类中,Producer和Consumer这样做:
@Component
public class Producer {
@Autowired
private QueueConfig queueConfig;
public void produceMyObject(MyObject myObject) {
queueConfig.blockingQueue.put(myObject);
}
}
发布于 2015-08-04 19:43:15
基本上,您将定义一个带@Configuration
注释的类来注册给定类型的bean。例如,
@Configuration
public class AppConfig {
@Bean
public BlockingQueue<MyObject> sharedQueue() {
return new LinkedBlockingQueue<>();
}
}
bean名称缺省为方法的名称(在本例中为sharedQueue
),或者您可以覆盖注释(@Bean(name="someName")
)中的名称。默认作用域是singleton,可以在方法上使用@Scope(...)
进行更改。
就像带@Component
注释的类一样,@Configuration
类在组件扫描期间被拾取。
但是,我不认为使用包装器类有任何问题。实际上,使用包装器类将允许您更容易地在实现中添加自适应。
https://stackoverflow.com/questions/31790412
复制