package ru.semiot.services.tsdbservice.wamp;
import static ru.semiot.services.tsdbservice.ServiceConfig.CONFIG;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import rx.Observable;
import rx.Subscription;
import ws.wamp.jawampa.SubscriptionFlags;
import ws.wamp.jawampa.WampClient;
import ws.wamp.jawampa.WampClientBuilder;
import ws.wamp.jawampa.auth.client.Ticket;
import java.io.Closeable;
import java.io.IOException;
import java.util.HashMap;
import java.util.concurrent.TimeUnit;
public class WAMPClient implements Closeable, AutoCloseable {
private static final Logger logger = LoggerFactory
.getLogger(WAMPClient.class);
private static final WAMPClient INSTANCE = new WAMPClient();
private final HashMap<String, Subscription> subscriptions = new HashMap<>();
private WampClient client;
private WAMPClient() {}
public static WAMPClient getInstance() {
return INSTANCE;
}
public Observable<WampClient.State> init() throws Exception {
WampClientBuilder builder = new WampClientBuilder();
builder.withUri(CONFIG.wampUri()).withRealm(CONFIG.wampRealm())
.withInfiniteReconnects()
.withReconnectInterval(CONFIG.wampReconnectInterval(), TimeUnit.SECONDS)
.withConnectorProvider(new PlainWampClientConnectorProvider())
.withAuthId(CONFIG.wampLogin())
.withAuthMethod(new Ticket(CONFIG.wampPassword()));
client = builder.build();
client.open();
return client.statusChanged();
}
public Observable<Long> publish(String topic, String message) {
return client.publish(topic, message);
}
public Observable<String> subscribe(String topic) {
logger.info("Subscribed to {} topic", topic);
return client.makeSubscription(topic, String.class);
}
public Observable<String> subscribe(String topic, SubscriptionFlags flag) {
logger.info("Subscribed to {} topic", topic);
return client.makeSubscription(topic, flag, String.class);
}
@Override
public void close() throws IOException {
if (client != null) {
client.close();
}
}
public void addSubscription(String key, Subscription value) {
subscriptions.put(key, value);
}
public void unsubscribe(String key) {
Subscription subscription = subscriptions.get(key);
if (subscription != null) {
subscription.unsubscribe();
subscriptions.remove(key);
}
}
}