【发布时间】:2020-10-22 13:30:57
【问题描述】:
我有一个奇怪的情况,我不明白。 我想在一个 bean 中决定,我应该启用还是禁用 SQS 侦听器。 所以我创建了一个带有定义的配置类:
@Bean
MyListener createListener(Features f){
return f.shouldListen() ? new RealListener() : new MockListener();
}
如你所见,我有这样的继承:
interface MyListener{}
class RealListener implements MyListener{
@SqsListener(...)
list handleMessage(SqsMessage message){
...
}
}
class MockListener implements MyListener{}
现在,有趣的部分:
它有时有效。
在应用程序重新启动几次后,handleMessage() 方法被调用,但在大多数情况下它并非没有任何异常。队列已创建,所有权限均已到位。
为了使其工作,我需要从 createListener() 方法返回 RealListener 或将 @SqsListener 注释移动到 MyListener 接口中的方法。两者都不是我的选择,因为我不想在启用模拟时调用 AWS。
我尝试过创建条件 bean,但由于 Features 依赖于数据库(更准确地说,是间接 entityManager 依赖),我无法使其正常工作。我尝试过使用抽象类而不是接口,但没有运气。我试图在BeanFactoryPostProcessor 中注册RealListener bean,但这也不起作用(同样的entityManager 依赖问题)。我尝试将注解移至界面,并在启用模拟时使用@ConditionalOnBean 和@Primary 创建一个空的AmazonSqsClient,但它不起作用。
我可以理解它不起作用,因为必须为带有 @SqsListener 注释的方法的类型创建 bean(而不是它的超类/接口类型),但我有三个这样的 bean 和一个彩票- 有时所有工作,有时一两个,但有时一个都没有。
你有什么建议吗?
【问题讨论】:
标签: java amazon-web-services amazon-sqs spring-messaging