RTDS Java Library

Java library for using the Airship Real-Time Data Streaming API.



Maven Installation

You can add the library using Maven by adding the following lines to your pom.xml:

<!-- Airship Library Dependency-->
    <!-- Replace VERSION with the version you want to use -->


The client library provides all the components you need to consume a mobile event stream.

Note that Connect requests with this client may experience SSL handshake failures unless using the Java Cryptography Extension (JCE) Unlimited Strength package cipher suite.

If you encounter a generic connection failure java.lang.RuntimeException, the max strength encryption policy might be the culprit, and you should ensure this JCE Unlimited Strength package is installed on your system.

You can find the JCE Unlimited Strength package at the following locations. Choose the one that corresponds to your JRE version.

These files are not required for JRE 9 or for JRE 8u151 or newer.

Getting Started

Setting up the Stream

Example stream configuration

  Creds creds = Creds.newBuilder()

  StreamQueryDescriptor descriptor = StreamQueryDescriptor.newBuilder()

To set up the stream to get ready for consumption first you set the Creds then create a StreamQueryDescriptor and use the descriptor to create a Stream.

Consume the Stream

Example stream that disconnects after 60 seconds.

  final Stream stream = new Stream(descriptor, Optional.<StartPosition>absent());

  final ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);

  Runnable stopConsuming = new Runnable() {
      public void run() {
          try {
          } catch (Exception e) {
          } finally {

  scheduledExecutorService.schedule(stopConsuming, 60, TimeUnit.SECONDS);

  while (stream.hasNext()) {
      String event = stream.next();
      System.out.println("Event: " + event);

After the steam is configured the stream can be consumed.


Various filter and stream customization example.

  Optional<StartPosition> startPosition = Optional.fromNullable(StartPosition.relative(StartPosition.RelativePosition.EARLIEST));

  DeviceFilter device1 = new DeviceFilter(DeviceFilterType.ANDROID_CHANNEL, "152d00c3-c49c-4172-88ce-539c511cf346");
  DeviceFilter device2 = new DeviceFilter(DeviceFilterType.IOS_CHANNEL, "67fa2bad-9e83-4259-b925-bc08c184f72e");
  DeviceFilter device3 = new DeviceFilter(DeviceFilterType.NAMED_USER_ID, "cool_user");

  NotificationFilter notification = new NotificationFilter(NotificationFilter.Type.GROUP_ID, "58179035-dd1f-4b04-b023-5035c6335786");

  Filter filter = Filter.newBuilder()
          .addDevices(device1, device2, device3)
          .addDeviceTypes(DeviceType.ANDROID, DeviceType.IOS)

  Subset subset = Subset.createSampleSubset(0.3f);

  StreamQueryDescriptor descriptor = StreamQueryDescriptor.newBuilder()

  final Stream stream = new Stream(descriptor, startPosition);

Filter, Subset, and DeviceFilter can also be applied to a stream to retrieve whatever information that is wanted.