You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Claus Ibsen (Jira)" <ji...@apache.org> on 2020/10/24 08:54:00 UTC
[jira] [Updated] (CAMEL-15748) Paho consumer never connects if the
broker is not reachable at startup
[ https://issues.apache.org/jira/browse/CAMEL-15748?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Claus Ibsen updated CAMEL-15748:
--------------------------------
Fix Version/s: 3.7.0
3.4.5
> 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
>
>
> 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)