C++ API Dictionary programmatic setup
Greetings! I am using latest RTSDK C/CPP 2.1.3.G1 aka EMA/ETA 3.7.3.G1 aka 3.7.3.3 and having dictionary timeout issues similar to https://community.developers.refinitiv.com/questions/95787/emadictionary-retrieval-failed-timed-out-after-wai.html
I increased timeout up to 120 seconds, and it helped only once, while most of the time I am having timeout anyway, so I tried to modify config to use local dictionary files. I am preparing config programmatically, so in the code it looks like the following:
void createProgramaticConfig(Map& configDb, const EmaString& aHost, const EmaString& aPort) {
Map elementMap;
ElementList elementList;
elementMap.addKeyAscii("Consumer_1", MapEntry::AddEnum,
ElementList()
.addAscii("Channel", "Channel_1")
.addAscii("Logger", "Logger_1")
.addAscii("Dictionary", "Dictionary_1")
.complete()).complete();
elementList.addMap("ConsumerList", elementMap);
elementList.complete();
elementMap.clear();
configDb.addKeyAscii("ConsumerGroup", MapEntry::AddEnum, elementList);
elementList.clear();
//----------------
Map dictMap;
dictMap.addKeyAscii("Dictionary_1", MapEntry::AddEnum,
ElementList()
.addAscii("Name", "Dictionary_1")
.addAscii("DictionaryType", "DictionaryType::FileDictionary")
.addAscii("RdmFieldDictionaryFileName", "./elektron/RDMFieldDictionary")
.addAscii("EnumTypeDefFileName", "./elektron/enumtype.def").complete()).complete();
ElementList dictList;
dictList.addMap("DictionaryList", dictMap);
dictList.complete();
configDb.addKeyAscii("DictionaryGroup", MapEntry::AddEnum, dictList);
//----------------
elementMap.addKeyAscii("Logger_1", MapEntry::AddEnum,
ElementList()
.addEnum("LoggerType", 0)
.addAscii("FileName", "logFile")
.addEnum("LoggerSeverity", 0).complete()).complete();
elementList.addMap("LoggerList", elementMap);
elementList.complete();
elementMap.clear();
configDb.addKeyAscii("LoggerGroup", MapEntry::AddEnum, elementList);
elementList.clear();
//----------------
ElementList channelElementList;
channelElementList
.addEnum("ChannelType", 1) // Use the RSSL_CONN_TYPE_ENCRYPTED connection
.addAscii("Host", aHost)
.addAscii("Port", aPort)
.addUInt("EnableSessionManagement", 1);
channelElementList.addEnum("EncryptedProtocolType", 1); //RSSL_CONN_TYPE_ENCRYPTED
channelElementList.complete();
elementMap.addKeyAscii("Channel_1", MapEntry::AddEnum, channelElementList);
elementMap.complete();
elementList.addMap("ChannelList", elementMap);
elementList.complete();
configDb.addKeyAscii("ChannelGroup", MapEntry::AddEnum, elementList);
configDb.complete();
}
Once config is made, I am printing it to the log, to ensure it has valid structure:
MapEntry action="Add" key dataType="Ascii" value="ConsumerGroup" dataType="ElementList"
ElementList
ElementEntry name="ConsumerList" dataType="Map"
Map
MapEntry action="Add" key dataType="Ascii" value="Consumer_1" dataType="ElementList"
ElementList
ElementEntry name="Channel" dataType="Ascii" value="Channel_1"
ElementEntry name="Logger" dataType="Ascii" value="Logger_1"
ElementEntry name="Dictionary" dataType="Ascii" value="Dictionary_1"
ElementEntry name="DictionaryRequestTimeOut" dataType="UInt" value="120000"
ElementListEnd
MapEntryEnd
MapEnd
ElementEntryEnd
ElementListEnd
MapEntryEnd
MapEntry action="Add" key dataType="Ascii" value="DictionaryGroup" dataType="ElementList"
ElementList
ElementEntry name="DictionaryList" dataType="Map"
Map
MapEntry action="Add" key dataType="Ascii" value="Dictionary_1" dataType="ElementList"
ElementList
ElementEntry name="Name" dataType="Ascii" value="Dictionary_1"
ElementEntry name="DictionaryType" dataType="Ascii" value="DictionaryType::FileDictionary"
ElementEntry name="RdmFieldDictionaryFileName" dataType="Ascii" value="./elektron/RDMFieldDictionary"
ElementEntry name="EnumTypeDefFileName" dataType="Ascii" value="./elektron/enumtype.def"
ElementListEnd
MapEntryEnd
MapEnd
ElementEntryEnd
ElementListEnd
MapEntryEnd
MapEntry action="Add" key dataType="Ascii" value="LoggerGroup" dataType="ElementList"
ElementList
ElementEntry name="LoggerList" dataType="Map"
Map
MapEntry action="Add" key dataType="Ascii" value="Logger_1" dataType="ElementList"
ElementList
ElementEntry name="LoggerType" dataType="Enum" value="0"
ElementEntry name="FileName" dataType="Ascii" value="logFile"
ElementEntry name="LoggerSeverity" dataType="Enum" value="0"
ElementListEnd
MapEntryEnd
MapEnd
ElementEntryEnd
ElementListEnd
MapEntryEnd
MapEntry action="Add" key dataType="Ascii" value="ChannelGroup" dataType="ElementList"
ElementList
ElementEntry name="ChannelList" dataType="Map"
Map
MapEntry action="Add" key dataType="Ascii" value="Channel_1" dataType="ElementList"
ElementList
ElementEntry name="ChannelType" dataType="Enum" value="1"
ElementEntry name="Host" dataType="Ascii" value="us-east-1-aws-3-med.optimized-pricing-api.refinitiv.net"
ElementEntry name="Port" dataType="Ascii" value="14002"
ElementEntry name="EnableSessionManagement" dataType="UInt" value="1"
ElementEntry name="EncryptedProtocolType" dataType="Enum" value="1"
ElementListEnd
MapEntryEnd
MapEnd
ElementEntryEnd
ElementListEnd
MapEntryEnd
However, this dictionary config is being ignored, and app is trying to request dictionary anyway. Log file attached: logFile_11052.txt
Probably, config is a bit wrong? However, I made it according to examples, and not able to find mistakes there. Could anybody assits, please?
Also, is it normal to experience such a big timeouts for dictionary requests from server?
Best Answer
-
Hello @konstantin.utkin.cpp
Thank you for reaching out to us. I checked the EMA C++ Cons421 and Cons450 (the connectWebSocket part which requires a local dictionary setting) example codes. They set the Dictionary Type with addEnum() method, not addAscii() method as follows:
innerMap.addKeyAscii( "Dictionary_1", MapEntry::AddEnum,
ElementList()
//.addEnum( "DictionaryType", 1 ) // Use ChannelDictionaryEnum
.addEnum("DictionaryType", 0) // Use FileDictionaryEnum
.addAscii( "RdmFieldDictionaryFileName", "C:\\drive_d\\Project\\APIs\\RTSDK_CPP\\RTSDK-2.1.3.L1.win.rrg\\Cpp-C\\etc\\RDMFieldDictionary" )
.addAscii( "EnumTypeDefFileName", "C:\\drive_d\\Project\\APIs\\RTSDK_CPP\\RTSDK-2.1.3.L1.win.rrg\\Cpp-C\\etc\\enumtype.def" ).complete() ).complete();I did a quick test on my end with EMA 2.1.3 RRG, and it works file. The trace file shows that it downloaded dictionary from my local machine, not the ADS server.
1
Answers
-
Hello @wasin.w it worked, thank you very much! Didn't noticed this in examples.
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 中文论坛