У меня проблема при тестировании моего приложения в localstack.Требование простое.Я хотел бы подписаться на тему в AWS-SNS с подпиской SQS.В localstack, когда я выполняю, когда я настраиваю @SQSListener, он пытается проверить учетные данные с помощью AWS, и я получаю следующее сообщение об ошибке:
org.springframework.beans.factory.BeanCreationException: Ошибка создания бина с именем 'simpleMessageListenerContainer'определено в ресурсе пути к классу [org / springframework / cloud / aws / messaging / config / annotation / SqsConfiguration.class]: сбой вызова метода init;вложенное исключение - com.amazonaws.SdkClientException: невозможно загрузить учетные данные AWS от любого поставщика в цепочке:
Я попытался настроить фиктивные учетные данные для локального стека, которые также не помогли.Я пытался искать в сети, но не мог найти соответствующие сообщения по этому вопросу.
Код
@Slf4j
@Configuration
@Profile("local")
@EnableSns
@EnableSqs
public class LocalStackConfiguration {
@Value("${sqsClassifierQueueName}")
private String sqsClassifierQueueName;
@Value("${sqsConsQueueNames}")
private List<String> sqsConsQueueNames;
@Bean(name = "amazonSqs")
public AmazonSQS configureSQSClient()
throws MalformedURLException
{
log.info("Loading local SQS client");
BasicAWSCredentials awsCreds = new BasicAWSCredentials("user", "password");
AmazonSQS sqsClient = AmazonSQSClientBuilder.standard()
.withCredentials(new AWSStaticCredentialsProvider(awsCreds))
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration("http://localhost:4576", "us-east-1"))
.build();
sqsClient.createQueue(sqsClassifierQueueName);
sqsConsQueueNames.forEach(queueName -> sqsClient.createQueue(queueName));
//log.info("Device Registry queue Created: " + sqsClient.createQueue(REGISTRY_QUEUE_URL.substring(REGISTRY_QUEUE_URL.lastIndexOf('/') + 1)));
return sqsClient;
}
@Bean(name = "amazonSns")
public AmazonSNS configureSNSClient() {
AmazonSNS snsClient= AmazonSNSClientBuilder.standard()
.withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials("user", "password")))
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration("http://localhost:4575", "us-east-1"))
.build();
return snsClient;
}
}
@Component
@DependsOn(value = {"amazonSns", "amazonSqs"})
public class SNSSubscription {
@Qualifier("amazonSns")
@Autowired
private AmazonSNS sns;
@Qualifier("amazonSqs")
@Autowired
private AmazonSQS sqs;
@Value("${snsClassifierTopicName}")
private String snsClassifierTopicName;
@Value("${sqsClassifierQueueName}")
private String sqsClassifierQueueName;
@PostConstruct
public void subscribeToTopics() {
subscribeToClassifierTopics();
}
private void subscribeToClassifierTopics() {
SNSSubscriptionUtils.subscribeToSQS(sns, sqs, snsClassifierTopicName, sqsClassifierQueueName);
}
@SqsListener(value="${snsClassifierTopicName}")
public void receiveMessage(Object obj){
System.out.println(obj);
}
}
public class SNSSubscriptionUtils {
public static void subscribeToSQS(AmazonSNS sns, AmazonSQS sqs, String topicName, String queueName) {
String snsTopicArn = getSnsTopicArn(sns, topicName);
String queueUrl = SQSUtils.getQueueUrl(sqs, queueName);
Topics.subscribeQueue(sns, sqs, snsTopicArn, queueUrl);
}
public static String getSnsTopicArn(AmazonSNS sns, String topicName) {
String topicArn = sns.createTopic(topicName).getTopicArn();
return topicArn;
}
}
public class SQSUtils {
public static String getQueueUrl(AmazonSQS sqs, String queueName) {
GetQueueUrlRequest queueUrlRequest = new GetQueueUrlRequest(queueName);
return sqs.getQueueUrl(queueUrlRequest).getQueueUrl();
}
}