Jose Luis Pedrosa created CAMEL-9813:
----------------------------------------
Summary: Zookeeper route policy requires first message to check if
online.
Key: CAMEL-9813
URL: https://issues.apache.org/jira/browse/CAMEL-9813
Project: Camel
Issue Type: Bug
Components: camel-zookeeper
Affects Versions: 2.17.0
Environment: Java 1.8
wildfly 10.0.0
camel 2.17.0
Reporter: Jose Luis Pedrosa
Hi All
i've been investigaten after I found the same issue as described in the email
chain
(http://camel.465427.n5.nabble.com/Zookeeper-Route-Policy-not-respected-on-route-with-sftp-consumer-td5771610.html)
The issue lies in the fact that ZookeeperRoutePolicy (ZRP from now on) waits to
check if that node is master after the first message have been recived (which
causes exception in the logs, and of course attempts to process messages).
What it does is simply throw an exception if we are not master... which stops
the route, sounds like we should not even the start the route in the first
place if we are not master.
I've been playing around, trying to implement the first check in the onStart or
onInit, the problem is that ZRP depends on a internal route injected on the
policy, I guess that is why the original developer did it in ExchangeBegin
instead of in start or onInit, to overcome the issue.
{code:java}
private class ElectoralMonitorRoute extends RouteBuilder {
...
...
from(zep).id("election-route-" + candidateName).sort(body(),
comparator).process(new Processor() {
@Override
public void process(Exchange e) throws Exception {
@SuppressWarnings("unchecked")
List<String> candidates =
e.getIn().getMandatoryBody(List.class);
// we cannot use the binary search here and the candidates
a not sorted in the normal way
/**
* check if the item at this location starts with this nodes
* candidate name
*/
int location =
findCandidateLocationInCandidatesList(candidates, candidateName);
if (location != -1) {
// set the nodes
masterNode.set(location <= enabledCount);
LOG.debug("This node is number '{}' on the candidate
list, election is configured for the top '{}'. this node will be {}",
new Object[]{location, enabledCount,
masterNode.get() ? "enabled" : "disabled"}
);
}
electionComplete.countDown();
notifyElectionWatchers();
}
{code}
which makes a route dependant on another to start, which is hard to solve in a
clean way.
Also i found that for some routes (my case) it also does not start them
automatically because they are stopped and not suspended:
{code}
public static boolean resumeService(Object service) throws Exception {
if (service instanceof SuspendableService) {
SuspendableService ss = (SuspendableService) service;
if (ss.isSuspended()) {
LOG.debug("Resuming service {}", service);
ss.resume();
return true;
} else {
return false;
}
} else {
startService(service);
return true;
}
}
{code}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)