Uploaded image for project: 'Camel'
  1. Camel
  2. CAMEL-12986

Salesforce streaming api breaks after access token expires and a timeout happens when re logging in.



    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 2.23.0
    • 2.23.0
    • camel-salesforce
    • None
    • Unknown


      When using salesforce version 37 or earlier my push topics and streaming api runs forever with little to no issues. I tested expiring access tokens and hitting timeouts to mimic network failures. I debug the code and saw that there where retries for network failures. The type login I'm using is refresh token.


      I switch over to version 44 using code from camel 2.21.0 and saw a lot of 403 and timeouts and null pointers caused by timeouts that would kill the push topic subscription. Usually when the process dies I see null pointers than this message and no more push topic action happens. 

      org.apache.camel.component.salesforce.api.SalesforceException: Login request timeout: null
      at org.apache.camel.component.salesforce.internal.SalesforceSession.login(SalesforceSession.java:135)
      at org.apache.camel.component.salesforce.internal.streaming.SubscriptionHelper.createClient(SubscriptionHelper.java:345)
      at org.apache.camel.component.salesforce.internal.streaming.SubscriptionHelper.doStart(SubscriptionHelper.java:108)
      at org.apache.camel.component.salesforce.internal.streaming.SubscriptionHelper$4.run(SubscriptionHelper.java:277)
      at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)
      at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)
      at java.lang.Thread.run(Thread.java:748)
      Caused by: java.util.concurrent.TimeoutException: null
      at org.eclipse.jetty.client.util.FutureResponseListener.get(FutureResponseListener.java:109)
      at org.eclipse.jetty.client.HttpRequest.send(HttpRequest.java:655)
      at org.apache.camel.component.salesforce.internal.SalesforceSession.login(SalesforceSession.java:129)
      ... 6 common frames omitted
      15:51:51.531 [HttpClient@507583873-24] WARN org.eclipse.jetty.util.thread.QueuedThreadPool -
      java.lang.NullPointerException: null
      at org.apache.camel.component.salesforce.internal.streaming.SubscriptionHelper$4.run(SubscriptionHelper.java:284)
      at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)
      at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)
      at java.lang.Thread.run(Thread.java:748)
      15:51:53.256 [HttpClient@507583873-24] WARN org.eclipse.jetty.util.thread.QueuedThreadPool - Unexpected thread death: org.eclipse.jetty.util.thread.QueuedThreadPool$3@4d71480c in HttpClient@507583873{STARTED,8<=8<=200,i=3,q=0}


      When I switch to 2.23.0 I think the issue doesn't happen as often but I still need to do testing for long periods of time to be sure. 


      To recreate the issue put a breakpoint at SalesforceSession on this line 

       ** final ContentResponse loginResponse = loginPost.send();

      Start up the app and let the first login happen to establish an auth session. Then go to the AuthSession table and delete the row that correspond to the connection for your application, the SessionType should be Oauth2.

      Then you have to wait for a while for the system to realize that the session has to expire and we need to get a new access token. If you create a timeout exception I think you can cause this to happen faster but I usually wait up to 5 minutes for the loginPost.send() breakpoint to hit. To cause a timeout go to FutureResponseListener.java and debug and set the expired value true.

              **        if (expired)

                  throw new TimeoutException();

       So for the version 2.21.0 when I step over everything during loginPost.send(); there an exception thrown the client object becomes null and we get a null pointer and the subscription stops.


      For version 2.23.0 the timeout doesn't happen every time so again you have to throw a timeout by going through FutureResponseListener and creating a timeout. This is a problem because my jobs always stops taking push action after a couple of days. 37 version code would retry on network issues but the new code will throw a null pointer exception on client when theres a timeout on the login process and cause the subscription to die. **





            Unassigned Unassigned
            hnguyen15 Huy Nguyen
            0 Vote for this issue
            1 Start watching this issue