@SuppressWarnings("unchecked") public <T> Task<StreamSubscriptionHandle<T>> subscribe(String provider, Class<T> dataClass, String streamId, AsyncObserver<T> observer) { StreamKey streamKey = new StreamKey(provider, dataClass, streamId); ConcurrentMap<Handle, AsyncObserver> observers = observerMap.get(streamKey); if (observers == null) { observers = InternalUtils.putIfAbsentAndGet(observerMap, streamKey, new ConcurrentHashMap<>()); ServerSideStreamProxy serverSideStreamProxy = runtime.getRemoteObserverReference(null, ServerSideStreamProxy.class, "0"); int dataClassId = DefaultClassDictionary.get().getClassId(dataClass); Task<StreamSubscriptionHandle<Object>> subscriptionHandleTask = serverSideStreamProxy.subscribe(provider, dataClassId, streamId, localReference); await(subscriptionHandleTask); } observers = (observers != null) ? observers : InternalUtils.putIfAbsentAndGet(observerMap, streamKey, new ConcurrentHashMap<>()); Handle handle = new Handle(streamKey, nextId.incrementAndGet()); observers.put(handle, observer); return Task.fromValue(handle); }