Binder simplification

* removed pub/sub methods from binder
* consumer group is now a parameter of the remaining bindConsumer method

* remove DynamicProducer from Binder
* Move logic to create the dynamic channel to the channel resolver.
* Return bindings from bind methods and use them for unbinding
* Suffix for dlq

Move All Rabbit Binder CleanUp to Test Bindera

More RabbitMQ Binder Test Cleanup

Clean up declarations for remaining tests.

removed BinderUtils

use Redis ZSET for consumer groups

copyright dates

AutoBindDLQ: Single DLQ Per Group When Partitioned

Configure a single DLQ for each group for all partitions.

Add DLX Exchange binding for each original queue routing key, including the partition.

Fix DLQ Binding (Producer Side)

Option was not allowed and the routing key was wrong.

Add test to verify producers can be bound before consumers.

`autoBindDLQ` must be set (or reset) on both sides for success.
This commit is contained in:
Mark Fisher
2015-12-21 15:48:48 -05:00
committed by Marius Bogoevici
parent 60e44b530d
commit c3758b9dc0
46 changed files with 1052 additions and 2758 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2015 the original author or authors.
* Copyright 2015-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -23,6 +23,7 @@ import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingDeque;
import org.springframework.cloud.stream.binder.Binder;
import org.springframework.cloud.stream.binder.Binding;
import org.springframework.cloud.stream.test.matcher.MessageQueueMatcher;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
@@ -39,6 +40,7 @@ import org.springframework.util.Assert;
*
* @author Eric Bottard
* @author Gary Russell
* @author Mark Fisher
* @see MessageQueueMatcher
*/
public class TestSupportBinder implements Binder<MessageChannel> {
@@ -47,78 +49,29 @@ public class TestSupportBinder implements Binder<MessageChannel> {
@Override
public void bindConsumer(String name, MessageChannel inboundBindTarget, Properties properties) {
}
@Override
public void bindPubSubConsumer(String name, MessageChannel inboundBindTarget, String group, Properties properties) {
public Binding<MessageChannel> bindConsumer(String name, String group, MessageChannel inboundBindTarget, Properties properties) {
return null;
}
/**
* Registers a single subscriber to the channel, that enqueues messages for later retrieval and assertion in tests.
*/
@Override
@SuppressWarnings("unchecked")
public void bindProducer(String name, MessageChannel outboundBindTarget, Properties properties) {
final BlockingQueue queue = messageCollector.register(outboundBindTarget);
public Binding<MessageChannel> bindProducer(String name, MessageChannel outboundBindTarget, Properties properties) {
final BlockingQueue<Message<?>> queue = messageCollector.register(outboundBindTarget);
((SubscribableChannel)outboundBindTarget).subscribe(new MessageHandler() {
@Override
public void handleMessage(Message<?> message) throws MessagingException {
queue.add(message);
}
});
}
@Override
public void unbindProducer(String name, MessageChannel channel) {
messageCollector.unregister(channel);
}
@Override
public void bindPubSubProducer(String name, MessageChannel outboundBindTarget, Properties properties) {
}
@Override
public void unbindConsumers(String name) {
}
@Override
public void unbindPubSubConsumers(String name, String group) {
}
@Override
public void unbindProducers(String name) {
}
@Override
public void unbindConsumer(String name, MessageChannel inboundBindTarget) {
}
@Override
public void bindRequestor(String name, MessageChannel requests, MessageChannel replies, Properties properties) {
}
@Override
public void bindReplier(String name, MessageChannel requests, MessageChannel replies, Properties properties) {
}
@Override
public MessageChannel bindDynamicProducer(String name, Properties properties) {
return null;
}
@Override
public MessageChannel bindDynamicPubSubProducer(String name, Properties properties) {
return null;
public void unbind(Binding<MessageChannel> binding) {
if (Binding.Type.producer.equals(binding.getType()))
messageCollector.unregister(binding.getTarget());
}
public MessageCollector messageCollector() {
@@ -134,7 +87,7 @@ public class TestSupportBinder implements Binder<MessageChannel> {
private final Map<MessageChannel, BlockingQueue<Message<?>>> results = new HashMap<>();
private BlockingQueue register(MessageChannel channel) {
private BlockingQueue<Message<?>> register(MessageChannel channel) {
LinkedBlockingDeque<Message<?>> result = new LinkedBlockingDeque<>();
Assert.isTrue(!results.containsKey(channel), "Channel [" + channel + "] was already bound");
results.put(channel, result);