Migrating legacy SFC (RTMDS v3) Java client to EMA

dgoloughlin
dgoloughlin Newcomer
edited September 12 in EMA

Hi all,

I’m moving an ancient Java app from the SFC API to EMA Java. The local RTMDS v3 host listens on 8101, 14002, and 24002. I was told I can reuse the same DACS user with EMA.

Connecting EMA to 8101 gives:

ChannelDownReconnecting ... Error initializing channel

Connecting EMA to 14002 or 24002 results in connection refused.

What might be the problem? Which port should EMA use in this setup?

(Example trace, user masked)

19:58:13.486 [main] TRACE com.refinitiv.ema.access.OmmConsumerImpl - loggerMsg
    ClientName: LoginCallbackClient
    Severity: Trace
    Text:    RDMLogin request message was populated with this info: 
  LoginRequest: 
  streamId: 1
  userName: ********************
  streaming: true
  nameType: 1
  applicationId: 256
  applicationName: ema
  position: 192.168.68.105/97VC9K3


19:58:13.692 [main] TRACE com.refinitiv.ema.access.OmmConsumerImpl - loggerMsg
    ClientName: ChannelCallbackClient
    Severity: Trace
    Text:    Attempt to connect using 
  1] SOCKET
  Channel name Channel_APAC_1
  Instance Name Consumer_APAC_1_1
  RsslReactor @67427b69
  InterfaceName 
  hostName 146.242.129.225
  port 8101
  CompressionType None
  tcpNodelay true
  reconnectAttemptLimit -1
  reconnectMinDelay 1000 msec
  reconnectMaxDelay 5000 msec
  guaranteedOutputBuffers 5000
  numInputBuffers 10
  sysRecvBufSize 65535
  sysSendBufSize 65535
  connectionPingTimeout 30000 msec
  initializationTimeout 5 sec

19:58:13.822 [main] TRACE com.refinitiv.ema.access.OmmConsumerImpl - loggerMsg
    ClientName: ChannelCallbackClient
    Severity: Trace
    Text:    Received ChannelOpened on channel Channel_APAC_1
  Instance Name Consumer_APAC_1_1

19:58:13.824 [main] TRACE com.refinitiv.ema.access.OmmConsumerImpl - loggerMsg
    ClientName: ChannelCallbackClient
    Severity: Trace
    Text:    Successfully created a Reactor and Channel(s)
   Channel name(s) Channel_APAC_1
  Instance Name Consumer_APAC_1_1

 19:58:14.204 [main] WARN  com.refinitiv.ema.access.OmmConsumerImpl - loggerMsg
    ClientName: ChannelCallbackClient
    Severity: Warning
    Text:    Received ChannelDownReconnecting event on channel Channel_APAC_1
  RsslReactor @67427b69
  RsslChannel @49a64d82
  Error Id 0
  Internal sysError 0
  Error Location Reactor.processWorkerEvent
  Error text Error initializing channel: errorId=-1 text=Error occurred during connection process.

Best Answers

  • Jirapongse
    Jirapongse ✭✭✭✭✭
    Answer ✓

    @dgoloughlin

    It must be the service name that is in the source directory.

    You may check the ADS log for disconnection. Otherwise, the firewall may cut the connection; please check this with the IT support team.

    To investigate this issue, please enable the debug log and XML trace log in the EMA Java.

    For instructions on how to enable these logs, refer to the article: Enterprise Message API (EMA) - Configuration Overview.

  • dgoloughlin
    dgoloughlin Newcomer
    Answer ✓

    Thankyou both. The problem as @Jirapongse suggested was that the firewall permitted login requests but was blocking streaming data. I get price data back now.

Answers

  • Hello @dgoloughlin

    The EMA API can connect to the OMM Provider (RTDS, ADS, etc) via the RSSL connection (default port is 14002) only. It cannot connect to the SSL connection (port 8101).

    Did your server enable RSSL connection yet?

    According to this log, it shows that you have set the API to connect to the server via port 8101

      Text:    Attempt to connect using 
      1] SOCKET
      Channel name Channel_APAC_1
      Instance Name Consumer_APAC_1_1
      RsslReactor @67427b69
      InterfaceName
      hostName 146.242.129.225
      port 8101

    Could you please share a snippet code and your EmaConfig.xml 's Consumer and Channel configurations?

    Please also give use more detail about your application:

    • EMA Java version
    • Java version
    • OS
    • What is the server?
  • dgoloughlin
    dgoloughlin Newcomer
    edited September 16

    Thanks Wasin.

    To answer your questions from before:

    • EMA Java version - 3.6.7.3 (Maven)
    • Java version - 17
    • OS - Both Linux and Windows
    • What is the server? ads3.7.0.L1.linux.rrg 64-bit

    Turns out that port 14002 was firewalled; I can now connect fine, and log in successfully.

    However, as soon as I subscribe to a RIC, the channel immediately goes down and starts reconnecting.

    Key events from the log:
    - Channel opened successfully on ALC_Primary.
    - Login refresh received and accepted by host (Login accepted by host ...).
    - Directory refresh received, state open/ok.
    - OmmConsumer created successfully.
    - Subscribed to RIC: AUCASH=RBAA on service hEDD.
    - Immediately after subscription, the status message shows: Received ChannelDownReconnecting event on channel ALC_PrimaryError text: Connection reset

    We’re currently using "hEDD" as the service name in the request. This works in our SFC client, and we were told it should also work with the EMA API.

    Is hEDD actually a valid service name for EMA subscriptions, or should we be using one of the service names returned in the source directory?

    Here's my test client:

    package com.yieldbroker.ema;
    
    import com.refinitiv.ema.access.AckMsg;
    import com.refinitiv.ema.access.EmaFactory;
    import com.refinitiv.ema.access.GenericMsg;
    import com.refinitiv.ema.access.Msg;
    import com.refinitiv.ema.access.OmmConsumer;
    import com.refinitiv.ema.access.OmmConsumerClient;
    import com.refinitiv.ema.access.OmmConsumerConfig;
    import com.refinitiv.ema.access.OmmConsumerEvent;
    import com.refinitiv.ema.access.RefreshMsg;
    import com.refinitiv.ema.access.StatusMsg;
    import com.refinitiv.ema.access.UpdateMsg;
    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.concurrent.atomic.AtomicBoolean;
    
    public class EmaClient implements AutoCloseable {
    
        private static final Logger LOG = LogManager.getLogger(EmaClient.class);
    
        // Default values
        private static final String DEFAULT_CONFIG_PATH = "etc/EmaConfig.xml";
        private static final String DEFAULT_CONSUMER_NAME = "PriceConsumer";
        private static final String DEFAULT_USERNAME = "<Replace Me>";
        private static final String DEFAULT_SERVICE_NAME = "hEDD";
        private static final List<String> DEFAULT_RICS = List.of("AUCASH=RBAA");
    
        private final String consumerConfigPath;
        private final String consumerName;
        private final String username;
        private final List<String> rics;
        private final String serviceName;
    
        private final AtomicBoolean started = new AtomicBoolean(false);
        private final List<Long> itemHandles = new ArrayList<>();
        private volatile OmmConsumer consumer;
    
        public EmaClient(String consumerConfigPath, String consumerName, String username, List<String> rics, String serviceName) {
            this.consumerConfigPath = consumerConfigPath;
            this.consumerName = consumerName;
            this.username = username;
            this.rics = rics;
            this.serviceName = serviceName;
        }
    
        public static void main(String[] args) throws InterruptedException {
            String configPath = args.length > 0 ? args[0] : DEFAULT_CONFIG_PATH;
            String consumerName = args.length > 1 ? args[1] : DEFAULT_CONSUMER_NAME;
            String username = args.length > 2 ? args[2] : DEFAULT_USERNAME;
            List<String> rics = args.length > 3 ? List.of(args[3].split(",")) : DEFAULT_RICS;
            String serviceName = args.length > 4 ? args[4] : DEFAULT_SERVICE_NAME;
    
            LOG.info("Using configPath={}, consumerName={}, username={}, serviceName={}, RICs={}",
                    configPath, consumerName, username, serviceName, rics);
    
            EmaClient client = new EmaClient(configPath, consumerName, username, rics, serviceName);
            client.start();
    
            // Keep the client running to receive messages
            Thread.sleep(10_000);
    
            client.close();
        }
    
        public synchronized void start() {
            if (!started.compareAndSet(false, true)) {
                return;
            }
    
            LOG.info("Starting EMA client...");
    
            try {
                OmmConsumerConfig cfg = EmaFactory.createOmmConsumerConfig(consumerConfigPath)
                        .consumerName(consumerName)
                        .username(username)
                        .operationModel(OmmConsumerConfig.OperationModel.API_DISPATCH);
    
                consumer = EmaFactory.createOmmConsumer(cfg, new LoggingClient());
                LOG.info("OmmConsumer created successfully");
    
                // Subscribe to the RICs
                for (String ric : rics) {
                    long handle = consumer.registerClient(
                            EmaFactory.createReqMsg().name(ric).serviceName(serviceName),
                            new LoggingClient(),
                            null
                    );
                    itemHandles.add(handle);
                    LOG.info("Subscribed to RIC: {} on service: {}", ric, serviceName);
                }
            } catch (Exception e) {
                LOG.error("Failed to create OmmConsumer or subscribe", e);
            }
        }
    
        @Override
        public synchronized void close() {
            if (!started.getAndSet(false)) {
                return;
            }
    
            LOG.info("Closing EMA client...");
    
            try {
                if (consumer != null) {
                    for (Long handle : itemHandles) {
                        consumer.unregister(handle);
                    }
                    itemHandles.clear();
                    LOG.info("All RIC subscriptions unregistered");
    
                    consumer.uninitialize();
                }
            } catch (Exception e) {
                LOG.warn("Error during close", e);
            }
    
            consumer = null;
            LOG.info("EMA client closed.");
        }
    
        private static class LoggingClient implements OmmConsumerClient {
    
            @Override
            public void onRefreshMsg(RefreshMsg refreshMsg, OmmConsumerEvent event) {
                LOG.info("REFRESH Msg - Domain: {}, StreamState: {}, DataState: {}, Text: {}, Msg: {}",
                        refreshMsg.domainType(),
                        refreshMsg.state().streamStateAsString(),
                        refreshMsg.state().dataStateAsString(),
                        refreshMsg.state().statusText(),
                        refreshMsg);
            }
    
            @Override
            public void onUpdateMsg(UpdateMsg updateMsg, OmmConsumerEvent event) {
                LOG.info("UPDATE Msg - Domain: {}, Msg: {}", updateMsg.domainType(), updateMsg);
            }
    
            @Override
            public void onStatusMsg(StatusMsg statusMsg, OmmConsumerEvent event) {
                LOG.info("STATUS Msg - Domain: {}, StreamState: {}, DataState: {}, Text: {}, Msg: {}",
                        statusMsg.domainType(),
                        statusMsg.hasState() ? statusMsg.state().streamStateAsString() : "N/A",
                        statusMsg.hasState() ? statusMsg.state().dataStateAsString() : "N/A",
                        statusMsg.hasState() ? statusMsg.state().statusText() : "N/A",
                        statusMsg);
            }
    
            @Override
            public void onGenericMsg(GenericMsg genericMsg, OmmConsumerEvent event) {
                LOG.info("GENERIC Msg - Domain: {}, Msg: {}", genericMsg.domainType(), genericMsg);
            }
    
            @Override
            public void onAckMsg(AckMsg ackMsg, OmmConsumerEvent event) {
                LOG.info("ACK Msg - Domain: {}, Msg: {}", ackMsg.domainType(), ackMsg);
            }
    
            @Override
            public void onAllMsg(Msg msg, OmmConsumerEvent event) {
                LOG.debug("ALL Msg - Class: {}, Domain: {}, Msg: {}", msg.getClass().getSimpleName(), msg.domainType(), msg);
            }
        }
    }
     
    
  • There's a dictionary entry for hEDD in the directory listing so my guess is that this isn't the problem:

    <mapEntry flags="0x00" action="ADD" key="425" >
    <filterList containerType="ELEMENT_LIST" countHint="0" flags="0x00">
    <filterEntry id="1" action="SET" flags="0x00" containerType="ELEMENT_LIST">
    <elementList flags="0x08 (HAS_STANDARD_DATA)">
    <elementEntry name="Name" dataType="ASCII_STRING" data="hEDD"/>
    <elementEntry name="SupportsQoSRange" dataType="UINT" data="0"/>
    <elementEntry name="QoS" dataType="ARRAY">
    <array itemLength="0" primitiveType="QOS">
    <arrayEntry Qos: Realtime/TickByTick/Static - timeInfo: 0 - rateInfo: 0/>
    </array>
    </elementEntry>
    <elementEntry name="Capabilities" dataType="ARRAY">
    <array itemLength="1" primitiveType="UINT">
    <arrayEntry data="5"/>
    <arrayEntry data="6"/>
    <arrayEntry data="7"/>
    <arrayEntry data="8"/>
    <arrayEntry data="9"/>
    <arrayEntry data="10"/>
    <arrayEntry data="11"/>
    <arrayEntry data="13"/>
    <arrayEntry data="14"/>
    <arrayEntry data="18"/>
    <arrayEntry data="19"/>
    <arrayEntry data="20"/>
    <arrayEntry data="21"/>
    <arrayEntry data="23"/>
    <arrayEntry data="24"/>
    <arrayEntry data="25"/>
    <arrayEntry data="26"/>
    <arrayEntry data="28"/>
    <arrayEntry data="29"/>
    <arrayEntry data="33"/>
    <arrayEntry data="34"/>
    <arrayEntry data="35"/>
    <arrayEntry data="126"/>
    </array>
    </elementEntry>
    <elementEntry name="DictionariesProvided" dataType="ARRAY">
    <array itemLength="0" primitiveType="ASCII_STRING">
    <arrayEntry data="RWFFld"/>
    <arrayEntry data="RWFEnum"/>
    </array>
    </elementEntry>
    <elementEntry name="DictionariesUsed" dataType="ARRAY">
    <array itemLength="0" primitiveType="ASCII_STRING">
    <arrayEntry data="RWFFld"/>
    <arrayEntry data="RWFEnum"/>
    </array>
    </elementEntry>
    <elementEntry name="Vendor" dataType="ASCII_STRING" data="Thomson Reuters"/>
    <elementEntry name="AcceptingConsumerStatus" dataType="UINT" data="1"/>
    </elementList>
    </filterEntry>
    <filterEntry id="2" action="SET" flags="0x00" containerType="ELEMENT_LIST">
    <elementList flags="0x08 (HAS_STANDARD_DATA)">
    <elementEntry name="ServiceState" dataType="UINT" data="1"/>
    <elementEntry name="AcceptingRequests" dataType="UINT" data="1"/>
    </elementList>
    </filterEntry>
    <filterEntry id="4" action="SET" flags="0x00" containerType="ELEMENT_LIST">
    <elementList flags="0x08 (HAS_STANDARD_DATA)">
    <elementEntry name="OpenLimit" dataType="UINT" data="2500"/>
    </elementList>
    </filterEntry>
    </filterList>
    </mapEntry>
    

    Here's are the trace logs just before and after the subscription request, am I doing something stupid? I'll ask the network guys tomorrow if the firewall is blocking packets.

    <!-- Outgoing Reactor message -->
    <!-- java.nio.channels.SocketChannel[connected local=/10.95.210.54:60847 remote=/xxx.xxx.xxx.x:14002] -->
    <!-- Tue Sep 16 18:47:44 AEST 2025 -->
     
    <!-- rwfMajorVer="14" rwfMinorVer="1" -->
    <REQUEST domainType="MARKET_PRICE" streamId="3" containerType="NO_DATA" flags="0x46 (HAS_PRIORITY|STREAMING|HAS_QOS)" Qos: Realtime/TickByTick/Static - timeInfo: 0 - rateInfo: 0 priorityClass="1" priorityCount="1" dataSize="0">
    <key flags="0x03 (HAS_SERVICE_ID|HAS_NAME)" serviceId="425" name="AUCASH=RBAA"/>
    <dataBody>
    </dataBody>
    </REQUEST>
     
    18:47:44.599 [main] INFO  com.yieldbroker.ema.EmaClient - Subscribed to RIC: AUCASH=RBAA on service: hEDD
    18:47:44.611 [pool-3-thread-1] WARN  com.refinitiv.ema.access.OmmConsumerImpl - loggerMsg
        ClientName: ChannelCallbackClient
        Severity: Warning
        Text:    Received ChannelDownReconnecting event on channel ALC_Primary
    	RsslReactor @3bffddff
    	RsslChannel @7609ccd2
    	Error Id 0
    	Internal sysError 0
    	Error Location null
    	Error text Connection reset
    loggerMsgEnd
    

    BTW here's my EMA config file, I forgot to post this before:

    <EmaConfig>
        <ConsumerGroup>
            <DefaultConsumer value="PriceConsumer"/>
            <ConsumerList>
                <Consumer>
                    <Name value="PriceConsumer"/>
                    <Channel value="ALC_Primary"/>
                    <Dictionary value="Dictionary_1"/>
                    <XmlTraceToStdout value="1"/>
                </Consumer>
            </ConsumerList>
        </ConsumerGroup>
    
        <ChannelGroup>
            <ChannelList>
                <Channel>
                    <Name value="ALC_Primary"/>
                    <ChannelType value="ChannelType::RSSL_SOCKET"/>
                    <Host value="***.***.***.***"/>
                    <Port value="14002"/>
                </Channel>
                <Channel>
                    <Name value="ALC_Secondary"/>
                    <ChannelType value="ChannelType::RSSL_SOCKET"/>
                    <Host value="***.***.***.***"/>
                    <Port value="14002"/>
                </Channel>
                <Channel>
                    <Name value="IPSec_Japan_1"/>
                    <ChannelType value="ChannelType::RSSL_SOCKET"/>
                    <Host value="***.***.***.***"/>
                    <Port value="14002"/>
                </Channel>
                <Channel>
                    <Name value="IPSec_Japan_2"/>
                    <ChannelType value="ChannelType::RSSL_SOCKET"/>
                    <Host value="***.***.***.***"/>
                    <Port value="14002"/>
                </Channel>
            </ChannelList>
        </ChannelGroup>
    
        <DictionaryGroup>
            <DictionaryList>
                <Dictionary>
                    <Name value="Dictionary_1"/>
                    <DictionaryType value="DictionaryType::FileDictionary"/>
                    <RdmFieldDictionaryFileName value="./etc/RDMFieldDictionary"/>
                    <EnumTypeDefFileName value="./etc/enumtype.def"/>
                </Dictionary>
            </DictionaryList>
        </DictionaryGroup>
    
        <!--    <DictionaryGroup>-->
        <!--        <DictionaryList>-->
        <!--            <Dictionary>-->
        <!--                <Name value="Dictionary_1"/>-->
        <!--                <DictionaryType value="DictionaryType::RDM_FIELD_DICTIONARY"/>-->
        <!--                &lt;!&ndash; No local file paths, EMA will fetch from provider &ndash;&gt;-->
        <!--            </Dictionary>-->
        <!--        </DictionaryList>-->
        <!--    </DictionaryGroup>-->
    </EmaConfig>
    
    
  • I'm getting an entry for hEDD in the directory listing so my guess is that the service name isn't the problem:

    <mapEntry flags="0x00" action="ADD" key="425" >
    <filterList containerType="ELEMENT_LIST" countHint="0" flags="0x00">
    <filterEntry id="1" action="SET" flags="0x00" containerType="ELEMENT_LIST">
    <elementList flags="0x08 (HAS_STANDARD_DATA)">
    <elementEntry name="Name" dataType="ASCII_STRING" data="hEDD"/>
    <elementEntry name="SupportsQoSRange" dataType="UINT" data="0"/>
    <elementEntry name="QoS" dataType="ARRAY">
    <array itemLength="0" primitiveType="QOS">
    <arrayEntry Qos: Realtime/TickByTick/Static - timeInfo: 0 - rateInfo: 0/>
    </array>
    </elementEntry>
    <elementEntry name="Capabilities" dataType="ARRAY">
    <array itemLength="1" primitiveType="UINT">
    <arrayEntry data="5"/>
    <arrayEntry data="6"/>
    <arrayEntry data="7"/>
    <arrayEntry data="8"/>
    <arrayEntry data="9"/>
    <arrayEntry data="10"/>
    <arrayEntry data="11"/>
    <arrayEntry data="13"/>
    <arrayEntry data="14"/>
    <arrayEntry data="18"/>
    <arrayEntry data="19"/>
    <arrayEntry data="20"/>
    <arrayEntry data="21"/>
    <arrayEntry data="23"/>
    <arrayEntry data="24"/>
    <arrayEntry data="25"/>
    <arrayEntry data="26"/>
    <arrayEntry data="28"/>
    <arrayEntry data="29"/>
    <arrayEntry data="33"/>
    <arrayEntry data="34"/>
    <arrayEntry data="35"/>
    <arrayEntry data="126"/>
    </array>
    </elementEntry>
    <elementEntry name="DictionariesProvided" dataType="ARRAY">
    <array itemLength="0" primitiveType="ASCII_STRING">
    <arrayEntry data="RWFFld"/>
    <arrayEntry data="RWFEnum"/>
    </array>
    </elementEntry>
    <elementEntry name="DictionariesUsed" dataType="ARRAY">
    <array itemLength="0" primitiveType="ASCII_STRING">
    <arrayEntry data="RWFFld"/>
    <arrayEntry data="RWFEnum"/>
    </array>
    </elementEntry>
    <elementEntry name="Vendor" dataType="ASCII_STRING" data="Thomson Reuters"/>
    <elementEntry name="AcceptingConsumerStatus" dataType="UINT" data="1"/>
    </elementList>
    </filterEntry>
    <filterEntry id="2" action="SET" flags="0x00" containerType="ELEMENT_LIST">
    <elementList flags="0x08 (HAS_STANDARD_DATA)">
    <elementEntry name="ServiceState" dataType="UINT" data="1"/>
    <elementEntry name="AcceptingRequests" dataType="UINT" data="1"/>
    </elementList>
    </filterEntry>
    <filterEntry id="4" action="SET" flags="0x00" containerType="ELEMENT_LIST">
    <elementList flags="0x08 (HAS_STANDARD_DATA)">
    <elementEntry name="OpenLimit" dataType="UINT" data="2500"/>
    </elementList>
    </filterEntry>
    </filterList>
    </mapEntry>
    

    Here are the relevant trace logs around the time of the disconnection, am I doing something stupid? I see the same behaviour regardless of the RIC:

    <!-- Outgoing Reactor message -->
    <!-- java.nio.channels.SocketChannel[connected local=/10.95.210.54:60847 remote=/xxx.xxx.xxx.x:14002] -->
    <!-- Tue Sep 16 18:47:44 AEST 2025 -->
     
    <!-- rwfMajorVer="14" rwfMinorVer="1" -->
    <REQUEST domainType="MARKET_PRICE" streamId="3" containerType="NO_DATA" flags="0x46 (HAS_PRIORITY|STREAMING|HAS_QOS)" Qos: Realtime/TickByTick/Static - timeInfo: 0 - rateInfo: 0 priorityClass="1" priorityCount="1" dataSize="0">
    <key flags="0x03 (HAS_SERVICE_ID|HAS_NAME)" serviceId="425" name="AUCASH=RBAA"/>
    <dataBody>
    </dataBody>
    </REQUEST>
     
    18:47:44.599 [main] INFO  com.yieldbroker.ema.EmaClient - Subscribed to RIC: AUCASH=RBAA on service: hEDD
    18:47:44.611 [pool-3-thread-1] WARN  com.refinitiv.ema.access.OmmConsumerImpl - loggerMsg
        ClientName: ChannelCallbackClient
        Severity: Warning
        Text:    Received ChannelDownReconnecting event on channel ALC_Primary
    	RsslReactor @3bffddff
    	RsslChannel @7609ccd2
    	Error Id 0
    	Internal sysError 0
    	Error Location null
    	Error text Connection reset
    loggerMsgEnd
    

    BTW, here's my EMA config, I forgot to post this before:

    <EmaConfig>
        <ConsumerGroup>
            <DefaultConsumer value="PriceConsumer"/>
            <ConsumerList>
                <Consumer>
                    <Name value="PriceConsumer"/>
                    <Channel value="ALC_Primary"/>
                    <Dictionary value="Dictionary_1"/>
                    <XmlTraceToStdout value="1"/>
                </Consumer>
            </ConsumerList>
        </ConsumerGroup>
    
        <ChannelGroup>
            <ChannelList>
                <Channel>
                    <Name value="ALC_Primary"/>
                    <ChannelType value="ChannelType::RSSL_SOCKET"/>
                    <Host value="***.***.***.***"/>
                    <Port value="14002"/>
                </Channel>
                <Channel>
                    <Name value="ALC_Secondary"/>
                    <ChannelType value="ChannelType::RSSL_SOCKET"/>
                    <Host value="***.***.***.***"/>
                    <Port value="14002"/>
                </Channel>
                <Channel>
                    <Name value="IPSec_Japan_1"/>
                    <ChannelType value="ChannelType::RSSL_SOCKET"/>
                    <Host value="***.***.***.***"/>
                    <Port value="14002"/>
                </Channel>
                <Channel>
                    <Name value="IPSec_Japan_2"/>
                    <ChannelType value="ChannelType::RSSL_SOCKET"/>
                    <Host value="***.***.***.***"/>
                    <Port value="14002"/>
                </Channel>
            </ChannelList>
        </ChannelGroup>
    
        <DictionaryGroup>
            <DictionaryList>
                <Dictionary>
                    <Name value="Dictionary_1"/>
                    <DictionaryType value="DictionaryType::FileDictionary"/>
                    <RdmFieldDictionaryFileName value="./etc/RDMFieldDictionary"/>
                    <EnumTypeDefFileName value="./etc/enumtype.def"/>
                </Dictionary>
            </DictionaryList>
        </DictionaryGroup>
    
        <!--    <DictionaryGroup>-->
        <!--        <DictionaryList>-->
        <!--            <Dictionary>-->
        <!--                <Name value="Dictionary_1"/>-->
        <!--                <DictionaryType value="DictionaryType::RDM_FIELD_DICTIONARY"/>-->
        <!--                &lt;!&ndash; No local file paths, EMA will fetch from provider &ndash;&gt;-->
        <!--            </Dictionary>-->
        <!--        </DictionaryList>-->
        <!--    </DictionaryGroup>-->
    </EmaConfig>
    
    
  • Hello @dgoloughlin

    I have tested your code in my environment. It can connect to my local ADS (service name ELEKTRON_DD and item EUR=). It works fine on my end, so I strongly suggest you follow my colleague @Jirapongse comment above.

    ema_code.png

    Additionally, I see that you are using the Log4J2 library. Please be informed that the EMA API uses the SLF4J as a facade for logging utility and bind it to the Java Logging API (slf4j-jdk14) as a default logger. You may need to configure your Maven pom.xml to bind the SLF4J with the Log4J2. Please find more detail on this https://developers.lseg.com/en/article-catalog/article/how-integrate-elektron-message-api-java-log4j-logging-framework-using-maven article.

  • I'm seeing an entry for hEDD in the directory list result so my guess is that this isn't the problem.

    Here are the trace logs just after the subscription request am I doing something stupid?

    <!-- Outgoing Reactor message -->
    <!-- java.nio.channels.SocketChannel[connected local=/10.95.210.54:60847 remote=/xxx.xxx.xxx.xxx:14002] -->
    <!-- Tue Sep 16 18:47:44 AEST 2025 -->
     
    <!-- rwfMajorVer="14" rwfMinorVer="1" -->
    <REQUEST domainType="MARKET_PRICE" streamId="3" containerType="NO_DATA" flags="0x46 (HAS_PRIORITY|STREAMING|HAS_QOS)" Qos: Realtime/TickByTick/Static - timeInfo: 0 - rateInfo: 0 priorityClass="1" priorityCount="1" dataSize="0">
    <key flags="0x03 (HAS_SERVICE_ID|HAS_NAME)" serviceId="425" name="AUCASH=RBAA"/>
    <dataBody>
    </dataBody>
    </REQUEST>
     
    18:47:44.599 [main] INFO  com.yieldbroker.ema.EmaClient - Subscribed to RIC: AUCASH=RBAA on service: hEDD
    18:47:44.611 [pool-3-thread-1] WARN  com.refinitiv.ema.access.OmmConsumerImpl - loggerMsg
        ClientName: ChannelCallbackClient
        Severity: Warning
        Text:    Received ChannelDownReconnecting event on channel ALC_Primary
    	RsslReactor @3bffddff
    	RsslChannel @7609ccd2
    	Error Id 0
    	Internal sysError 0
    	Error Location null
    	Error text Connection reset
    loggerMsgEnd
     
     
    18:47:44.611 [pool-3-thread-1] DEBUG com.yieldbroker.ema.EmaClient - ALL Msg - Class: StatusMsgImpl, Domain: 1, Msg: StatusMsg
        streamId="1"
        domain="Login Domain"
        state="Open / Suspect / None / 'channel down'"
        name="xxxxxxxxxxxxxxxxxx"
        nameType="1"
    StatusMsgEnd