public Subscription<T> subscribe(T object, final SubscriptionListener<T, Message> handler) throws SDKException {
checkArgument(object != null, "object can't be null");
checkArgument(handler != null, "handler can't be null");
ensureConnection();
final ClientSessionChannel channel = getChannel(object);
final MessageListenerAdapter listener = new MessageListenerAdapter(handler, channel, object);
final ClientSessionChannel metaSubscribeChannel = session.getChannel(ClientSessionChannel.META_SUBSCRIBE);
metaSubscribeChannel.addListener(new SubscriptionSuccessListener(new SubscriptionRecord(object, handler) , listener, metaSubscribeChannel, channel));
channel.subscribe(listener);
return listener.getSubscription();
}