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,