@Override public boolean isConnected() { return (conn != null && conn.isConnected()); }
@Override public void connect() { try { Connection temp = fact.createConnection(); logger.info("Successfully connected for " + queueURI); temp.setReconnectedCallback((event) -> logger.warn("onReconnect. Reconnected back for " + queueURI)); temp.setDisconnectedCallback((event -> logger.warn("onDisconnect. Disconnected for " + queueURI))); conn = temp; } catch (Exception e) { logger.error("Unable to establish nats connection for " + queueURI, e); throw new RuntimeException(e); } }
@Override public void closeConn() { if (conn != null) { try { conn.close(); } catch (Exception ex) { logger.error("closeConn failed with " + ex.getMessage() + " for " + queueURI, ex); } conn = null; } } }
@Test(expected = IllegalStateException.class) public void testOnlyOneUnsubscribe() throws IOException, InterruptedException { try (NatsTestServer ts = new NatsTestServer(false); Connection nc = Nats.connect(ts.getURI())) { assertTrue("Connected Status", Connection.Status.CONNECTED == nc.getStatus()); Subscription sub = nc.subscribe("subject"); sub.unsubscribe(); sub.unsubscribe(); // Will throw an exception assertFalse(true); } }
@Test(expected=IllegalArgumentException.class) public void testThrowOnAsyncWithoutListener() throws IOException, InterruptedException { try (NatsTestServer ts = new NatsTestServer(false)) { Options options = new Options.Builder(). server(ts.getURI()). build(); Nats.connectAsynchronously(options, false); } }
@Override public void subscribe() { // do nothing if already subscribed if (subs != null) { return; } try { ensureConnected(); // Create subject/queue subscription if the queue has been provided if (StringUtils.isNotEmpty(queue)) { logger.info("No subscription. Creating a queue subscription. subject={}, queue={}", subject, queue); subs = conn.subscribe(subject, queue, msg -> onMessage(msg.getSubject(), msg.getData())); } else { logger.info("No subscription. Creating a pub/sub subscription. subject={}", subject); subs = conn.subscribe(subject, msg -> onMessage(msg.getSubject(), msg.getData())); } } catch (Exception ex) { logger.error("Subscription failed with " + ex.getMessage() + " for queueURI " + queueURI, ex); } }
private Connection initConnection() throws IOException { Options options = new Options.Builder() .errorCb(this::connectionError) .disconnectedCb(this::disconnected) .reconnectedCb(this::reconnected) .build(); return Nats.connect(this.server, options); }
@Test(expected = IllegalStateException.class) public void throwsOnSubscribeIfClosed() throws IOException, InterruptedException { try (NatsTestServer ts = new NatsTestServer(false); Connection nc = Nats.connect(ts.getURI())) { Dispatcher d = nc.createDispatcher((msg) -> {}); nc.close(); d.subscribe("subject"); assertFalse(true); } }
@Test(expected=IllegalStateException.class) public void testThrowOnSubscribeWhenClosed() throws IOException, InterruptedException, TimeoutException { try (NatsTestServer ts = new NatsTestServer(false); Connection nc = Nats.connect(ts.getURI())) { Dispatcher d = nc.createDispatcher((msg) -> {}); nc.closeDispatcher(d); d.subscribe("foo"); assertFalse(true); } }
@Test(expected=IllegalArgumentException.class) public void testThrowOnNullSubjectInUnsub() throws IOException, InterruptedException, TimeoutException { try (NatsTestServer ts = new NatsTestServer(false); Connection nc = Nats.connect(ts.getURI())) { Dispatcher d = nc.createDispatcher((msg) -> {}); d.unsubscribe(null); assertFalse(true); } }
@Override public void publish(String subject, byte[] data) throws Exception { ensureConnected(); conn.publish(subject, data); }
void onMessage(String subject, byte[] data) { String payload = new String(data); logger.info(String.format("Received message for %s: %s", subject, payload)); Message dstMsg = new Message(); dstMsg.setId(NUID.nextGlobal()); dstMsg.setPayload(payload); messages.add(dstMsg); }
@Override public void connect() { try { StreamingConnection temp = fact.createConnection(); logger.info("Successfully connected for " + queueURI); temp.getNatsConnection().setReconnectedCallback((event) -> logger.warn("onReconnect. Reconnected back for " + queueURI)); temp.getNatsConnection().setDisconnectedCallback((event -> logger.warn("onDisconnect. Disconnected for " + queueURI))); conn = temp; } catch (Exception e) { logger.error("Unable to establish nats streaming connection for " + queueURI, e); throw new RuntimeException(e); } }
@Inject public NATSEventQueueProvider(Configuration config) { logger.info("NATS Event Queue Provider init"); // Init NATS API. Handle "io_nats" and "io.nats" ways to specify parameters Properties props = new Properties(); Properties temp = new Properties(); temp.putAll(System.getenv()); temp.putAll(System.getProperties()); temp.forEach((key1, value) -> { String key = key1.toString(); String val = value.toString(); if (key.startsWith("io_nats")) { key = key.replace("_", "."); } props.put(key, config.getProperty(key, val)); }); // Init NATS API factory = new ConnectionFactory(props); logger.info("NATS Event Queue Provider initialized..."); }
@Override public void closeSubs() { if (subs != null) { try { subs.close(); } catch (Exception ex) { logger.error("closeSubs failed with " + ex.getMessage() + " for " + queueURI, ex); } subs = null; } }
@Test(expected = IllegalStateException.class) public void throwsOnAutoUnsubscribeIfClosed() throws IOException, InterruptedException { try (NatsTestServer ts = new NatsTestServer(false); Connection nc = Nats.connect(ts.getURI())) { assertTrue("Connected Status", Connection.Status.CONNECTED == nc.getStatus()); Subscription sub = nc.subscribe("subject"); nc.close(); sub.unsubscribe(1); assertFalse(true); } }
@Override public boolean isConnected() { return (conn != null && conn.getNatsConnection() != null && conn.getNatsConnection().isConnected()); }