Was looking at using the jgroups component to coordinate some master/slave routes, and was digging into the source for the example to see how it works.
Everything seems straight forward to me with one issue: the dropNonCoordinatorViews method in JGroupsFilters looks like it may have a bug: public static Predicate dropNonCoordinatorViews() { return new Predicate() { public boolean matches(Exchange exchange) { Object body = exchange.getIn().getBody(); JGroupsFilters.LOG.debug("Filtering message {}.", body); if(body instanceof View) { View view = (View)body; Address coordinatorNodeAddress = (Address)view.getMembers().get(0); Address channelAddress = (Address)exchange.getIn().getHeader("JGROUPS_CHANNEL_ADDRESS", Address.class); JGroupsFilters.LOG.debug("Comparing endpoint channel address {} against the coordinator node address {}.", channelAddress, coordinatorNodeAddress); return channelAddress.equals(coordinatorNodeAddress); } else { JGroupsFilters.LOG.debug("Body {} is not an instance of org.jgroups.View . Skipping filter.", body); return true; } } }; } So if the message from the jgroups component is a View, and the coordinator address matches this channel address, return true, indicating we are the coordinator, and we can start the route. However, if the message which was received on the Channel was not a View object, this method returns true. If this is used according to the example: from("jgroups:clusterName?enableViewMessages=true"). filter(dropNonCoordinatorViews()). threads().delay(delayIfContextNotStarted(SECONDS.toMillis(5))). to("controlbus:route?routeId=masterRoute&action=start&async=true"); Wouldn't that mean any non View type message would cause the route to start?? Shouldn't that default case for non View type messages return false? Thanks, Ed