We're having trouble using EMA programmatic configuration in Java for the Dictionary related elements as part of a TRCC application
1) Using the example code we're able to connect to TRCC when specifying local RDMFieldDictionary & enumtype.def files (we can't get Channel method to work but not important right now) when using the an xml ema config file
2) Running the same code but programmatically setting the various parameters fails with the following:
Apr 22, 2020 2:43:55 PM com.thomsonreuters.ema.access.ConfigErrorTracker log
WARNING: loggerMsg
ClientName: EmaConfig
Severity: Warning
Text: no configuration exists in the config file for consumer dictionary [DictionaryGroup|DictionaryList]. Will use dictionary defaults if not config programmatically.
loggerMsgEndApr 22, 2020 2:43:55 PM com.thomsonreuters.ema.access.ConfigErrorTracker log
SEVERE: loggerMsg
ClientName: EmaConfig
Severity: Error
Text: no conversion in convertToEnum for enumType [FieldDictionary]
loggerMsgEndApr 22, 2020 2:43:57 PM com.thomsonreuters.ema.access.ChannelCallbackClient reactorChannelEventCallback
INFO: loggerMsg
ClientName: ChannelCallbackClient
Severity: Info
Text: Received ChannelUp event on channel Channel_1
Instance Name Consumer_1_1
Component Version eta3.1.1.L1.linux.rrg 64-bit Static
loggerMsgEndApr 22, 2020 2:44:42 PM com.thomsonreuters.ema.access.OmmConsumerImpl loadDictionary
SEVERE: loggerMsg
ClientName: Consumer_1_1
Severity: Error
Text: dictionary retrieval failed (timed out after waiting 45000 milliseconds) for
loggerMsgEnd
3) We're using the EMAJ_Config guide examples as our guide but are clearly missing something. Java code is as follows:
import com.thomsonreuters.ema.access.*;
import com.thomsonreuters.ema.rdm.EmaRdm;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Properties;
public class EMATestContributor {
public static void main(String[] args) {
if (args.length < 1) {
System.out.println("Must provide config file name");
return;
}
try {
InputStream input = new FileInputStream(args[0]);
Properties prop = new Properties();
prop.load(input);
String hostAndPort = prop.getProperty("host_port");
String login = prop.getProperty("login");
String password = prop.getProperty("password");
String tunnel_name = prop.getProperty("tunnel_name");
String service_name = prop.getProperty("service_name");
String keystore_file_name = prop.getProperty("keystore_file");
String keystore_file_pwd = prop.getProperty("keystore_pwd");
String dictionaryFilePath = prop.getProperty("dictionary_file");
String enumFilePath = prop.getProperty("enum_file");
//String xmlConfigPath = prop.getProperty("xml_config");
System.out.println("Contributing to TR Contributions Channel");
AppClient appClient = new AppClient(login, password);
System.out.println("Starting encrypted connection...");
// Create an OMM consumer
Map innerMap = EmaFactory.createMap();
Map configMap = EmaFactory.createMap();
ElementList elementList = EmaFactory.createElementList();
ElementList innerElementList = EmaFactory.createElementList();
elementList.add(EmaFactory.createElementEntry().ascii("DefaultConsumer", "Consumer_1"));
innerElementList.add(EmaFactory.createElementEntry().ascii("Channel", "Channel_1"));
innerElementList.add(EmaFactory.createElementEntry().ascii("Dictionary", "Dictionary_1"));
innerMap.add(EmaFactory.createMapEntry().keyAscii( "Consumer_1", MapEntry.MapAction.ADD,
innerElementList));
innerElementList.clear();
elementList.add(EmaFactory.createElementEntry().map( "ConsumerList", innerMap ));
innerMap.clear();
configMap.add(EmaFactory.createMapEntry().keyAscii( "ConsumerGroup", MapEntry.MapAction.ADD,
elementList ));
elementList.clear();
String[] hp = hostAndPort.split(":");
innerElementList.add(EmaFactory.createElementEntry().ascii("ChannelType",
"ChannelType::RSSL_SOCKET"));
innerElementList.add(EmaFactory.createElementEntry().ascii("Host", hp[0]));
innerElementList.add(EmaFactory.createElementEntry().ascii("Port", hp[1]));
innerMap.add(EmaFactory.createMapEntry().keyAscii( "Channel_1", MapEntry.MapAction.ADD,
innerElementList));
innerElementList.clear();
elementList.add(EmaFactory.createElementEntry().map( "ChannelList", innerMap ));
innerMap.clear();
configMap.add(EmaFactory.createMapEntry().keyAscii( "ChannelGroup", MapEntry.MapAction.ADD,
elementList ));
elementList.clear();
innerElementList.add(EmaFactory.createElementEntry().ascii("DictionaryType",
"DictionaryType::FieldDictionary"));
innerElementList.add(EmaFactory.createElementEntry().ascii("RdmFieldDictionaryFileName", dictionaryFilePath));
innerElementList.add(EmaFactory.createElementEntry().ascii("EnumTypeDefFileName", enumFilePath));
innerMap.add(EmaFactory.createMapEntry().keyAscii( "Dictionary_1", MapEntry.MapAction.ADD,
innerElementList));
innerElementList.clear();
elementList.add(EmaFactory.createElementEntry().map( "DictionaryList", innerMap ));
configMap.add(EmaFactory.createMapEntry().keyAscii( "DictionaryGroup", MapEntry.MapAction.ADD,
elementList ));
elementList.clear();
OmmConsumer consumer = EmaFactory.createOmmConsumer(EmaFactory.createOmmConsumerConfig()
.config(configMap)
.tunnelingKeyStoreFile(keystore_file_name)
.tunnelingKeyStorePasswd(keystore_file_pwd)
);
ClassOfService cos = EmaFactory.createClassOfService().
authentication(EmaFactory.createCosAuthentication().type(CosAuthentication.CosAuthenticationType.NOT_REQUIRED))
.dataIntegrity(EmaFactory.createCosDataIntegrity().type(CosDataIntegrity.CosDataIntegrityType.RELIABLE))
.flowControl(EmaFactory.createCosFlowControl().type(CosFlowControl.CosFlowControlType.BIDIRECTIONAL).recvWindowSize(1200))
.guarantee(EmaFactory.createCosGuarantee().type(CosGuarantee.CosGuaranteeType.NONE));
System.out.println("Starting tunnel stream...");
// Create a request for a tunnel stream
TunnelStreamRequest tsr = EmaFactory.createTunnelStreamRequest()
.classOfService(cos)
.domainType(EmaRdm.MMT_SYSTEM)
.name(tunnel_name)
.serviceName(service_name);
// Send the request and register for events from tunnel stream
long tunnelStreamHandle = consumer.registerClient(tsr, appClient);
appClient.setOmmConsumer(consumer);
appClient.setTunnelHandle(tunnelStreamHandle);
Thread.sleep(60000);
} catch (Exception excp) {
System.out.println(excp.getMessage());
}
}
}