Skip to content

Commit 201cbef

Browse files
committed
RabbitMQ-OG cleanup message type, make ack/nack idempotent
1 parent 1f0bb26 commit 201cbef

1 file changed

Lines changed: 27 additions & 53 deletions

File tree

smallrye-reactive-messaging-rabbitmq-og/src/main/java/io/smallrye/reactive/messaging/rabbitmq/og/IncomingRabbitMQMessage.java

Lines changed: 27 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package io.smallrye.reactive.messaging.rabbitmq.og;
22

33
import java.nio.charset.StandardCharsets;
4+
import java.util.concurrent.CompletableFuture;
45
import java.util.concurrent.CompletionStage;
6+
import java.util.concurrent.atomic.AtomicBoolean;
57
import java.util.function.BiFunction;
68
import java.util.function.Function;
7-
import java.util.function.Supplier;
89

9-
import org.eclipse.microprofile.reactive.messaging.Message;
1010
import org.eclipse.microprofile.reactive.messaging.Metadata;
1111

1212
import com.rabbitmq.client.AMQP;
@@ -27,6 +27,8 @@
2727
*/
2828
public class IncomingRabbitMQMessage<T> implements ContextAwareMessage<T>, MetadataInjectableMessage<T> {
2929

30+
private final AtomicBoolean acknowledged = new AtomicBoolean(false);
31+
3032
private final T payload;
3133
private Metadata metadata;
3234
private final RabbitMQAckHandler ackHandler;
@@ -146,73 +148,45 @@ public java.util.Map<String, Object> getHeaders() {
146148
}
147149

148150
@Override
149-
public Supplier<CompletionStage<Void>> getAck() {
150-
return () -> ackHandler.handle(this);
151+
public Function<Metadata, CompletionStage<Void>> getAckWithMetadata() {
152+
return this::ack;
151153
}
152154

153155
@Override
154-
public Function<Throwable, CompletionStage<Void>> getNack() {
155-
return (failure) -> nackHandler.handle(this, null, failure);
156+
public BiFunction<Throwable, Metadata, CompletionStage<Void>> getNackWithMetadata() {
157+
return this::nack;
156158
}
157159

158160
@Override
159-
public BiFunction<Throwable, Metadata, CompletionStage<Void>> getNackWithMetadata() {
160-
return this::nack;
161+
public CompletionStage<Void> ack(Metadata metadata) {
162+
if (acknowledged.compareAndSet(false, true)) {
163+
return ackHandler.handle(this)
164+
.whenComplete((v, t) -> {
165+
if (t != null) {
166+
acknowledged.set(false);
167+
}
168+
});
169+
}
170+
return CompletableFuture.completedFuture(null);
161171
}
162172

163-
/**
164-
* Nack with metadata support.
165-
*
166-
* @param reason the reason for the nack
167-
* @param metadata additional nack metadata
168-
* @return a completion stage
169-
*/
170173
public CompletionStage<Void> nack(Throwable reason, Metadata metadata) {
171-
return nackHandler.handle(this, metadata, reason);
174+
if (acknowledged.compareAndSet(false, true)) {
175+
return nackHandler.handle(this, metadata, reason)
176+
.whenComplete((v, t) -> {
177+
if (t != null) {
178+
acknowledged.set(false);
179+
}
180+
});
181+
}
182+
return CompletableFuture.completedFuture(null);
172183
}
173184

174185
@Override
175186
public synchronized void injectMetadata(Object metadataObject) {
176187
this.metadata = this.metadata.with(metadataObject);
177188
}
178189

179-
/**
180-
* Create a new message with a different payload but same metadata and ack/nack handlers.
181-
* This is useful for transforming messages in a processing chain.
182-
*
183-
* @param <P> the new payload type
184-
* @param newPayload the new payload
185-
* @return a new message with the new payload
186-
*/
187-
public <P> Message<P> withPayload(P newPayload) {
188-
return new Message<P>() {
189-
@Override
190-
public P getPayload() {
191-
return newPayload;
192-
}
193-
194-
@Override
195-
public Metadata getMetadata() {
196-
return IncomingRabbitMQMessage.this.metadata;
197-
}
198-
199-
@Override
200-
public Supplier<CompletionStage<Void>> getAck() {
201-
return IncomingRabbitMQMessage.this.getAck();
202-
}
203-
204-
@Override
205-
public Function<Throwable, CompletionStage<Void>> getNack() {
206-
return IncomingRabbitMQMessage.this.getNack();
207-
}
208-
209-
@Override
210-
public BiFunction<Throwable, Metadata, CompletionStage<Void>> getNackWithMetadata() {
211-
return IncomingRabbitMQMessage.this.getNackWithMetadata();
212-
}
213-
};
214-
}
215-
216190
/**
217191
* Default converter from byte array to String using UTF-8.
218192
*/

0 commit comments

Comments
 (0)