[ https://issues.apache.org/jira/browse/CAMEL-15748?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Claus Ibsen resolved CAMEL-15748. --------------------------------- Resolution: Fixed > Paho consumer never connects if the broker is not reachable at startup > ---------------------------------------------------------------------- > > Key: CAMEL-15748 > URL: https://issues.apache.org/jira/browse/CAMEL-15748 > Project: Camel > Issue Type: Bug > Components: camel-paho > Affects Versions: 3.5.0, 3.4.4, 3.6.0 > Reporter: Marco Collovati > Priority: Major > Fix For: 3.4.5, 3.7.0 > > Attachments: PahoConsumerRestartTest.java > > > Having a route with a paho consumer in a route, if the broker is not > reachable at startup, camel context fail fast and shuts down. > This can be avoided by setting the *SupervisingRouteController*, but this > way, even if camel context does not fail, the consumer is never able to > establish a connection. > The reason is that when *PahoConsumer* starts for the first time, it creates > a *MqttClient* and stores it into *client* field; the call to > *client.connect* throws an exception due to broker down; > > {code:java} > > @Override > protected void doStart() throws Exception { > super.doStart(); connectOptions = > PahoEndpoint.createMqttConnectOptions(getEndpoint().getConfiguration()); > if (client == null) { > clientId = getEndpoint().getConfiguration().getClientId(); > if (clientId == null) { > clientId = "camel-" + MqttClient.generateClientId(); > } > stopClient = true; > client = new MqttClient( > getEndpoint().getConfiguration().getBrokerUrl(), > clientId, > > PahoEndpoint.createMqttClientPersistence(getEndpoint().getConfiguration())); > LOG.debug("Connecting client: {} to broker: {}", clientId, > getEndpoint().getConfiguration().getBrokerUrl()); > client.connect(connectOptions); > } > > // other code omitted for brevity > > client.subscribe(getEndpoint().getTopic(), > getEndpoint().getConfiguration().getQos());{code} > > after that *doStop* is invoked but the *client* instance is not nullified, > because it is not connected > > {code:java} > @Override > protected void doStop() throws Exception { > super.doStop(); if (stopClient && client != null && > client.isConnected()) { > String topic = getEndpoint().getTopic(); > // only unsubscribe if we are not durable > if (getEndpoint().getConfiguration().isCleanSession()) { > LOG.debug("Unsubscribing client: {} from topic: {}", > clientId, topic); > client.unsubscribe(topic); > } else { > LOG.debug("Client: {} is durable so will not unsubscribe from > topic: {}", clientId, topic); > } > LOG.debug("Disconnecting client: {} from broker: {}", clientId, > getEndpoint().getConfiguration().getBrokerUrl()); > client.disconnect(); > client = null; > } > } > {code} > > when the supervisor tries to restart the route, *client* instance already > exists, but the call to *client.subscribe* fails because the client is not > connected. > Perhaps always nullify *client* in *doStop* should resolve the issue; however > I have no idea it this solution will impact in other ways. > A better solution may be to handle automatic reconnect in the consumer, like > *RabbitConsumer* does, for example. -- This message was sent by Atlassian Jira (v8.3.4#803005)