実現したいこと
Spring Boot2.2でSpring AWS Cloudの@SqsListenerのアノテーションが動作していた。
Spring Boot3.4へバージョンアップした際にも同じようにSQSキューの自動刈り取り処理を実装したい。
①AWSのSQSにキューを投入
②本処理にてキューの内容を取得
③後続処理手続きを終えた後キューの削除
発生している問題・分からないこと
「@SqsListener」の自動刈り取り(ポーリング)が動作していない。
呼びだし先で実行されたか確認するため、logの出力を埋め込んで実行していますが、
そのログが出力されません。SqsListenerの自動実行が行われていないような形です。
エラーメッセージ
error
1SqsListenerが動いていないからか、ログにはエラーが出ていません。
該当のソースコード
java(Configurationクラス1)
1・Configurationクラス1 2@Configuration 3public class MyConfiguration1 { 4 @Lazy 5 @Primary 6 @Bean(destroyMethod = "close") 7 public SqsAsyncClient sqsAsyncClient() throws Exception { 8 SqsAsyncClientBuilder builder = SqsAsyncClient.builder(); 9 builder.credentialsProvider(this.awsCredentialsProvider); 10 builder.endpointOverride(URI.create(this.sqsEndPoint)).region(Region.of(region)); 11 SqsAsyncClient sqsAsyncClient = builder.build(); 12 return sqsAsyncClient; 13 } 14 15 @Bean 16 public SqsClient sqsClient() { 17 SqsClientBuilder builder = SqsClient.builder(); 18 builder.credentialsProvider(this.awsCredentialsProvider); 19 builder.endpointOverride(URI.create(this.sqsEndPoint)).region(Region.of(region)); 20 SqsClient sqsClient = builder.build(); 21 return sqsClient; 22 } 23}
java(Configurationクラス2)
1・Configurationクラス2 2@Configuration 3@AutoConfigureAfter(value = MyConfiguration1.class) 4public class MyConfiguration2 { 5 @Bean 6 public MessageChannel inputChannel() { 7 return new DirectChannel(); 8 } 9 10 @Bean 11 public MyMessageListenerContainer myMessageListenerContainer(SqsClient sqsClient, MessageChannel inputChannel) { 12 String queueUrl = "queueUrl"; 13 return new myMessageListenerContainer(sqsClient, queueUrl, inputChannel); 14 } 15}
java(メッセージリスナーコンテナ)
1・メッセージリスナーコンテナ 2public class MyMessageListenerContainer { 3 public void run() { 4 ReceiveMessageRequest receiveMessageRequest = ReceiveMessageRequest.builder() 5 .queueUrl(queuUrl) 6 .maxNumberOfMessages(maxNumberOfMessages) 7 .waitTimeSeconds(waitTimeSeconds) 8 .build(); 9 10 ReceiveMessageResponse receiveMessageResponse = 11 sqsClient.receiveMessage(receiveMessageRequest); 12 for (software.amazon.awssdk.services.sqs.model.Message sqsMessage : receiveMessageResponse 13 .messages()) { 14 Message<String> message = MessageBuilder.withPayload(sqsMessage.body()) 15 .setHeader("ReceiptHandle", sqsMessage.receiptHandle()) 16 .build(); 17 18 outputChannel.send(message); 19 20 // メッセージ処理後に削除 21 deleteMessage(sqsMessage.receiptHandle()); 22 } 23 24 } 25 26 private void deleteMessage(String receiptHandle) { 27 DeleteMessageRequest deleteMessageRequest = DeleteMessageRequest.builder() 28 .queueUrl(queuUrl) 29 .receiptHandle(receiptHandle) 30 .build(); 31 sqsClient.deleteMessage(deleteMessageRequest); 32 } 33}
java(リスナー)
1・リスナー 2@Scope(BeanDefinition.SCOPE_PROTOTYPE) 3@Controller 4public class MyController { 5 @SqsListener("queueName") 6 public void doRecieveQueue(MyServiceRequest message){ 7 // 処理 8 } 9}
java設定ファイル(pom)
1・pom.xml 依存関係 2 <dependencies> 3 <dependency> 4 <groupId>io.awspring.cloud</groupId> 5 <artifactId>spring-cloud-aws-starter-sqs</artifactId> 6 </dependency> 7 <dependency> 8 <groupId>io.awspring.cloud</groupId> 9 <artifactId>spring-cloud-aws-autoconfigure</artifactId> 10 </dependency> 11 </dependencies> 12 <dependencyManagement> 13 <dependencies> 14 <dependency> 15 <groupId>io.awspring.cloud</groupId> 16 <artifactId>spring-cloud-aws-dependencies</artifactId> 17 <version>3.3.0</version> 18 <type>pom</type> 19 <scope>import</scope> 20 </dependency> 21 <dependency> 22 <groupId>software.amazon.awssdk</groupId> 23 <artifactId>bom</artifactId> 24 <version>2.27.1</version> 25 <type>pom</type> 26 <scope>import</scope> 27 </dependency> 28 </dependencies> 29 </dependencyManagement>
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
teratailで「SqsListener」と検索しましたが、同様の質問がありませんでした。
補足
・バージョン情報
Spring Boot3.4.2
java21
回答1件
あなたの回答
tips
プレビュー