import org.springframework.cloud.stream.annotation.StreamListener;
...
@RequiredArgsConstructor
@DataRouteByKey("MY_SERVICE_DATA_ROUTE_KEY") // (1)
public class MyCheckoutCompletionListener {
    @Getter(AccessLevel.PROTECTED)
    private final IdempotentMessageConsumptionService idempotentConsumptionService;
    @StreamListener(MyCheckoutCompletionConsumer.CHANNEL) // (2)
    public void listen(Message<CheckoutCompletionEvent> message) { // (3)
        idempotentConsumptionService.consumeMessage(message, // (4)
                CheckoutCompletionListener.class.getSimpleName(), this::processMessage); // (5)
    }
    protected void processMessage(Message<CheckoutCompletionEvent> message) {
        CheckoutCompletionEvent event = message.getPayload();
        // Your logic goes here
    }
}