public static Integer doTest() throws Exception { final IntChannel fiber1ToFiber2 = Channels.newIntChannel(0); // Synchronizing channel (buffer = 0) final IntChannel fiber2ToFiber1 = Channels.newIntChannel(0); // Synchronizing channel (buffer = 0)
@Suspendable @Override public void start() throws Exception { EventBus eb = vertx.eventBus(); // Create a couple of consumers on different addresses // The adaptor allows handler to be used as a Channel HandlerReceiverAdaptor<Message<String>> adaptor1 = streamAdaptor(); eb.<String>consumer(ADDRESS1).handler(adaptor1); HandlerReceiverAdaptor<Message<String>> adaptor2 = streamAdaptor(); eb.<String>consumer(ADDRESS2).handler(adaptor2); // Set up a periodic timer to send messages to these addresses vertx.setPeriodic(500, tid -> { eb.send(ADDRESS1, "wibble"); eb.send(ADDRESS2, "flibble"); }); ReceivePort<Message<String>> channel1 = adaptor1.receivePort(); ReceivePort<Message<String>> channel2 = adaptor2.receivePort(); // Combine them into a single channel // Not sure how to avoid this ugly cast with Quasar Mix<Message<String>> mix = (Mix<Message<String>>)Channels.mix(channel1, channel2); // Take the first ten for (int i = 0; i < 10; i++) { Message<String> msg = mix.receive(); System.out.println("got message: " + msg.body()); } System.out.println("done"); }
@Override public void close() { if (sendClosed == true) return; sendClosed = true; for (SendPort<?> sub : subscribers) sub.close(); unsubscribeAll(); }
protected void checkClosed() throws EOFException { if (isClosed()) { if (channel.getCloseException() != null) throw new ProducerException(channel.getCloseException()); throw EOFException.instance; } }
@Override public T tryReceive() { for (;;) { if (port != null && !port.isClosed()) return port.tryReceive(); S m0 = target.tryReceive(); if (m0 == null) return null; this.port = map(m0); } }
@Override public Message tryReceive() { for (int i = 0; i < targets.length; i++) { if (ms[i] == null) { Object m = targets[i].tryReceive(); if (m == null) return null; ms[i] = m; } } return transformAndReset(); }
@Override public T tryReceive() { for (;;) { S m0 = target.tryReceive(); if (m0 == null) return null; T m = transform(m0); if (m != null) return m; } }
@Override public void close(Throwable t) { if (sendClosed == true) return; closeException = t; sendClosed = true; for (SendPort<?> sub : subscribers) sub.close(t); unsubscribeAll(); } }
@Override public Integer run() throws SuspendExecution, InterruptedException { Fiber.sleep(1000); fiber1ToFiber2.send(1); Integer i1 = fiber2ToFiber1.receive(); System.out.println(" Hello words " + i1); fiber1ToFiber2.send(9); Integer i2 = fiber2ToFiber1.receive(); System.out.println(" Hello words " + i2); fiber1ToFiber2.send(0); return i2; } }).start();