Introduction
Last Update: November 2022
Refinitiv Real-Time SDK (Java Edition) (RTSDK, formerly known as Elektron SDK) is a suite of modern and open source APIs that aim to simplify development through a strong focus on ease of use and standardized access to a broad set of Refinitiv proprietary content and services via the proprietary TCP connection named RSSL and proprietary binary message encoding format named OMM Message. The capabilities range from low latency/high-performance APIs right through to simple streaming Web APIs.
The SDK has been mavenized to support Apache Maven and Gradle build automation tools since Refinitiv Real-Time SDK (RTSDK) Java (formerly known as Elektron SDK) version 1.2. This supported helps Java developers to build RTSDK Java application, manage its dependencies (Java Developers do not need to manual manage different versions of jar files anymore), and better collaboration in the team.
This example project shows how to create the RTSDK - Java project with a simple Maven configuration. The project also shows how to use Maven with a 3rd-party jar file that is not in the public Maven repository.
The example applications diagram is the following:
IMPORTANT Rebranding Announcement:
Starting with version RTSDK 2.0.0.L1 (same as EMA/ETA 3.6.0.L1), there are namespace changes and library name changes. Please note that all interfaces remain the same as prior releases of RTSDK and Elektron SDK and will remain fully wire compatible. Along with RTSDK 2.X version, a REBRAND.md is published to detail impact to existing applications and how to quickly adapt to the re-branded libraries. Existing applications will continue to work indefinitely as-is. Applications should be proactively rebranded to be able to utilize new features, security updates or fixes post 2.X release. Please see PCN for more details on support.
RTSDK Java with Gradle
RTSDK - Java package comes with Gradle build tool supported by default, please find more detail in RTSDK Java Build System page and RTSDK - Java's README file. You can download the SDK package from Developer Portal website and GitHub repository.
RTSDK Java with Maven
The Refinitiv Real-Time SDK Java is now available in Maven Central Repository. You can define the following dependency in Maven's pom.xml file to let Maven automatically download the EMA Java library and ETA Java library for the application.
Note:
- This article is based on EMA Java version 3.6.1 L1 (RTSDK Java Edition 2.0.1 L1).
Maven Standard Directory Layout
By default, the Maven project uses the following directory layout to standardize the folder structure.
- src/main/java: Application/Library sources
- src/main/resources: Application/Library resources
- src/test/java: Test sources
- src/test/resources: Test resources
- LICENSE.txt: Project's license
- README.txt: Project's readme
The example of the Maven standard directory layout is available in the RTSDK Java default folder layout (the Maven directly layout is mostly identical to Gradle layout).
Please see the full directories layout description on Introduction to the Standard Directory Layout page.
Maven pom.xml setting for EMA Java
The pom.xml file the main Maven's project configuration. This XML file contains the information required to build a project.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.refinitiv.ema</groupId>
<artifactId>RTSDKJ_Maven</artifactId>
<version>1.0</version>
...
</project>
The brief information of each POM file elements are the following:
- project: The top-level element in all Maven pom.xml files.
- groupId: This element indicates the unique identifier of the organization or group that created the project.
- artifactId: This element indicates the unique base name of the primary artifact being generated by this project.
- version: This element indicates the version of the artifact generated by the project.
Please see more detail on the Maven Quick Start page for a full explanation of the POM essentials elements.
ou can specify the following EMA Java application dependencies in the Maven pom.xml file. The EMA Java is the message-level API built on top of the ETA Java (Transport API), the Maven can automatic pull all dependency artifacts within Maven central for the application.
Please notice that I use the Maven variables <rtsdk.version>3.6.1.0</rtsdk.version> to set the library version in a single place in the pom.xml file.
Update Nov 2022:
- For RTSDK version 2.0.7.L1, please specify the RTSDK version as 3.6.7.1 in the pom.xml file.
- For RTSDK version 2.0.7.L2, please specify the RTSDK version as 3.6.7.3 in the pom.xml file.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
...
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<rtsdk.version>3.6.1.0</rtsdk.version>
</properties>
<dependencies>
<!-- RTSDK -->
<!-- For EMA Java Project -->
<dependency>
<groupId>com.refinitiv.ema</groupId>
<artifactId>ema</artifactId>
<version>${rtsdk.version}</version>
</dependency>
</dependencies>
</project>
Maven pom.xml setting for ETA Java
The pom.xml file for the ETA Java application is the following. The Maven can automatic pull ETA, ETA ValueAdd and ETA JSON Converter artifacts within Maven central for the application with the com.refinitiv.eta.valueadd.cache dependency declaration.
Update Nov 2022:
- For RTSDK version 2.0.7.L1, please specify the RTSDK version as 3.6.7.1 in the pom.xml file.
- For RTSDK version 2.0.7.L2, please specify the RTSDK version as 3.6.7.3 in the pom.xml file.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
...
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<rtsdk.version>3.6.1.0</rtsdk.version>
</properties>
<dependencies>
<!-- RTSDK -->
<!-- For ETA Java Project -->
<dependency>
<groupId>com.refinitiv.eta.ansi</groupId>
<artifactId>ansipage</artifactId>
<version>${rtsdk.version}</version>
</dependency>
<dependency>
<groupId>com.refinitiv.eta.valueadd.cache</groupId>
<artifactId>etaValueAddCache</artifactId>
<version>${rtsdk.version}</version>
</dependency>
</dependencies>
</project>
Maven setting for non-Maven Jar File
If the project requires the local jar file that not yet part of the public Maven repository, you can use Maven Install Plugin to install a JAR in the local Maven repository with the following command.
mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> -DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>
This project uses Refinitiv Robust Foundation API (RFA) - Java as an example non-Maven jar file. The DACSConsumer example application consumes real-time data from Refinitiv Real-Time Distribution Server and then uses the DACS Lock API in com.reuters.rfa.dacs package to extract the Permission information such as the service id and the list of PEs from incoming data.
You can install the rfa.jar file to the local Maven repository with the following command
mvn install:install-file -Dfile="C:\rfaj820L2\Libs\rfa.jar" -DgroupId=com.reuters.rfa -DartifactId=rfa -Dversion=8.2.0.2 -Dpackaging=jar -DgeneratePom=true
Then, all Maven projects in the same machine can use RFA Java by declaring the dependency the Maven pom.xml file.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
...
<dependencies>
<!-- rfa -->
<dependency>
<groupId>com.reuters.rfa</groupId>
<artifactId>rfa</artifactId>
<version>8.2.0.2</version>
</dependency>
</dependencies>
</project>
If you are interested to set your internal Maven repository for your team, please refer to Introduction to Repositories guide and How to set up and use a JFrog Artifactory as a local Maven repository page.
Building the project
You can run the Maven mvn package command to compile all applications in the Maven project and build the applications jar file. The class and jar files will be available in the target folder by default.
However, this newly built jar file contains only the application class files, so you need to set the Java classpath to all required RTSDK jar files which store somewhere in your Maven repository folder to run this jar file. To avoid this problem, you can use the Maven Assembly Plugin to build the project and RTSDK library into a single-all-dependencies jar file in the project's target folder.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<archive>
<manifest>
<mainClass>com.refinitiv.ema.consumer.Consumer</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Once you run the Maven mvn package command, Maven will build a single-all-dependencies jar file named RTSDKJ_Maven-1.0-jar-with-dependencies.jar in the target folder.
Please check Running Maven Tools page for more detail about other useful Maven commands.
Demo prerequisite
This example requires the following dependencies software and libraries.
- Oracle/Open JDK 8 or Oracle JDK 11.
- Apache Maven project management and comprehension tool.
- Internet connection.
- Refinitiv Real-Time Data Dictionary files (RDMFieldDictionary and enumtype.def), you can download them from GitHub page.
- Refinitiv Real-Time Distribution System, Refinitiv Data Access Control System (DACS) for the DACSConsumer.java example only.
- Access to the Refinitiv Refinitiv Data Platform and Refinitiv Real-Time - Optimized. (for the CloudConsumer.java example only)
Please contact your Refinitiv's representative to help you to access the Refinitiv Real-Time Distribution System, or RDP account, and services.
Note: The RTSDK Java version 2.0.1 L1 (EMA Java 3.6.1) supports Oracle JDK versions 8, 11, and Open JDK version 8. If you are using other versions of RTSDK Java, please check the SDK's README.md file regarding the supported Java version.
Running the demo applications
If your environment does not have the Maven installed, please follow the Maven installation guide page for more detail. Next, please download the RDMFieldDictionary and enumtype.def files from RTSDK GitHub repository page, then place them in the project etc folder.
Running IProvider and Consumer applications
Firstly, open the project folder in the command prompt and then run the IProvider example with the following command
java -cp .;target/RTSDKJ_Maven-1.0-jar-with-dependencies.jar com.refinitiv.ema.provider.IProvider
Then, open another command prompt to the project folder and run the following command to start the Consumer example (we can use just java -jar command directly as the main class is com.refinitiv.ema.consumer.Consumer)
java -jar ./target/RTSDKJ_Maven-1.0-jar-with-dependencies.jar
IProvider and Consumer applications result
# IProvider example result
Mar 26, 2021 11:55:01 AM com.refinitiv.ema.access.ServerChannelHandler reactorChannelEventCallback
INFO: loggerMsg
ClientName: ServerChannelHandler
Severity: Info
Text: Received ChannelUp event on ClientHandle 1
Instance Name Provider_1_1
Component Version ETA Java Edition|EMA Java Edition
loggerMsgEnd
# Consumer example result
Mar 26, 2021 11:55:02 AM com.refinitiv.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 ETA Java Edition|EMA Java Edition
loggerMsgEnd
Item Name: IBM.N
Service Name: DIRECT_FEED
Item State: Open / Ok / None / 'Refresh Completed'
Fid: 3 Name = DSPLY_NAME DataType: Rmtes Value: IBM.N
Fid: 15 Name = CURRENCY DataType: Enum Value: USD
Fid: 21 Name = HST_CLOSE DataType: Real Value: 39.0
Fid: 22 Name = BID DataType: Real Value: 39.9
Fid: 25 Name = ASK DataType: Real Value: 39.94
Fid: 30 Name = BIDSIZE DataType: Real Value: 9.0
Fid: 31 Name = ASKSIZE DataType: Real Value: 19.0
Item Name: IBM.N
Service Name: DIRECT_FEED
Fid: 22 Name = BID DataType: Real Value: 39.91
Fid: 25 Name = ASK DataType: Real Value: 39.94
Fid: 30 Name = BIDSIZE DataType: Real Value: 10.0
Fid: 31 Name = ASKSIZE DataType: Real Value: 19.0
...
Running DACSConsumer application
Please be informed that your Refinitiv Data Access Control System (DACS), and Real-Time Advanced Distribution server, and DACS user should be ready before running an example. If you are not familiar with the configuration procedures. Please consult your Market Data administrator.
To run the DACS example, open the project folder in the command prompt and then run the DACSConsumer example with the following command
java -cp .;target/RTSDKJ_Maven-1.0-jar-with-dependencies.jar com.refinitiv.ema.dacs_consumer.DACSConsumer
DACSConsumer application result
Mar 26, 2021 1:47:40 PM com.refinitiv.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 ads3.3.2.L1.linux.tis.rrg 64-bit
loggerMsgEnd
Item Name: IBM.N
Service Name: ELEKTRON_DD
Item State: Open / Ok / None / 'All is well'
Fid: 1 Name = PROD_PERM DataType: UInt Value: 62
[3, 8, 66, 98, -64, 0, 0, 0, 0, 0]
PermissionData: 03 08 42 62 c0
PermissionData: ServiceId is 2114
PermissionData: The list of PEs are
62
Running CloudConsumer applications
Please contact your Refinitiv's representative to help you to access the RDP account and services. You can find more detail regarding the Refinitiv Real-Time - Optimized Machine-ID user, and App Key from Getting Start with Refinitiv Data Platform article.
To run the Cloud example, open the project folder in the command prompt and then run the DACSConsumer example with the following command:
java -cp .;target/RTSDKJ_Maven-1.0-jar-with-dependencies.jar com.refinitiv.ema.cloud.CloudConsumer -username <machine-id> -password <password>-clientId <app_key> -keyfile <keystore file> -keypasswd <keystore password> -itemName <Request item name (optional)>
Please refer to Building a keystore file to be used with an HTTPS (or ENCRYPTED) connection type for real-time Java-based APIs article to create your Keystore file which is mandatory.
CloudConsumer application result
Services :
Service :
Provider : aws
Transport : tcp
Endpoint : apac-1-t2.streaming-pricing-api.refinitiv.com
Port : 14002
Data Format : rwf
Location : ap-southeast-1a
Service :
Provider : aws
Transport : tcp
Endpoint : apac-3-t2.streaming-pricing-api.refinitiv.com
Port : 14002
Data Format : rwf
Location : ap-southeast-1a ap-southeast-1b
Service :
Provider : aws
Transport : tcp
Endpoint : apac-2-t2.streaming-pricing-api.refinitiv.com
Port : 14002
Data Format : rwf
Location : ap-southeast-1b
Service :
Provider : aws
Transport : tcp
Endpoint : emea-1-t2.streaming-pricing-api.refinitiv.com
Port : 14002
Data Format : rwf
Location : eu-west-1a
...
Mar 30, 2021 2:01:14 PM com.refinitiv.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 ads3.4.2.L1.linux.tis.rrg 64-bit
loggerMsgEnd
RefreshMsg
streamId="5"
domain="MarketPrice Domain"
solicited
RefreshComplete
state="Open / Ok / None / ''"
itemGroup="01 05"
permissionData="03 01 01 36 3c"
name="/EUR="
nameType="1"
serviceId="257"
serviceName="ELEKTRON_DD"
Payload dataType="FieldList"
FieldList FieldListNum="99" DictionaryId="1"
FieldEntry fid="1" name="PROD_PERM" dataType="UInt" value="363"
FieldEntry fid="2" name="RDNDISPLAY" dataType="UInt" value="153"
FieldEntry fid="3" name="DSPLY_NAME" dataType="Rmtes" value="SANTANDER H/d"
FieldEntry fid="5" name="TIMACT" dataType="Time" value="06:46:00:000:000:000"
FieldEntry fid="11" name="NETCHNG_1" dataType="Real" value="-0.0012"
FieldEntry fid="12" name="HIGH_1" dataType="Real" value="1.1773"
FieldEntry fid="13" name="LOW_1" dataType="Real" value="1.1751"
...
Conclusion
The RTSDK Java is now available in Maven central repository which makes Java developers can implement the Real-Time application with the build automation tools such as Apache Maven, Gradle, or even the dependency manager tool like Apache Ivy. This will helps Java developers reduce the complexity of maintaining jar file dependencies, easily share the development environment among peers, and support various build processes that match developers' workflow.
If the application requires a 3rd Party or customized jar file which is not available in the public Maven central repository, the application can add those jar files to the local repository and use Maven to build and manage it along with other dependencies jar files.
References
For further details, please check out the following resources:
- Refinitiv Real-Time SDK Java page on the Refinitiv Developer Community website.
- Refinitiv Real-Time SDK Family page.
- Enterprise Message API Java Quick Start
- Developer Webinar: Introduction to Enterprise App Creation With Open-Source Enterprise Message API
- Developer Article: 10 important things you need to know before you write an Enterprise Real Time application
- Apache Maven Project page
- Maven Getting Started Guide
- Maven in 5 Minutes
- Maven Central Repository Search
- Building a keystore file to be used with an HTTPS (or ENCRYPTED) connection type for real-time Java-based APIs article.
For any question related to this article or RTSDK page, please use the Developer Community Q&A Forum.