extends ConnectionFactory {
10 |
11 | protected final MockNode mockNode = new MockNode();
12 |
13 | @SuppressWarnings("unchecked")
14 | public T withAdditionalExchange(TypedMockExchangeCreator mockExchangeCreator) {
15 | mockNode.getConfiguration().registerAdditionalExchangeCreator(mockExchangeCreator);
16 | return (T) this;
17 | }
18 |
19 | /**
20 | * Make available the {@value ConsistentHashExchange#TYPE}'' exchange.
21 | *
22 | * See https://github.com/rabbitmq/rabbitmq-consistent-hash-exchange.
23 | * @return this {@link ConfigurableConnectionFactory} instance (for chaining)
24 | */
25 | public T enableConsistentHashPlugin() {
26 | return withAdditionalExchange(
27 | creatorWithExchangeType(ConsistentHashExchange.TYPE, ConsistentHashExchange::new)
28 | );
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/src/main/java/com/github/fridujo/rabbitmq/mock/ConfirmListenerWrapper.java:
--------------------------------------------------------------------------------
1 | package com.github.fridujo.rabbitmq.mock;
2 |
3 | import com.rabbitmq.client.ConfirmCallback;
4 | import com.rabbitmq.client.ConfirmListener;
5 |
6 | import java.io.IOException;
7 |
8 | public class ConfirmListenerWrapper implements ConfirmListener {
9 | private final ConfirmCallback ackCallback;
10 | private final ConfirmCallback nackCallback;
11 |
12 | public ConfirmListenerWrapper(ConfirmCallback ackCallback, ConfirmCallback nackCallback) {
13 | this.ackCallback = ackCallback;
14 | this.nackCallback = nackCallback;
15 | }
16 |
17 | @Override
18 | public void handleAck(long deliveryTag, boolean multiple) throws IOException {
19 | ackCallback.handle(deliveryTag, multiple);
20 | }
21 |
22 | @Override
23 | public void handleNack(long deliveryTag, boolean multiple) throws IOException {
24 | nackCallback.handle(deliveryTag, multiple);
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/src/main/java/com/github/fridujo/rabbitmq/mock/ConsumerWrapper.java:
--------------------------------------------------------------------------------
1 | package com.github.fridujo.rabbitmq.mock;
2 |
3 | import com.rabbitmq.client.AMQP;
4 | import com.rabbitmq.client.CancelCallback;
5 | import com.rabbitmq.client.Consumer;
6 | import com.rabbitmq.client.ConsumerShutdownSignalCallback;
7 | import com.rabbitmq.client.DeliverCallback;
8 | import com.rabbitmq.client.Delivery;
9 | import com.rabbitmq.client.Envelope;
10 | import com.rabbitmq.client.ShutdownSignalException;
11 |
12 | import java.io.IOException;
13 |
14 | public class ConsumerWrapper implements Consumer {
15 | private final DeliverCallback deliverCallback;
16 | private final CancelCallback cancelCallback;
17 | private final ConsumerShutdownSignalCallback shutdownSignalCallback;
18 |
19 | public ConsumerWrapper(DeliverCallback deliverCallback, CancelCallback cancelCallback, ConsumerShutdownSignalCallback shutdownSignalCallback) {
20 | this.deliverCallback = deliverCallback;
21 | this.cancelCallback = cancelCallback;
22 | this.shutdownSignalCallback = shutdownSignalCallback;
23 | }
24 |
25 | @Override
26 | public void handleConsumeOk(String consumerTag) {
27 | // Nothing to be done
28 | }
29 |
30 | @Override
31 | public void handleCancelOk(String consumerTag) {
32 | // Nothing to be done
33 | }
34 |
35 | @Override
36 | public void handleCancel(String consumerTag) throws IOException {
37 | if (cancelCallback != null) {
38 | cancelCallback.handle(consumerTag);
39 | }
40 | }
41 |
42 | @Override
43 | public void handleShutdownSignal(String consumerTag, ShutdownSignalException sig) {
44 | if (shutdownSignalCallback != null) {
45 | shutdownSignalCallback.handleShutdownSignal(consumerTag, sig);
46 | }
47 | }
48 |
49 | @Override
50 | public void handleRecoverOk(String consumerTag) {
51 | // Nothing to be done
52 | }
53 |
54 | @Override
55 | public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
56 | deliverCallback.handle(consumerTag, new Delivery(envelope, properties, body));
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/src/main/java/com/github/fridujo/rabbitmq/mock/DeadLettering.java:
--------------------------------------------------------------------------------
1 | package com.github.fridujo.rabbitmq.mock;
2 |
3 | import java.util.ArrayList;
4 | import java.util.Collections;
5 | import java.util.HashMap;
6 | import java.util.List;
7 | import java.util.Map;
8 | import java.util.Optional;
9 |
10 | import com.rabbitmq.client.AMQP;
11 |
12 | public interface DeadLettering {
13 |
14 | String X_DEATH_HEADER = "x-death";
15 |
16 | enum ReasonType {
17 | /**
18 | * The message was rejected with requeue parameter set to false.
19 | */
20 | REJECTED("rejected"),
21 | /**
22 | * The message TTL has expired.
23 | */
24 | EXPIRED("expired"),
25 | /**
26 | * The maximum allowed queue length was exceeded.
27 | */
28 | MAX_LEN("maxlen");
29 |
30 | public final String headerValue;
31 |
32 | ReasonType(String headerValue) {
33 | this.headerValue = headerValue;
34 | }
35 | }
36 |
37 | class Event {
38 | private static final String QUEUE_KEY = "queue";
39 | private static final String REASON_KEY = "reason";
40 | private static final String EXCHANGE_KEY = "exchange";
41 | private static final String ROUTING_KEYS_KEY = "routing-keys";
42 | private static final String COUNT_KEY = "count";
43 |
44 | private final String queue;
45 | private final ReasonType reason;
46 | private final String exchange;
47 | private final List routingKeys;
48 | private final long count;
49 |
50 | public Event(String queue, ReasonType reason, Message message, int count) {
51 | this.queue = queue;
52 | this.reason = reason;
53 | this.exchange = message.exchangeName;
54 | this.routingKeys = Collections.singletonList(message.routingKey);
55 | this.count = count;
56 | }
57 |
58 | public Map asHeaderEntry() {
59 | Map entry = new HashMap<>();
60 | entry.put(QUEUE_KEY, queue);
61 | entry.put(REASON_KEY, reason.headerValue);
62 | entry.put(EXCHANGE_KEY, exchange);
63 | entry.put(ROUTING_KEYS_KEY, routingKeys);
64 | entry.put(COUNT_KEY, count);
65 | return entry;
66 | }
67 |
68 | @SuppressWarnings("unchecked")
69 | public AMQP.BasicProperties prependOn(AMQP.BasicProperties props) {
70 | Map headers = Optional.ofNullable(props.getHeaders()).map(HashMap::new).orElseGet(HashMap::new);
71 |
72 | List