Dukascopy
 
 
Wiki JStore Search Login

Attention! Read the forum rules carefully before posting a topic.

    Try to find an answer in Wiki before asking a question.
    Submit programming questions in this forum only.
    Off topics are strictly forbidden.

Any topics which do not satisfy these rules will be deleted.

How to handle disconnections properly and force reconnecting?
 Post subject: How to handle disconnections properly and force reconnecting? Post rating: 0   New post Posted: Fri 11 Sep, 2015, 17:01 
User avatar

User rating: 0
Joined: Mon 12 Mar, 2012, 18:23
Posts: 9
I'm running a strategy on my live account with the standalone api. I use singlejartest.Main in the SDK project to start the strategy. Today, the transport client got disconnected and never manage to reconnect in the next few hours. There is only a few reconnect attempts in the logs.

Can you privide an example that shows how to handle disconnections properly?

Here are the logs.
Quote:
15:09:02.505 ERROR com.dukascopy.charts.data.datacache.time.TimeManager - Request to DFS timed out, timeout [10000], request [<ServerTimeRequestMessage(,requestId=2575)>]
com.dukascopy.charts.data.datacache.DataCacheException: Request to DFS timed out, timeout [10000], request [<ServerTimeRequestMessage(,requestId=2575)>]
at com.dukascopy.charts.data.datacache.CurvesJsonProtocolHandler.processMessage(CurvesJsonProtocolHandler.java:1344)
at com.dukascopy.charts.data.datacache.CurvesJsonProtocolHandler.processMessage(CurvesJsonProtocolHandler.java:1263)
at com.dukascopy.charts.data.datacache.CurvesJsonProtocolHandler.loadServerTime(CurvesJsonProtocolHandler.java:1364)
at com.dukascopy.charts.data.datacache.time.TimeManager$4.run(TimeManager.java:245)
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
15:09:22.932 ERROR com.dukascopy.dds4.transport.client.ClientConnector - Exception caught
java.io.IOException: An existing connection was forcibly closed by the remote host
at sun.nio.ch.SocketDispatcher.read0(Native Method)
at sun.nio.ch.SocketDispatcher.read(Unknown Source)
at sun.nio.ch.IOUtil.readIntoNativeBuffer(Unknown Source)
at sun.nio.ch.IOUtil.read(Unknown Source)
at sun.nio.ch.SocketChannelImpl.read(Unknown Source)
at org.apache.mina.transport.socket.nio.SocketIoProcessor.read(SocketIoProcessor.java:218)
at org.apache.mina.transport.socket.nio.SocketIoProcessor.process(SocketIoProcessor.java:198)
at org.apache.mina.transport.socket.nio.SocketIoProcessor.access$400(SocketIoProcessor.java:45)
at org.apache.mina.transport.socket.nio.SocketIoProcessor$Worker.run(SocketIoProcessor.java:486)
at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:51)
at java.lang.Thread.run(Unknown Source)
15:09:24.088 WARN singlejartest.Main - Disconnected
15:09:28.867 ERROR com.dukascopy.dds4.transport.client.TransportClient - Client disconnected, child connection ping failed
java.util.concurrent.TimeoutException: No response from server. Request: <HeartbeatRequestMessage(,synchRequestId=30150)>
at com.dukascopy.dds4.transport.client.TransportClient.controlSynchRequest(TransportClient.java:854)
at com.dukascopy.dds4.transport.client.TransportClient.pingIoSession(TransportClient.java:615)
at com.dukascopy.dds4.transport.client.TransportClient.pingChildSession(TransportClient.java:680)
at com.dukascopy.dds4.transport.client.TransportClient.pingConnection(TransportClient.java:671)
at com.dukascopy.dds4.transport.client.TransportClient.access$200(TransportClient.java:59)
at com.dukascopy.dds4.transport.client.TransportClient$1.run(TransportClient.java:316)
at java.lang.Thread.run(Unknown Source)
15:09:46.155 WARN singlejartest.Main - Disconnected
15:10:08.394 WARN singlejartest.Main - Disconnected
15:10:30.524 WARN singlejartest.Main - Disconnected
15:11:01.587 ERROR singlejartest.Main - Connection timed out: connect
java.net.ConnectException: Connection timed out: connect
at java.net.TwoStacksPlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at sun.security.ssl.SSLSocketImpl.connect(Unknown Source)
at sun.security.ssl.BaseSSLSocketImpl.connect(Unknown Source)
at sun.net.NetworkClient.doConnect(Unknown Source)
at sun.net.www.http.HttpClient.openServer(Unknown Source)
at sun.net.www.http.HttpClient.openServer(Unknown Source)
at sun.net.www.protocol.https.HttpsClient.<init>(Unknown Source)
at sun.net.www.protocol.https.HttpsClient.New(Unknown Source)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source)
at com.dukascopy.api.impl.connect.DCClientImpl.getAuthServers(DCClientImpl.java:469)
at com.dukascopy.api.impl.connect.DCClientImpl.connect(DCClientImpl.java:388)
at com.dukascopy.api.impl.connect.DCClientImpl.connect(DCClientImpl.java:310)
at singlejartest.Main$1.onDisconnect(Main.java:153)
at com.dukascopy.api.impl.connect.DCClientImpl$7.onDisconnect(DCClientImpl.java:822)
at com.dukascopy.api.impl.connect.DCClientImpl.disconnected(DCClientImpl.java:1100)
at com.dukascopy.dds4.transport.common.mina.DisconnectedEvent.execute(DisconnectedEvent.java:43)
at com.dukascopy.dds4.transport.common.mina.EventTask.run(EventTask.java:35)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)


And the ISystemListener Class:
        client.setSystemListener(new ISystemListener() {
            private int lightReconnects = 3;

           @Override
           public void onStart(long processId) {
                LOGGER.info("Strategy started: " + processId);
           }

         @Override
         public void onStop(long processId) {
                LOGGER.info("Strategy stopped: " + processId);
                if (client.getStartedStrategies().size() == 0) {
                    System.exit(0);
                }
         }

         @Override
         public void onConnect() {
                LOGGER.info("Connected");
                lightReconnects = 3;
         }

         @Override
         public void onDisconnect() {
                LOGGER.warn("Disconnected");
                if (lightReconnects > 0) {
                    client.reconnect();
                    --lightReconnects;
                } else {
                    try {
                        //sleep for 10 seconds before attempting to reconnect
                        Thread.sleep(10000);
                    } catch (InterruptedException e) {
                        //ignore
                    }
                    try {
                        client.connect(jnlpUrl, userName, password);
                    } catch (Exception e) {
                        LOGGER.error(e.getMessage(), e);
                    }
                }
         }
      });


 
 Post subject: Re: How to handle disconnections properly and force reconnecting? Post rating: 0   New post Posted: Wed 11 Nov, 2015, 11:13 
User avatar

User rating:
Joined: Fri 31 Aug, 2007, 09:17
Posts: 6139
Please replace onDisconnect implementation with the following code

         public void onDisconnect() {
                Runnable runnable = new Runnable() {
                    @Override
                    public void run() {
                        if (lightReconnects > 0) {
                            client.reconnect();
                            --lightReconnects;
                        } else {
                            do {
                                try {
                                    Thread.sleep(60 * 1000);
                                } catch (InterruptedException e) {
                                }
                                try {
                                    if(client.isConnected()) {
                                        break;
                                    }
                                    client.connect(jnlpUrl, userName, password);

                                } catch (Exception e) {
                                    LOGGER.error(e.getMessage(), e);
                                }
                            } while(!client.isConnected());
                        }
                    }
                };
                new Thread(runnable).start();
         }


 
 Post subject: Re: How to handle disconnections properly and force reconnecting? Post rating: 0   New post Posted: Sat 26 Dec, 2015, 22:25 
User avatar

User rating: 0
Joined: Sat 26 Dec, 2015, 22:23
Posts: 1
Location: Russian Federation, Arkhangelsk
API Support wrote:
Please replace onDisconnect implementation with the following code


It works like a charm, please commit this solutuion to the code of the JForex-SDK project.


 

Jump to:  

cron
  © 1998-2025 Dukascopy® Bank SA
On-line Currency forex trading with Swiss Forex Broker - ECN Forex Brokerage,
Managed Forex Accounts, introducing forex brokers, Currency Forex Data Feed and News
Currency Forex Trading Platform provided on-line by Dukascopy.com