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.
Find more posts tagged with
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"
StatusMsgEnd
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?
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.
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.