1
1
/*
2
- * Copyright 2013-2022 the original author or authors.
2
+ * Copyright 2013-2024 the original author or authors.
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
24
24
import io .awspring .cloud .sqs .config .SqsBootstrapConfiguration ;
25
25
import io .awspring .cloud .sqs .config .SqsListenerConfigurer ;
26
26
import io .awspring .cloud .sqs .config .SqsMessageListenerContainerFactory ;
27
- import io .awspring .cloud .sqs .listener .ContainerOptionsBuilder ;
28
27
import io .awspring .cloud .sqs .listener .errorhandler .AsyncErrorHandler ;
29
28
import io .awspring .cloud .sqs .listener .errorhandler .ErrorHandler ;
30
29
import io .awspring .cloud .sqs .listener .interceptor .AsyncMessageInterceptor ;
31
30
import io .awspring .cloud .sqs .listener .interceptor .MessageInterceptor ;
32
31
import io .awspring .cloud .sqs .listener .SqsContainerOptionsBuilder ;
33
32
import io .awspring .cloud .sqs .operations .SqsTemplate ;
34
33
import io .awspring .cloud .sqs .operations .SqsTemplateBuilder ;
34
+ import io .awspring .cloud .sqs .support .converter .MessagingMessageConverter ;
35
35
import io .awspring .cloud .sqs .support .converter .SqsMessagingMessageConverter ;
36
36
import org .springframework .beans .factory .ObjectProvider ;
37
37
import org .springframework .boot .autoconfigure .AutoConfiguration ;
46
46
import org .springframework .context .annotation .Import ;
47
47
import software .amazon .awssdk .services .sqs .SqsAsyncClient ;
48
48
import software .amazon .awssdk .services .sqs .SqsAsyncClientBuilder ;
49
+ import software .amazon .awssdk .services .sqs .model .Message ;
49
50
50
51
/**
51
52
* {@link EnableAutoConfiguration Auto-configuration} for SQS integration.
52
53
*
53
54
* @author Tomaz Fernandes
54
55
* @author Maciej Walkowiak
55
56
* @author Wei Jiang
57
+ * @author Dongha Kim
56
58
* @since 3.0
57
59
*/
58
60
@ AutoConfiguration
@@ -80,10 +82,9 @@ public SqsAsyncClient sqsAsyncClient(AwsClientBuilderConfigurer awsClientBuilder
80
82
81
83
@ ConditionalOnMissingBean
82
84
@ Bean
83
- public SqsTemplate sqsTemplate (SqsAsyncClient sqsAsyncClient , ObjectProvider <ObjectMapper > objectMapperProvider ) {
84
- SqsTemplateBuilder builder = SqsTemplate .builder ().sqsAsyncClient (sqsAsyncClient );
85
- objectMapperProvider
86
- .ifAvailable (om -> builder .configureDefaultConverter (converter -> converter .setObjectMapper (om )));
85
+ public SqsTemplate sqsTemplate (SqsAsyncClient sqsAsyncClient , ObjectProvider <ObjectMapper > objectMapperProvider , MessagingMessageConverter <Message > messageConverter ) {
86
+ SqsTemplateBuilder builder = SqsTemplate .builder ().sqsAsyncClient (sqsAsyncClient ).messageConverter (messageConverter );
87
+ objectMapperProvider .ifAvailable (om -> setMapperToConverter (messageConverter , om ));
87
88
if (sqsProperties .getQueueNotFoundStrategy () != null ) {
88
89
builder .configure ((options ) -> options .queueNotFoundStrategy (sqsProperties .getQueueNotFoundStrategy ()));
89
90
}
@@ -97,27 +98,34 @@ public SqsMessageListenerContainerFactory<Object> defaultSqsListenerContainerFac
97
98
ObjectProvider <ErrorHandler <Object >> errorHandler ,
98
99
ObjectProvider <AsyncMessageInterceptor <Object >> asyncInterceptors ,
99
100
ObjectProvider <MessageInterceptor <Object >> interceptors ,
100
- ObjectProvider <ObjectMapper > objectMapperProvider ) {
101
+ ObjectProvider <ObjectMapper > objectMapperProvider ,
102
+ MessagingMessageConverter <?> messagingMessageConverter ) {
101
103
102
104
SqsMessageListenerContainerFactory <Object > factory = new SqsMessageListenerContainerFactory <>();
103
- factory .configure (this ::configureContainerOptions );
105
+ factory .configure (this ::configureProperties );
104
106
sqsAsyncClient .ifAvailable (factory ::setSqsAsyncClient );
105
107
asyncErrorHandler .ifAvailable (factory ::setErrorHandler );
106
108
errorHandler .ifAvailable (factory ::setErrorHandler );
107
109
interceptors .forEach (factory ::addMessageInterceptor );
108
110
asyncInterceptors .forEach (factory ::addMessageInterceptor );
109
- objectMapperProvider .ifAvailable (objectMapper -> setObjectMapper (factory , objectMapper ));
111
+ objectMapperProvider .ifAvailable (om -> setMapperToConverter (messagingMessageConverter , om ));
112
+ factory .configure (options -> options .messageConverter (messagingMessageConverter ));
110
113
return factory ;
111
114
}
112
115
113
- private void setObjectMapper (SqsMessageListenerContainerFactory <Object > factory , ObjectMapper objectMapper ) {
114
- // Object Mapper for early deserialization in MessageSource
115
- var messageConverter = new SqsMessagingMessageConverter ();
116
- messageConverter .setObjectMapper (objectMapper );
117
- factory .configure (options -> options .messageConverter (messageConverter ));
116
+ private void setMapperToConverter (MessagingMessageConverter <?> messagingMessageConverter , ObjectMapper om ) {
117
+ if (messagingMessageConverter instanceof SqsMessagingMessageConverter sqsConverter ) {
118
+ sqsConverter .setObjectMapper (om );
119
+ }
120
+ }
121
+
122
+ @ ConditionalOnMissingBean
123
+ @ Bean
124
+ public MessagingMessageConverter <Message > messageConverter () {
125
+ return new SqsMessagingMessageConverter ();
118
126
}
119
127
120
- private void configureContainerOptions (SqsContainerOptionsBuilder options ) {
128
+ private void configureProperties (SqsContainerOptionsBuilder options ) {
121
129
PropertyMapper mapper = PropertyMapper .get ().alwaysApplyingWhenNonNull ();
122
130
mapper .from (this .sqsProperties .getQueueNotFoundStrategy ()).to (options ::queueNotFoundStrategy );
123
131
mapper .from (this .sqsProperties .getListener ().getMaxConcurrentMessages ()).to (options ::maxConcurrentMessages );
0 commit comments