Hi Ed,

This is bug indeed. I have just fixed it in CAMEL-9029 [1]. The bug was not
detected so far, because channels used for cluster configuration usually
don't exchange non-view messages.

Thanks for catching this! Cheers!

[1] https://issues.apache.org/jira/browse/CAMEL-9029

wt., 28.07.2015 o 12:45 użytkownik Ed Welch <e...@edjusted.com> napisał:

> 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

Reply via email to