package io.muoncore.examples;
import io.muoncore.Muon;
import io.muoncore.MuonBuilder;
import io.muoncore.ServiceDescriptor;
import io.muoncore.config.AutoConfiguration;
import io.muoncore.config.MuonConfigBuilder;
import io.muoncore.discovery.amqp.AmqpDiscoveryFactory;
import io.muoncore.discovery.multicast.MulticastDiscovery;
import io.muoncore.discovery.multicast.MulticastDiscoveryFactory;
import io.muoncore.message.MuonMessage;
import io.muoncore.protocol.reactivestream.server.PublisherLookup;
import org.reactivestreams.Publisher;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
import java.io.IOException;
import java.net.URISyntaxException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicInteger;
import static io.muoncore.protocol.requestresponse.server.HandlerPredicates.all;
public class ServicePublishHotStream {
public static void main(String[] args) throws URISyntaxException, NoSuchAlgorithmException, KeyManagementException, IOException, InterruptedException {
String serviceName = "product";
AutoConfiguration config = MuonConfigBuilder
.withServiceIdentifier(serviceName)
.withTags("node", "awesome")
// .addWriter(config1 -> config1.getProperties().setProperty("muon.discovery.factories", MulticastDiscoveryFactory.class.getName()) )
.build();
Muon muon = MuonBuilder.withConfig(config).build();
muon.getDiscovery().blockUntilReady();
muon.getTransportControl().tap(muonMessage -> true ).subscribe(new Subscriber<MuonMessage>() {
@Override
public void onSubscribe(Subscription s) {
s.request(Integer.MAX_VALUE);
}
@Override
public void onNext(MuonMessage muonMessage) {
System.out.println("TAP:" + muonMessage);
}
@Override
public void onError(Throwable t) {
t.printStackTrace();
}
@Override
public void onComplete() {
System.out.println("STREAM COMPLETED");
}
});
muon.handleRequest(all(), wrapper -> {
wrapper.ok(muon.getDiscovery().getKnownServices());
});
muon.publishGeneratedSource("/hello", PublisherLookup.PublisherType.HOT, subscriptionRequest -> {
Publisher<String> pub = s -> {
AtomicInteger cancel = new AtomicInteger(0);
Subscription sub = new Subscription() {
@Override
public void request(long n) {
System.out.println("Subscriber requests data " + n);
}
@Override
public void cancel() {
System.out.println("Subscriber Cancelled");
cancel.addAndGet(1);
}
};
new Thread(() -> {
while (cancel.longValue() == 0) {
System.out.println("SENDING!");
try {
s.onNext("HELLO WORLD " + System.currentTimeMillis());
} catch (Exception ex) {
ex.printStackTrace();
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
s.onSubscribe(sub);
};
return pub;
});
Thread.sleep(4000);
muon.request("rpc://muon-node-test-examples/ping").then(arg -> {
System.out.println(arg.getPayload(String.class));
});
}
}