When my application has been disconnected from the server, I would like to get an alert. Is it possible to do this?
Hello @Akechi Sato
Market Data interfaces used by SSL consumer applications provide Connection Events which represents events associated with a connection. An application can register its interest via registerClient(..) in notifications of changes in connection statuses. As soon as it registers its interest, it will receive information about existing connections. Then every time a connection status changes e.g. from connect to disconnect, the application will be notified via Connection Events.
The application should register the Connection Events with different Event Queue and different MarketDataSubscriber from the one for MarketDataItem Events. Hence, the Connection Events are dispatched in timely manner when the connection/disconnection occurs. Otherwise, the application may be notified late because it has to dispatch all MarketDataItem Events which are put in the same queue prior to the Connection Events first.
The example source code is shown below:
1. Initializing RFA resource and registering for the Connection Events:
// RFA objects for Connection Events protected EventQueue _conEventQueue; protected MarketDataSubscriber _conMarketDataSubscriber; protected Handle _conmdsClientHandle; … //Initialize RFA objects for Connection Events _conEventQueue = EventQueue.create("EventQueue for connection Event"); _conMarketDataSubscriber = (MarketDataSubscriber)_session .createEventSource(EventSource.MARKET_DATA_SUBSCRIBER, "MarketDataSubscriber for connection event",true, _standardPI); //Register for connection status MarketDataSubscriberInterestSpec conmarketDataSubscriberInterestSpec = new MarketDataSubscriberInterestSpec(); conmarketDataSubscriberInterestSpec.setConnectionInterest(true); _conmdsClientHandle = _conMarketDataSubscriber.registerClient(_conEventQueue, conmarketDataSubscriberInterestSpec, myClient, null);
2. Dispatching the Connection Events from its queue:
while ((System.currentTimeMillis() - startTime) < _runTime * 1000) try { … _conEventQueue.dispatch(1000); } catch (DispatchException de) { System.out.println("Queue deactivated"); return; }
3. Processing the Connection Events:
public void processEvent(Event event) { switch (event.getType()) { … case Event.CONNECTION_EVENT: processConnectionEvent((ConnectionEvent)event); break; … } } protected void processConnectionEvent(ConnectionEvent connectionEvent) { System.out.println(new Date()); System.out.print("Received CONNECTION_EVENT: " + connectionEvent.getConnectionName()); System.out.println(" " + connectionEvent.getConnectionStatus().toString()); if(connectionEvent.getConnectionStatus().getState() == ConnectionStatus.DOWN) { System.out.println("The application is disconnecting from the server”); } else if (connectionEvent.getConnectionStatus().getState() == ConnectionStatus.UP) { System.out.println("The application is connecting to the server”); } }
4.Unregistering for the Connection Events and Releasing RFA resource before the application exits
//cleanup RFA objects for connection status _conMarketDataSubscriber.unregisterClient( _conmdsClientHandle); _conMarketDataSubscriber.destroy(); _conEventQueue.deactivate();
The example output when the application connects the server:
Wed Jul 26 17:11:53 ICT 2017 Received CONNECTION_EVENT: SSLNamespace::pageSSLConn { state: UP, code: NONE, text: "192.168.27.55"} The application is connecting to the server
The example output when it has been disconnected from the server:
Wed Jul 26 17:15:06 ICT 2017 Received CONNECTION_EVENT: SSLNamespace::pageSSLConn { state: DOWN, code: NONE, text: "Not connected: Channel disconnected"} The application is disconnecting from the server