19
19
import java .time .Duration ;
20
20
import java .util .function .Function ;
21
21
22
+ import org .jspecify .annotations .Nullable ;
23
+
22
24
import org .springframework .boot .context .properties .PropertyMapper ;
23
25
import org .springframework .boot .kafka .autoconfigure .KafkaProperties .Listener ;
24
26
import org .springframework .core .task .SimpleAsyncTaskExecutor ;
36
38
import org .springframework .kafka .support .converter .BatchMessageConverter ;
37
39
import org .springframework .kafka .support .converter .RecordMessageConverter ;
38
40
import org .springframework .kafka .transaction .KafkaAwareTransactionManager ;
41
+ import org .springframework .util .Assert ;
39
42
40
43
/**
41
44
* Configure {@link ConcurrentKafkaListenerContainerFactory} with sensible defaults tuned
53
56
*/
54
57
public class ConcurrentKafkaListenerContainerFactoryConfigurer {
55
58
56
- private KafkaProperties properties ;
59
+ private @ Nullable KafkaProperties properties ;
57
60
58
- private BatchMessageConverter batchMessageConverter ;
61
+ private @ Nullable BatchMessageConverter batchMessageConverter ;
59
62
60
- private RecordMessageConverter recordMessageConverter ;
63
+ private @ Nullable RecordMessageConverter recordMessageConverter ;
61
64
62
- private RecordFilterStrategy <Object , Object > recordFilterStrategy ;
65
+ private @ Nullable RecordFilterStrategy <Object , Object > recordFilterStrategy ;
63
66
64
- private KafkaTemplate <Object , Object > replyTemplate ;
67
+ private @ Nullable KafkaTemplate <Object , Object > replyTemplate ;
65
68
66
- private KafkaAwareTransactionManager <Object , Object > transactionManager ;
69
+ private @ Nullable KafkaAwareTransactionManager <Object , Object > transactionManager ;
67
70
68
- private ConsumerAwareRebalanceListener rebalanceListener ;
71
+ private @ Nullable ConsumerAwareRebalanceListener rebalanceListener ;
69
72
70
- private CommonErrorHandler commonErrorHandler ;
73
+ private @ Nullable CommonErrorHandler commonErrorHandler ;
71
74
72
- private AfterRollbackProcessor <Object , Object > afterRollbackProcessor ;
75
+ private @ Nullable AfterRollbackProcessor <Object , Object > afterRollbackProcessor ;
73
76
74
- private RecordInterceptor <Object , Object > recordInterceptor ;
77
+ private @ Nullable RecordInterceptor <Object , Object > recordInterceptor ;
75
78
76
- private BatchInterceptor <Object , Object > batchInterceptor ;
79
+ private @ Nullable BatchInterceptor <Object , Object > batchInterceptor ;
77
80
78
- private Function <MessageListenerContainer , String > threadNameSupplier ;
81
+ private @ Nullable Function <MessageListenerContainer , String > threadNameSupplier ;
79
82
80
- private SimpleAsyncTaskExecutor listenerTaskExecutor ;
83
+ private @ Nullable SimpleAsyncTaskExecutor listenerTaskExecutor ;
81
84
82
85
/**
83
86
* Set the {@link KafkaProperties} to use.
84
87
* @param properties the properties
85
88
*/
86
- void setKafkaProperties (KafkaProperties properties ) {
89
+ void setKafkaProperties (@ Nullable KafkaProperties properties ) {
87
90
this .properties = properties ;
88
91
}
89
92
90
93
/**
91
94
* Set the {@link BatchMessageConverter} to use.
92
95
* @param batchMessageConverter the message converter
93
96
*/
94
- void setBatchMessageConverter (BatchMessageConverter batchMessageConverter ) {
97
+ void setBatchMessageConverter (@ Nullable BatchMessageConverter batchMessageConverter ) {
95
98
this .batchMessageConverter = batchMessageConverter ;
96
99
}
97
100
98
101
/**
99
102
* Set the {@link RecordMessageConverter} to use.
100
103
* @param recordMessageConverter the message converter
101
104
*/
102
- void setRecordMessageConverter (RecordMessageConverter recordMessageConverter ) {
105
+ void setRecordMessageConverter (@ Nullable RecordMessageConverter recordMessageConverter ) {
103
106
this .recordMessageConverter = recordMessageConverter ;
104
107
}
105
108
106
109
/**
107
110
* Set the {@link RecordFilterStrategy} to use to filter incoming records.
108
111
* @param recordFilterStrategy the record filter strategy
109
112
*/
110
- void setRecordFilterStrategy (RecordFilterStrategy <Object , Object > recordFilterStrategy ) {
113
+ void setRecordFilterStrategy (@ Nullable RecordFilterStrategy <Object , Object > recordFilterStrategy ) {
111
114
this .recordFilterStrategy = recordFilterStrategy ;
112
115
}
113
116
114
117
/**
115
118
* Set the {@link KafkaTemplate} to use to send replies.
116
119
* @param replyTemplate the reply template
117
120
*/
118
- void setReplyTemplate (KafkaTemplate <Object , Object > replyTemplate ) {
121
+ void setReplyTemplate (@ Nullable KafkaTemplate <Object , Object > replyTemplate ) {
119
122
this .replyTemplate = replyTemplate ;
120
123
}
121
124
122
125
/**
123
126
* Set the {@link KafkaAwareTransactionManager} to use.
124
127
* @param transactionManager the transaction manager
125
128
*/
126
- void setTransactionManager (KafkaAwareTransactionManager <Object , Object > transactionManager ) {
129
+ void setTransactionManager (@ Nullable KafkaAwareTransactionManager <Object , Object > transactionManager ) {
127
130
this .transactionManager = transactionManager ;
128
131
}
129
132
130
133
/**
131
134
* Set the {@link ConsumerAwareRebalanceListener} to use.
132
135
* @param rebalanceListener the rebalance listener.
133
136
*/
134
- void setRebalanceListener (ConsumerAwareRebalanceListener rebalanceListener ) {
137
+ void setRebalanceListener (@ Nullable ConsumerAwareRebalanceListener rebalanceListener ) {
135
138
this .rebalanceListener = rebalanceListener ;
136
139
}
137
140
138
141
/**
139
142
* Set the {@link CommonErrorHandler} to use.
140
143
* @param commonErrorHandler the error handler.
141
144
*/
142
- public void setCommonErrorHandler (CommonErrorHandler commonErrorHandler ) {
145
+ public void setCommonErrorHandler (@ Nullable CommonErrorHandler commonErrorHandler ) {
143
146
this .commonErrorHandler = commonErrorHandler ;
144
147
}
145
148
146
149
/**
147
150
* Set the {@link AfterRollbackProcessor} to use.
148
151
* @param afterRollbackProcessor the after rollback processor
149
152
*/
150
- void setAfterRollbackProcessor (AfterRollbackProcessor <Object , Object > afterRollbackProcessor ) {
153
+ void setAfterRollbackProcessor (@ Nullable AfterRollbackProcessor <Object , Object > afterRollbackProcessor ) {
151
154
this .afterRollbackProcessor = afterRollbackProcessor ;
152
155
}
153
156
154
157
/**
155
158
* Set the {@link RecordInterceptor} to use.
156
159
* @param recordInterceptor the record interceptor.
157
160
*/
158
- void setRecordInterceptor (RecordInterceptor <Object , Object > recordInterceptor ) {
161
+ void setRecordInterceptor (@ Nullable RecordInterceptor <Object , Object > recordInterceptor ) {
159
162
this .recordInterceptor = recordInterceptor ;
160
163
}
161
164
162
165
/**
163
166
* Set the {@link BatchInterceptor} to use.
164
167
* @param batchInterceptor the batch interceptor.
165
168
*/
166
- void setBatchInterceptor (BatchInterceptor <Object , Object > batchInterceptor ) {
169
+ void setBatchInterceptor (@ Nullable BatchInterceptor <Object , Object > batchInterceptor ) {
167
170
this .batchInterceptor = batchInterceptor ;
168
171
}
169
172
170
173
/**
171
174
* Set the thread name supplier to use.
172
175
* @param threadNameSupplier the thread name supplier to use
173
176
*/
174
- void setThreadNameSupplier (Function <MessageListenerContainer , String > threadNameSupplier ) {
177
+ void setThreadNameSupplier (@ Nullable Function <MessageListenerContainer , String > threadNameSupplier ) {
175
178
this .threadNameSupplier = threadNameSupplier ;
176
179
}
177
180
178
181
/**
179
182
* Set the executor for threads that poll the consumer.
180
183
* @param listenerTaskExecutor task executor
181
184
*/
182
- void setListenerTaskExecutor (SimpleAsyncTaskExecutor listenerTaskExecutor ) {
185
+ void setListenerTaskExecutor (@ Nullable SimpleAsyncTaskExecutor listenerTaskExecutor ) {
183
186
this .listenerTaskExecutor = listenerTaskExecutor ;
184
187
}
185
188
@@ -199,6 +202,7 @@ public void configure(ConcurrentKafkaListenerContainerFactory<Object, Object> li
199
202
200
203
private void configureListenerFactory (ConcurrentKafkaListenerContainerFactory <Object , Object > factory ) {
201
204
PropertyMapper map = PropertyMapper .get ().alwaysApplyingWhenNonNull ();
205
+ Assert .state (this .properties != null , "'properties' must not be null" );
202
206
Listener properties = this .properties .getListener ();
203
207
map .from (properties ::getConcurrency ).to (factory ::setConcurrency );
204
208
map .from (properties ::isAutoStartup ).to (factory ::setAutoStartup );
@@ -219,6 +223,7 @@ private void configureListenerFactory(ConcurrentKafkaListenerContainerFactory<Ob
219
223
220
224
private void configureContainer (ContainerProperties container ) {
221
225
PropertyMapper map = PropertyMapper .get ().alwaysApplyingWhenNonNull ();
226
+ Assert .state (this .properties != null , "'properties' must not be null" );
222
227
Listener properties = this .properties .getListener ();
223
228
map .from (properties ::getAckMode ).to (container ::setAckMode );
224
229
map .from (properties ::getAsyncAcks ).to (container ::setAsyncAcks );
0 commit comments