[ https://issues.apache.org/jira/browse/CAMEL-20834?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Claus Ibsen reassigned CAMEL-20834: ----------------------------------- Assignee: Claus Ibsen > camel-salesforce - A NullPointException in SubscriptionHelper.subscribe() > interrupts platform-event subscription > ---------------------------------------------------------------------------------------------------------------- > > Key: CAMEL-20834 > URL: https://issues.apache.org/jira/browse/CAMEL-20834 > Project: Camel > Issue Type: Bug > Components: camel-salesforce > Affects Versions: 4.5.0, 4.6.0 > Environment: Spring-Boot: 3.2.6 > Camel: 4.5.0 or 4.6.0 > Java: 17 > Reporter: Jason > Assignee: Claus Ibsen > Priority: Major > Fix For: 4.7.0 > > > It appears that when the {{SubscriptionHelper}} attempts to reconnect and > resubscribe to a channel in Salesforce, that occasionally and at an > unpredictable rate, the {{subscriptionListener}} instance in > {{SubscriptionHelper.subscribe}} throws an NPE when attempting to get the > {{SUBSCRIPTION_FIELD}} from the response message from Salesforce because in > some cases that message does not contain a {{subscription}} property in the > JSON response. > This results in the component seeming to > This seems to be the offending line: > https://github.com/apache/camel/blob/main/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/streaming/SubscriptionHelper.java#L475 > The reconnection seem to happen, but never actually re-subscribes to the > channel and therefore the flow of platform-events stops until the spring-boot > application is restarted. > Here is some of the associated logging: > {noformat} > [DEBUG] 2024-06-04 00:17:20,212 > org.apache.camel.component.salesforce.internal.streaming.SubscriptionHelper > [Camel (camel-1) thread #319 - SalesforceHttpClient ] - > [CHANNEL:META_HANDSHAKE]: {ext={replay=true, payload.format=true}, > minimumVersion=1.0, clientId=REDACTED, > supportedConnectionTypes=[long-polling], channel=/meta/handshake, id=328, > version=1.0, successful=true} > [DEBUG] 2024-06-04 00:17:20,227 > org.apache.camel.component.salesforce.internal.streaming.SubscriptionHelper > [Camel (camel-1) thread #320 - SalesforceHttpClient ] - > [CHANNEL:META_CONNECT]: {clientId=REDACTED, advice={reconnect=retry, > interval=0, timeout=110000}, channel=/meta/connect, id=329, successful=true} > [DEBUG] 2024-06-04 00:17:20,227 > org.apache.camel.component.salesforce.internal.streaming.SubscriptionHelper > [Camel (camel-1) thread #320 - SalesforceHttpClient ] - Refreshing > subscriptions to 1 channels on reconnect > [INFO ] 2024-06-04 00:17:20,227 > org.apache.camel.component.salesforce.internal.streaming.SubscriptionHelper > [Camel (camel-1) thread #320 - SalesforceHttpClient ] - Subscribing to > channel /event/M1SF_SObject_Capture__e... > [DEBUG] 2024-06-04 00:17:20,243 > org.apache.camel.component.salesforce.internal.streaming.SubscriptionHelper > [Camel (camel-1) thread #321 - SalesforceHttpClient ] - > [CHANNEL:META_CONNECT]: {advice={reconnect=handshake, interval=0}, > channel=/meta/connect, id=330, error=403::Unknown client, successful=false} > [WARN ] 2024-06-04 00:17:20,243 > org.apache.camel.component.salesforce.internal.streaming.SubscriptionHelper > [Camel (camel-1) thread #321 - SalesforceHttpClient ] - Connect failure: > {advice={reconnect=handshake, interval=0}, channel=/meta/connect, id=330, > error=403::Unknown client, successful=false} > [DEBUG] 2024-06-04 00:17:20,243 > org.apache.camel.component.salesforce.internal.streaming.SubscriptionHelper > [Camel (camel-1) thread #321 - SalesforceHttpClient ] - Advice != retry, so > handshaking > [DEBUG] 2024-06-04 00:17:20,243 > org.apache.camel.component.salesforce.internal.streaming.SubscriptionHelper > [Camel (camel-1) thread #321 - SalesforceHttpClient ] - Begin handshake if > not already in progress. > [DEBUG] 2024-06-04 00:17:20,269 > org.apache.camel.component.salesforce.internal.streaming.SubscriptionHelper > [SalesforceHttpClient@f13e0a2-34 ] - [CHANNEL:META_SUBSCRIBE]: > {advice={reconnect=handshake, interval=0}, channel=/meta/subscribe, id=331, > error=403::Unknown client, successful=false} > [INFO ] 2024-06-04 00:17:20,270 org.cometd.bayeux.client.ClientSession > [SalesforceHttpClient@f13e0a2-34 ] - Exception while invoking listener > org.apache.camel.component.salesforce.internal.streaming.SubscriptionHelper$5@704dd2c3 > java.lang.NullPointerException: Cannot invoke "Object.toString()" because the > return value of "org.cometd.bayeux.Message.get(Object)" is null > at > org.apache.camel.component.salesforce.internal.streaming.SubscriptionHelper$5.onMessage(SubscriptionHelper.java:452) > at > org.cometd.common.AbstractClientSession$AbstractSessionChannel.notifyOnMessage(AbstractClientSession.java:599) > at > org.cometd.common.AbstractClientSession$AbstractSessionChannel.notifyMessageListeners(AbstractClientSession.java:586) > at > org.cometd.common.AbstractClientSession.notifyListeners(AbstractClientSession.java:311) > at > org.cometd.common.AbstractClientSession.lambda$receive$4(AbstractClientSession.java:268) > at org.cometd.bayeux.Promise$2.succeed(Promise.java:96) > at > org.cometd.common.AsyncFoldLeft$AbstractLoop.run(AsyncFoldLeft.java:236) > at org.cometd.common.AsyncFoldLeft.run(AsyncFoldLeft.java:107) > at > org.cometd.common.AbstractClientSession.extendIncoming(AbstractClientSession.java:99) > at > org.cometd.common.AbstractClientSession.receive(AbstractClientSession.java:262) > at org.cometd.client.BayeuxClient.processMessage(BayeuxClient.java:812) > at org.cometd.client.BayeuxClient.processMessages(BayeuxClient.java:634) > at > org.cometd.client.BayeuxClient$MessageTransportListener.onMessages(BayeuxClient.java:1227) > at > org.cometd.client.http.common.AbstractHttpClientTransport.processResponseMessages(AbstractHttpClientTransport.java:178) > at > org.cometd.client.http.jetty.JettyHttpClientTransport.access$200(JettyHttpClientTransport.java:51) > at > org.cometd.client.http.jetty.JettyHttpClientTransport$ResponseListener.onComplete(JettyHttpClientTransport.java:285) > at > org.eclipse.jetty.client.transport.ResponseListeners.notifyComplete(ResponseListeners.java:350) > at > org.eclipse.jetty.client.transport.ResponseListeners.lambda$addCompleteListener$7(ResponseListeners.java:335) > at > org.eclipse.jetty.client.transport.ResponseListeners.notifyComplete(ResponseListeners.java:350) > at > org.eclipse.jetty.client.transport.ResponseListeners.notifyComplete(ResponseListeners.java:342) > at > org.eclipse.jetty.client.transport.HttpReceiver.terminateResponse(HttpReceiver.java:420) > at > org.eclipse.jetty.client.transport.HttpReceiver.terminateResponse(HttpReceiver.java:402) > at > org.eclipse.jetty.client.transport.HttpReceiver.lambda$responseSuccess$3(HttpReceiver.java:367) > at > org.eclipse.jetty.util.thread.SerializedInvoker$Link.run(SerializedInvoker.java:191) > at > org.eclipse.jetty.util.thread.SerializedInvoker.run(SerializedInvoker.java:117) > at > org.eclipse.jetty.client.transport.HttpReceiver.responseHeaders(HttpReceiver.java:243) > at > org.eclipse.jetty.client.transport.internal.HttpReceiverOverHTTP.lambda$headerComplete$2(HttpReceiverOverHTTP.java:435) > at > org.eclipse.jetty.client.transport.internal.HttpReceiverOverHTTP.parse(HttpReceiverOverHTTP.java:320) > at > org.eclipse.jetty.client.transport.internal.HttpReceiverOverHTTP.parseAndFill(HttpReceiverOverHTTP.java:250) > at > org.eclipse.jetty.client.transport.internal.HttpReceiverOverHTTP.receive(HttpReceiverOverHTTP.java:76) > at > org.eclipse.jetty.client.transport.internal.HttpChannelOverHTTP.receive(HttpChannelOverHTTP.java:97) > at > org.eclipse.jetty.client.transport.internal.HttpConnectionOverHTTP.onFillable(HttpConnectionOverHTTP.java:207) > at > org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:322) > at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:99) > at > org.eclipse.jetty.io.ssl.SslConnection$SslEndPoint.onFillable(SslConnection.java:574) > at > org.eclipse.jetty.io.ssl.SslConnection.onFillable(SslConnection.java:390) > at > org.eclipse.jetty.io.ssl.SslConnection$2.succeeded(SslConnection.java:150) > at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:99) > at > org.eclipse.jetty.io.SelectableChannelEndPoint$1.run(SelectableChannelEndPoint.java:53) > at > org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.runTask(AdaptiveExecutionStrategy.java:478) > at > org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.consumeTask(AdaptiveExecutionStrategy.java:441) > at > org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.tryProduce(AdaptiveExecutionStrategy.java:293) > at > org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.run(AdaptiveExecutionStrategy.java:201) > at > org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:311) > at > org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:979) > at > org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.doRunJob(QueuedThreadPool.java:1209) > at > org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1164) > at java.base/java.lang.Thread.run(Thread.java:833) > [DEBUG] 2024-06-04 00:17:20,326 > org.apache.camel.component.salesforce.internal.streaming.SubscriptionHelper > [Camel (camel-1) thread #322 - SalesforceHttpClient ] - > [CHANNEL:META_HANDSHAKE]: {ext={replay=true, payload.format=true}, > minimumVersion=1.0, clientId=REDACTED, > supportedConnectionTypes=[long-polling], channel=/meta/handshake, id=332, > version=1.0, successful=true} > [DEBUG] 2024-06-04 00:17:20,345 > org.apache.camel.component.salesforce.internal.streaming.SubscriptionHelper > [Camel (camel-1) thread #323 - SalesforceHttpClient ] - > [CHANNEL:META_CONNECT]: {clientId=REDACTED, advice={reconnect=retry, > interval=0, timeout=110000}, channel=/meta/connect, id=333, successful=true} > [DEBUG] 2024-06-04 00:19:10,361 > org.apache.camel.component.salesforce.internal.streaming.SubscriptionHelper > [Camel (camel-1) thread #324 - SalesforceHttpClient ] - > [CHANNEL:META_CONNECT]: {clientId=REDACTED, channel=/meta/connect, id=334, > successful=true} > {noformat} > This bug is causing the flow of play for events to stop unpredictably. We > have some alerting around this logging event, but it seems like this should > be handled in code. I have attempted to try to catch this exception in the > Camel route, but have not been successful. > The message the SubscriptionHelper is try to parse is: > {noformat} > {advice={reconnect=handshake, interval=0}, channel=/meta/subscribe, id=331, > error=403::Unknown client, successful=false} > {noformat} > Based on the exception: > {noformat} > Exception while invoking listener > org.apache.camel.component.salesforce.internal.streaming.SubscriptionHelper$5@704dd2c3 > java.lang.NullPointerException: Cannot invoke "Object.toString()" because the > return value of "org.cometd.bayeux.Message.get(Object)" is null > {noformat} > This code: > {code:java} > final String subscribedChannelName = > message.get(SUBSCRIPTION_FIELD).toString(); > {code} > Is producing the NPE and interrupting the subscription process. -- This message was sent by Atlassian Jira (v8.20.10#820010)