@@ -113,49 +113,55 @@ private Runnable createReceiveTask(Receiver receiver, MessageHandler messageHand
113
113
if (delivery != null ) {
114
114
this .metricsCollector .consume ();
115
115
AmqpMessage message = new AmqpMessage (delivery .message ());
116
- // TODO make disposition idempotent
116
+ AtomicBoolean disposed = new AtomicBoolean ( false );
117
117
Consumer .Context context =
118
118
new Consumer .Context () {
119
119
120
120
@ Override
121
121
public void accept () {
122
- try {
123
- protonExecutor .execute (() -> replenishCreditIfNeeded ());
124
- delivery .disposition (DeliveryState .accepted (), true );
125
- metricsCollector .consumeDisposition (
126
- MetricsCollector .ConsumeDisposition .ACCEPTED );
127
- } catch (ClientIllegalStateException | ClientIOException e ) {
128
- LOGGER .debug ("message accept failed: {}" , e .getMessage ());
129
- } catch (ClientException e ) {
130
- throw ExceptionUtils .convert (e );
122
+ if (disposed .compareAndSet (false , true )) {
123
+ try {
124
+ protonExecutor .execute (() -> replenishCreditIfNeeded ());
125
+ delivery .disposition (DeliveryState .accepted (), true );
126
+ metricsCollector .consumeDisposition (
127
+ MetricsCollector .ConsumeDisposition .ACCEPTED );
128
+ } catch (ClientIllegalStateException | ClientIOException e ) {
129
+ LOGGER .debug ("message accept failed: {}" , e .getMessage ());
130
+ } catch (ClientException e ) {
131
+ throw ExceptionUtils .convert (e );
132
+ }
131
133
}
132
134
}
133
135
134
136
@ Override
135
137
public void discard () {
136
- try {
137
- protonExecutor .execute (() -> replenishCreditIfNeeded ());
138
- delivery .disposition (DeliveryState .rejected ("" , "" ), true );
139
- metricsCollector .consumeDisposition (
140
- MetricsCollector .ConsumeDisposition .DISCARDED );
141
- } catch (ClientIllegalStateException | ClientIOException e ) {
142
- LOGGER .debug ("message discard failed: {}" , e .getMessage ());
143
- } catch (ClientException e ) {
144
- throw ExceptionUtils .convert (e );
138
+ if (disposed .compareAndSet (false , true )) {
139
+ try {
140
+ protonExecutor .execute (() -> replenishCreditIfNeeded ());
141
+ delivery .disposition (DeliveryState .rejected ("" , "" ), true );
142
+ metricsCollector .consumeDisposition (
143
+ MetricsCollector .ConsumeDisposition .DISCARDED );
144
+ } catch (ClientIllegalStateException | ClientIOException e ) {
145
+ LOGGER .debug ("message discard failed: {}" , e .getMessage ());
146
+ } catch (ClientException e ) {
147
+ throw ExceptionUtils .convert (e );
148
+ }
145
149
}
146
150
}
147
151
148
152
@ Override
149
153
public void requeue () {
150
- try {
151
- protonExecutor .execute (() -> replenishCreditIfNeeded ());
152
- delivery .disposition (DeliveryState .released (), true );
153
- metricsCollector .consumeDisposition (
154
- MetricsCollector .ConsumeDisposition .REQUEUED );
155
- } catch (ClientIllegalStateException | ClientIOException e ) {
156
- LOGGER .debug ("message requeue failed: {}" , e .getMessage ());
157
- } catch (ClientException e ) {
158
- throw ExceptionUtils .convert (e );
154
+ if (disposed .compareAndSet (false , true )) {
155
+ try {
156
+ protonExecutor .execute (() -> replenishCreditIfNeeded ());
157
+ delivery .disposition (DeliveryState .released (), true );
158
+ metricsCollector .consumeDisposition (
159
+ MetricsCollector .ConsumeDisposition .REQUEUED );
160
+ } catch (ClientIllegalStateException | ClientIOException e ) {
161
+ LOGGER .debug ("message requeue failed: {}" , e .getMessage ());
162
+ } catch (ClientException e ) {
163
+ throw ExceptionUtils .convert (e );
164
+ }
159
165
}
160
166
}
161
167
};
0 commit comments