PubSub channel subscriber accounting was incorrect; the counter
was not decremented when unsubscribing.
The handler count, reflecting the current number of subscriptions,
was maintained in the AbstractSubscribableChannel. The count really
belongs in the dispatcher and calls should be delegated to it, particularly
for a custom ASC, which might have a custom AbstractDispatcher.
However, it is possible (although perhaps rare) that someone
could implement a custom channel with a custom dispatcher that
is *not* a subclass of AbstractDispatcher.
Therefore, we now delegate to the dispatcher if we can, and
revert to a counter in the channel if we can't.
Also, the asymmetric accounting in this case is resolved; the
counter is decremented when a subscriber unsubscribes.
Polishing - factor out common code.
Add channel name to MessageDeliveryException
'Dispatcher has no subscribers'.
In a large integration flow, it can be difficult to track
down which subscribable channel has no subscribers.
This commit adds to the message text in the form
for channel someChannelName
to the exception message. For example:
"Dispatcher has no subscribers for channel myChannel."
Also
for amqp-channel someAmqpChannelName
for jms-channel someJMSChannelName
for redis-channel someJMSChannelName
INT-2431 Polishing
Make component type and name immutable once set to avoid
channels further down the stack frame claiming ownership.
INT-2431 Polishing
* PR Comments - use a new Exception type
* Add support for Redis
* Add WARN logs for AMQP/JMS pub-sub channels
INT-2431 Polishing
PR Comments: tighten up isPubSub field in AMQP-backed channel.
INT-2431 Polishing
Ensure channel name is not 'null' or empty string.
Fix PollerParser#configureAdviceChain for adding 'customBeanDefinition' into 'adviceChain' List.
PollerParserTests: adding <tx:advice> as customElement into poller's <advice-chain>.
Commit is mostly parser tidy-up. The crux of the fix is to add the
missing call to adviceChain.add().
1. MethodInvokingHeaderValueMessageProcessor => MessageProcessingHeaderValueMessageProcessor because now he uses MessageProcessor
2. polishing HeaderEnricherParserSupport
3. GroovyHeaderEnricherTests: add check to HeaderValueMessageProcessor for Groovy scripts.
4. build.gradle: add dependency to 'spring-integration-test' for 'spring-integration-groovy'.
ServiceActivatorFactoryBean#createMessageProcessingHandler: force 'processMessage' method-name parameter into constructor ServiceActivatingHandler for MessageProcessor
Test for check 'handlerMethods' in ServiceActivatingHandler's MethodInvokingMessageProcessor
Integration test for <service-activator> with invalid Groovy inline script
Some generated bean names (e.g. LoggingHandler) cause
warnings in STS:
(Warning "Referenced bean
'org.springframework.integration.handler.LoggingHandler#0' not found")
Fix is to register these beans as components so an event is fired.
When an AbstractMappingMessageRouter is included in an
ApplicationContext that also has an <int-jmx:mbean-exporter/>,
the @ManagedOperations (set and remove mapping) are no longer
visible to the <control-bus/>.
Adds these methods to a new interface MappingMessageRouterManagement,
thus making them available on the proxy that the MBean exporter
creates.
https://jira.springsource.org/browse/INT-2411
Namespace problem only; the default-output-channel was
not bound to the RecipientListRouter.
Workaround is to declare the router using <bean/> syntax.
* MessageChannel was moved from core to the base package.
* ChannelResolver moved from core to support.
* TcpConnectionInterceptorFactoryChain was incorrect.
Now <header-enricher> <reply-channel> & <error-channel> are 'referenceOrValueHeaderType'.
Added tests for 'value' & 'expression' attributes on <reply-channel> element.
modified implementation of MessageGroupQueue to use interruptible locks
Basically modeled it after LinkedBlockingQueue
changed to use ReadWriteLock
refactored MessageGroupQueue and added tests
changed MessageGroupQueue to use Condition
added messageGroupSize(groupId) method to MessageGroupStore and all the implementations
polishing based on Gary's comments
removed setStoreLock method in favor of additional constructors
polishing tests, decreased timeouts
made peek() thread safe
added logging
polished MixedDispatcherConfigurationScenarioTests.failoverNoLoadBalancingWithExecutorConcurrent() test even more, introduced 'taskSubmissionMonitor' as CountDownLatch to ensure that shutdown command is not called untill all tasks are submitted. Also made sure that ExecutorChannel is using the same tasks executor so shutdown command actually shuts down the same executor.
fixed GemfireGroupStoreTests.testMultipleInstancesOfGroupStore() test to avoid intermittent failures
refactored MessageGroupMetadata to eliminate the usage of TreeMap in favor of LinkedList for storing UUIDs of Messages