两个DynamoDB bean-如何将bean限定为spring cloud stream



我在同一个项目中有两个AWS帐户。在一个帐户中,我有一个需要访问的DynamoDB数据库。在另一个,我有亚马逊Kinesis。为了正确运行kinesis生产者和消费者,我需要定义三个bean:一个用于kinesis,另一个用于Cloudwatch,最后一个用于Dynamo。

@Bean
public AmazonKinesisAsync amazonKinesisAsync() {
}
@Bean
public AmazonDynamoDBAsync amazonDynamoDBAsync() {
}
@Bean
public AmazonCloudWatchAsync amazonCloudwatchAsync() {
}

这很好。问题是AmazonDynamoDBAsync扩展了AmazonDynamoDB,并且我在项目中设置了另一个AmazonDynamoDBbean(以便访问另一个帐户(。这显然会导致以下错误:

org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.amazonaws.services.dynamodbv2.AmazonDynamoDB' available: expected single matching bean but found 2: amazonDynamoDBAsync,amazonDynamoDB
32
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) ~[spring-beans-5.3.20.jar!/:5.3.20]

我不知道如何指定给spring-cloud-streamspring-cloud-stream-binder-kinesis它应该使用哪个bean。我希望能够仅使用@Qualifier。我广泛阅读了文档,通过配置或代码搜索指定bean的方法,但一无所获。我还尝试删除AmazonDynamoDBAsyncbean,以迫使Kinesis使用另一个帐户上DynamoDB的现有bean,但似乎如果我不指定AmazonDynamoDBAsyncbean,spring-cloud-stream会尝试创建自己的bean,但我仍然得到NoUniqueBeanDefinitionException

关于如何指定spring-cloud-stream应该使用哪个Bean,有什么线索吗?不幸的是,我不能逃避使用两个AWS帐户。我的POM:

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-kinesis</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream</artifactId>
<version>3.2.5</version>
</dependency>

最后,在AmazonDynamoDBAsync上简单地使用@Primary就成功了。然而,我还犯了一些其他错误。对于任何有相同或类似问题的人,我不建议在同一项目中使用两个使用相同SDK的Dynamo bean,这只会让你头疼。如果可以的话,最好不要有一个以上的豆子。如果你不能逃避,拥有两个SDK可以帮助我组织"谁是谁"。最后我停止使用spring-cloud-stream,转而使用KCL 2.X。因此,对于不同的AWS SDK实现(另一个Dynamo使用的是SDK 1.X(,我没有更多的冲突。

最新更新