NiProvider OmmInvalidUsageException on connection loss

We aim to build a resilient, non-interactive provider application based on the C++ EMA Library (RTSDK-2.2.3.E1.linux.rrg). The application should handle potential connection losses and automatically reconnect to one of the available ADH servers.
The automatic reconnect is successfully facilitated by the EMA library. Our application logic is based on the NiProvider 360_MP_ConnectionRecovery example.
However, we encountered a potential issue when a connection loss occurs while the OmmProvider::submit() function is transmitting a message. In this case, the EMA Library raises an OmmInvalidUsageException.
Unfortunately, we cannot determine whether the exception was raised due to a connection issue or another error.
Could you please advise how we can identify if the exception was caused by a connection loss and if it is safe to continue transferring messages after the connection has been reestablished?
Thank you in advance for your support and assistance with this matter.
Answers
-
Hello @Zoltan.Csonka
Please enable verbose logging in the EMA application and provide the complete exception details. If you are able to reproduce this issue with one of the provided NiProvider EMA samples, then we can look into it.
0 -
Thank you for reaching out to us.
You can register the login stream to receive the login status when the connection is down.
class AppClient : public refinitiv::ema::access::OmmProviderClient { protected : void onRefreshMsg( const refinitiv::ema::access::RefreshMsg&, const refinitiv::ema::access::OmmProviderEvent& ); void onStatusMsg( const refinitiv::ema::access::StatusMsg&, const refinitiv::ema::access::OmmProviderEvent& ); };
void AppClient::onRefreshMsg( const RefreshMsg& refreshMsg, const OmmProviderEvent& ommEvent ) { cout << endl << "Handle: " << ommEvent.getHandle() << " Closure: " << ommEvent.getClosure() << endl; cout << refreshMsg << endl; } void AppClient::onStatusMsg( const StatusMsg& statusMsg, const OmmProviderEvent& ommEvent ) { cout << endl << "Handle: " << ommEvent.getHandle() << " Closure: " << ommEvent.getClosure() << endl; cout << statusMsg << endl; } int main() { try { AppClient appClient; OmmProvider provider( OmmNiProviderConfig().username( "user" ), appClient ); …
When the connection is now, the application will receive the following login status message.
StatusMsg
streamId="1"
domain="Login Domain"
ClearCache
state="Open / Suspect / None / 'channel down'"
name="user"
nameType="1"
StatusMsgEnd0 -
Thank you very much for your response.
Your approach seems to be working fine with the UserDispatch method. However, with the ApiDispatch method, detecting connection loss and publishing a new message takes place in two different threads. In case of high output rates, it is likely that there will be an overlap between sending a message and detecting/signaling connection loss, causing the library to throw an InvalidUsage exception as follows:
Exception Type=‘OmmInvalidUsageException’, Text=‘No active channel to send message.’, ErrorCode=‘-4049’
Do you have any idea if it is possible to run this scenario with the ApiDispatch method?
0 -
I think the exception itself indicates that the channel is inactive. The error code -4049 represents:
NoActiveChannelEnum = -4049, /*!< No active channel. */
Therefore, the application can catch this exception and stop publishing data when the error code is -4049.
Then, starting publishing the data when the login status is Open/Ok.
Otherise, the OmmConsumer has the getChannelInformation method which provides the ChannelInformation.
The ChannelInformation indicates the status of the channel.
0
Categories
- All Categories
- 3 Polls
- 6 AHS
- 36 Alpha
- 166 App Studio
- 6 Block Chain
- 4 Bot Platform
- 18 Connected Risk APIs
- 47 Data Fusion
- 34 Data Model Discovery
- 685 Datastream
- 1.4K DSS
- 615 Eikon COM
- 5.2K Eikon Data APIs
- 10 Electronic Trading
- Generic FIX
- 7 Local Bank Node API
- 3 Trading API
- 2.9K Elektron
- 1.4K EMA
- 252 ETA
- 556 WebSocket API
- 38 FX Venues
- 14 FX Market Data
- 1 FX Post Trade
- 1 FX Trading - Matching
- 12 FX Trading – RFQ Maker
- 5 Intelligent Tagging
- 2 Legal One
- 23 Messenger Bot
- 3 Messenger Side by Side
- 9 ONESOURCE
- 7 Indirect Tax
- 60 Open Calais
- 275 Open PermID
- 44 Entity Search
- 2 Org ID
- 1 PAM
- PAM - Logging
- 6 Product Insight
- Project Tracking
- ProView
- ProView Internal
- 22 RDMS
- 1.9K Refinitiv Data Platform
- 652 Refinitiv Data Platform Libraries
- 4 LSEG Due Diligence
- LSEG Due Diligence Portal API
- 4 Refinitiv Due Dilligence Centre
- Rose's Space
- 1.2K Screening
- 18 Qual-ID API
- 13 Screening Deployed
- 23 Screening Online
- 12 World-Check Customer Risk Screener
- 1K World-Check One
- 46 World-Check One Zero Footprint
- 45 Side by Side Integration API
- 2 Test Space
- 3 Thomson One Smart
- 10 TR Knowledge Graph
- 151 Transactions
- 143 REDI API
- 1.8K TREP APIs
- 4 CAT
- 27 DACS Station
- 121 Open DACS
- 1.1K RFA
- 104 UPA
- 193 TREP Infrastructure
- 228 TRKD
- 917 TRTH
- 5 Velocity Analytics
- 9 Wealth Management Web Services
- 90 Workspace SDK
- 11 Element Framework
- 5 Grid
- 18 World-Check Data File
- 1 Yield Book Analytics
- 46 中文论坛