package ru.semiot.services.analyzing.wamp;
import static ru.semiot.services.analyzing.ServiceConfig.config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import rx.Observable;
import ws.wamp.jawampa.WampClient;
import ws.wamp.jawampa.WampClientBuilder;
import ws.wamp.jawampa.auth.client.Ticket;
import ws.wamp.jawampa.transport.netty.NettyWampClientConnectorProvider;
import java.io.Closeable;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import ws.wamp.jawampa.SubscriptionFlags;
public class WAMPClient implements Closeable, AutoCloseable {
private static final Logger logger = LoggerFactory
.getLogger(WAMPClient.class);
private static final WAMPClient INSTANCE = new WAMPClient();
private WampClient client;
private WAMPClient() {
}
public static WAMPClient getInstance() {
return INSTANCE;
}
public void init() throws Exception {
WampClientBuilder builder = new WampClientBuilder();
builder.withConnectorProvider(new NettyWampClientConnectorProvider())
.withAuthId(config.wampUsername())
.withAuthMethod(new Ticket(config.wampPassword()))
.withUri(config.wampUri())
.withRealm(config.wampRealm())
.withInfiniteReconnects()
.withReconnectInterval(config.wampReconnectInterval(),
TimeUnit.SECONDS);
client = builder.build();
client.open();
client.statusChanged().subscribe((WampClient.State newStatus) -> {
if (newStatus instanceof WampClient.ConnectedState) {
logger.info("Connected to {}",
config.wampUri());
} else if (newStatus instanceof WampClient.DisconnectedState) {
logger.info("Disconnected from {}",
config.wampUri());
} else if (newStatus instanceof WampClient.ConnectingState) {
logger.debug("Connecting to {}",
config.wampUri());
}
});
}
public Observable<Long> publish(String topic, String message) {
return client.publish(topic, message);
}
public Observable<String> subscribe(String topic) {
logger.info("Made subscription to " + topic);
return client.makeSubscription(topic, SubscriptionFlags.Prefix, String.class);
}
@Override
public void close() throws IOException {
client.close();
}
}