c# Ema Login timout on MacOs but not on Windows
Hello,
Me and my team are trying to connect to the Realtime-optimzed instance via c# (asp.net core 8) code and we managed to do so but only on the windows11 machine from my colleague, on my macos 14.2.1 macbook pro m1 I'm always getting an error (see below).
Does this package use some specific feature which doesn't exist on macos ? We couldn't find anything about compatibility issues.
Enabling more trace logs via the config file also doesn't give more logs.
Did anyone had similar issues or maybe has some suggestion ?
Code
https://developers.lseg.com/en/api-catalog/refinitiv-real-time-opnsrc/refinitiv-real-time-csharp-sdk/tutorials#ema-consumer-connecting-to-real-time-optimized It is the same code as in this tutorial just wrapped in a function which is getting called via an endpoint in asp.net core.
public Task GetRefinitivTestData()
{
OmmConsumer? consumer = null;
try
{
// instantiate callback client
AppClient appClient = new();
_logger.Information("Connecting to RTO");
// The consumer configuration class allows the customization of the consumer (OmmConsumer)
// interface.
// OmmConsumerConfig config = new OmmConsumerConfig().Host("ADS:14002").UserName("user");
//Create an instance of OmmConsumerConfig and assign the clientId and clientSecret
OmmConsumerConfig config = new OmmConsumerConfig().ClientId("<clientId>").ClientSecret("<secret>");
//Create an instance of the OMMConsumer class with the OMMConsumerConfig instance
consumer = new OmmConsumer(config);
_logger.Information("Subscribing to market data");
var array = new OmmArray()
.AddAscii("/IBM.N")
.Complete();
var batch = new ElementList()
.AddArray(EmaRdm.ENAME_BATCH_ITEM_LIST, array)
.Complete();
//Subscribe to retrieve real-time market price data of JPY= from the ELEKTRON_DD service
consumer.RegisterClient(new RequestMsg().ServiceName("ELEKTRON_DD").Payload(batch), appClient);
// block this thread for a while, API calls OnRefreshMsg(), OnUpdateMsg() and OnStatusMsg()
Thread.Sleep(20000);
}
catch (OmmException excp)
{
_logger.Information($"Exception subscribing to market data: {excp.Message}");
}
finally
{
consumer?.Uninitialize();
}
return Task.CompletedTask;
}
internal class AppClient : IOmmConsumerClient
{
public void OnRefreshMsg(RefreshMsg refreshMsg, IOmmConsumerEvent consumerEvent)
{
Console.WriteLine("----------------------------------");
// an item handle uniquely identifies the request and is used to unsubscribe it
// a closure is any user owned object passed on when making a request and is passed back in response (refresh/update/status) messages
Console.WriteLine($"Refresh message, item Handle: {consumerEvent.Handle} Clousre: {consumerEvent.Closure}");
// display item and service name
if (refreshMsg.HasMsgKey)
{
Console.WriteLine($"Item Name: {refreshMsg.Name()} Service Name: {refreshMsg.ServiceName()}");
}
Console.WriteLine($"Item State: {refreshMsg.State()}");
// Level1 data payload is encoded as an OMM FieldList or NoData if no payload data is available
if (DataType.DataTypes.FIELD_LIST == refreshMsg.Payload().DataType)
{
Decode(refreshMsg.Payload().FieldList());
}
}
public void OnUpdateMsg(UpdateMsg updateMsg, IOmmConsumerEvent consumerEvent)
{
Console.WriteLine("----------------------------------");
// display item and service name
if (updateMsg.HasMsgKey)
{
Console.WriteLine($"Item Name: {updateMsg.Name()} Service Name: {updateMsg.ServiceName()}");
}
// Level1 data payload is encoded as an OMM FieldList or NoData if no payload data is available
if (DataType.DataTypes.FIELD_LIST == updateMsg.Payload().DataType)
{
Decode(updateMsg.Payload().FieldList());
}
}
public void OnStatusMsg(StatusMsg statusMsg, IOmmConsumerEvent _)
{
Console.WriteLine("Item Name: " + (statusMsg.HasName ? statusMsg.Name() : "<not set>"));
Console.WriteLine("Service Name: " + (statusMsg.HasServiceName ? statusMsg.ServiceName() : "<not set>"));
if (statusMsg.HasState)
Console.WriteLine("Item State: " +statusMsg.State());
Console.WriteLine();
}
// onAllMsg, onAckMsg, onGenericMsg
// These callbacks are not necessary for our series of tutorials. You can refer to the documentation
// to better understand the purpose of these callbacks.
public void OnAllMsg(Msg msg, IOmmConsumerEvent consumerEvent) { }
public void OnAckMsg(AckMsg ackMsg, IOmmConsumerEvent consumerEvent) { }
public void onGenericMsg(GenericMsg genericMSg, IOmmConsumerEvent consumerEvent) { }
void Decode(FieldList fieldList)
{
foreach (var fieldEntry in fieldList)
{
Console.Write($"Fid: {fieldEntry.FieldId} Name: {fieldEntry.Name} DataType: {DataType.AsString(fieldEntry.Load!.DataType)} Value: ");
if (Data.DataCode.BLANK == fieldEntry.Code)
{
Console.WriteLine(" blank");
}
else
{
switch (fieldEntry.LoadType)
{
case DataTypes.REAL:
Console.WriteLine(fieldEntry.OmmRealValue().AsDouble());
break;
case DataTypes.DATE:
Console.WriteLine($"{fieldEntry.OmmDateValue().Day} / {fieldEntry.OmmDateValue().Month} / {fieldEntry.OmmDateValue().Year}");
break;
case DataTypes.TIME:
Console.WriteLine($"{fieldEntry.OmmTimeValue().Hour}:{fieldEntry.OmmTimeValue().Minute}:{fieldEntry.OmmTimeValue().Second}:{fieldEntry.OmmTimeValue().Millisecond}");
break;
case DataTypes.INT:
Console.WriteLine(fieldEntry.IntValue());
break;
case DataTypes.UINT:
Console.WriteLine(fieldEntry.UIntValue());
break;
case DataTypes.ASCII:
Console.WriteLine(fieldEntry.OmmAsciiValue());
break;
case DataTypes.ENUM:
Console.WriteLine(fieldEntry.HasEnumDisplay ? fieldEntry.EnumDisplay() : fieldEntry.EnumValue());
break;
case DataTypes.RMTES:
Console.WriteLine(fieldEntry.OmmRmtesValue());
break;
case DataTypes.ERROR:
Console.WriteLine($"({fieldEntry.OmmErrorValue().ErrorCodeAsString()})");
break;
default:
Console.WriteLine();
break;
}
}
}
}
}
Error message
ERROR|: loggerMsg
ClientName: EmaConfig
Severity: Error Text: Unknown Channel entry element: ObjectName in Channel_1
loggerMsgEnd
ERROR|: loggerMsg
ClientName: Consumer_1_1
Severity: Error Text: login failed (timed out after waiting 45000 milliseconds) for
loggerMsgEnd
ERROR|: loggerMsg
ClientName: ChannelCallbackClient
Severity: Error Text: Received ChannelDown event on channel Channel_1
Instance Name Consumer_1_1
Reactor 16450261
Channel 65249694
Error Id SUCCESS
Internal sysError 0
Error Location
Error text
loggerMsgEnd
Best Regards,
Best Answer
-
Hello @sebastian.schuett
I see you have submitted the GitHub issues-265 to the RTSDK team. The team is working on the issue.
I have checked the RTSDK C# API Compatibility Matrix page, the matrix document shows that the ETA C# and EMA C# API support the Windows, Oracle Linux, RHEL and Ubuntu Linux Operation Systems only:
0
Answers
-
The API compatibility matrix does not list MaxOS as one of the supported platforms for EMA C#.
I don't have access to MacOS 14.2 myself, but have you tried running the basic Consumer 100 example or since you are connecting to RTO, Consumer 450 Service Discovery example as a standalone application without ASP.NET.
You can directly raise an issue with development team using the Github and ask for support.
0 -
Hello @sebastian.schuett
Additionally, the RTSDK C# (EMA and ETA APIs) are tested and qualified with .NET version 6. You can find more detail on the SDK README file.
0 -
Thanks, but why is the matrix only in the C/C++ documentation and not in the c# documentation if it also contains info for that language ?
The "Consumer 100" example ist stuck after/at it creates the config
OmmConsumerConfig config = new OmmConsumerConfig()
And The "Consumer 450 Service Discovery" lists all services and than is also stuck at creating the config.
I guess I need to raise an issue on github.
0 -
On Macos running it with .Net 6 doesn't change the behaviour.0
-
Thanks, didn't see the matrix before. May I ask what packages/code is used which makes this package not compatible with a lot more systems? Especially if .Net 5+ can run on almost everything.0
-
The matrix lists the operating sytems and compilers on which the APIs are tested and we support the APIs on the listed operating sytems and compilers.
You are correct that .NET 5+ can run on almost everything but they aren't qualified by our product team.
0 -
Hi thanks for the reply. ay I know why this does not work? So my team can work on a workaround for us mac users if that is possible.
0 -
Hello @sebastian.schuett
Based on the Github issues-265, the RTSDK team found that the .NET issues-920 on Mac is the one that caused the issue.
0
Categories
- All Categories
- 6 AHS
- 37 Alpha
- 161 App Studio
- 4 Block Chain
- 4 Bot Platform
- 16 Connected Risk APIs
- 47 Data Fusion
- 30 Data Model Discovery
- 608 Datastream
- 1.3K DSS
- 577 Eikon COM
- 4.9K Eikon Data APIs
- 7 Electronic Trading
- Generic FIX
- 7 Local Bank Node API
- Trading API
- 2.7K Elektron
- 1.3K EMA
- 236 ETA
- 519 WebSocket API
- 33 FX Venues
- 10 FX Market Data
- 1 FX Post Trade
- 1 FX Trading - Matching
- 12 FX Trading – RFQ Maker
- 5 Intelligent Tagging
- 2 Legal One
- 20 Messenger Bot
- 2 Messenger Side by Side
- 9 ONESOURCE
- 7 Indirect Tax
- 59 Open Calais
- 264 Open PermID
- 39 Entity Search
- 2 Org ID
- PAM
- PAM - Logging
- 8.4K Private Comments
- 6 Product Insight
- Project Tracking
- ProView
- ProView Internal
- 20 RDMS
- 1.4K Refinitiv Data Platform
- 367 Refinitiv Data Platform Libraries
- 3 Refinitiv Due Diligence
- LSEG Due Diligence Portal API
- 3 Refinitiv Due Dilligence Centre
- Rose's Space
- 1.1K Screening
- 18 Qual-ID API
- 13 Screening Deployed
- 23 Screening Online
- 10 World-Check Customer Risk Screener
- 990 World-Check One
- 44 World-Check One Zero Footprint
- 45 Side by Side Integration API
- Test Space
- 3 Thomson One Smart
- 1.2K TR Internal
- Global Hackathon 2015
- 2 Specialists Who Code
- 10 TR Knowledge Graph
- 150 Transactions
- 142 REDI API
- 1.7K TREP APIs
- 4 CAT
- 21 DACS Station
- 117 Open DACS
- 1.1K RFA
- 103 UPA
- 172 TREP Infrastructure
- 224 TRKD
- 886 TRTH
- 5 Velocity Analytics
- 5 Wealth Management Web Services
- 59 Workspace SDK
- 9 Element Framework
- 5 Grid
- 13 World-Check Data File
- Yield Book Analytics
- 46 中文论坛