package ameba.event; import co.paralleluniverse.fibers.Fiber; import co.paralleluniverse.fibers.RuntimeSuspendExecution; import co.paralleluniverse.fibers.SuspendExecution; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author icode */ public class EventTest { private static final Logger logger = LoggerFactory.getLogger(EventTest.class); @Test public void publish() { EventBus eventBus = EventBus.createMix(); eventBus.subscribe(new AnnotationSub()); eventBus.subscribe(new ChildSub()); eventBus.subscribe(AnnotationSub.class); for (int i = 0; i < 10; i++) { final int finalI = i; eventBus.subscribe(TestEvent.class, new AsyncListener<TestEvent>() { @Override public void onReceive(TestEvent event) { try { Fiber.sleep(100); } catch (SuspendExecution e) { throw RuntimeSuspendExecution.of(e); } catch (InterruptedException e) { logger.error("error", e); } logger.info("async receive message {} : {}", finalI, event.message); } }); eventBus.subscribe(TestEvent1.class, new AsyncListener<TestEvent1>() { @Override public void onReceive(TestEvent1 event) { logger.info("TestEvent1 async receive message {} : {}", finalI, event.message); } }); } for (int i = 0; i < 5; i++) { final int finalI = i; eventBus.subscribe(TestEvent.class, new Listener<TestEvent>() { @Override public void onReceive(TestEvent event) { logger.info("receive message {} : {}", finalI, event.message); } }); eventBus.subscribe(TestEvent1.class, new Listener<TestEvent1>() { @Override public void onReceive(TestEvent1 event) { logger.info("TestEvent1 receive message {} : {}", finalI, event.message); } }); } logger.info("publish message .."); for (int i = 0; i < 10; i++) { eventBus.publish(new TestEvent("message: " + i)); eventBus.publish(new TestEvent1("message: " + i)); } try { synchronized (this) { wait(1800); } } catch (InterruptedException e) { e.printStackTrace(); } logger.info("remove all event and publish message .."); eventBus.unsubscribe(TestEvent.class); eventBus.unsubscribe(TestEvent1.class); for (int i = 0; i < 10; i++) { eventBus.publish(new TestEvent("message: " + i)); eventBus.publish(new TestEvent1("message: " + i)); } } public static class AnnotationSub { @Subscribe(TestEvent.class) private void doSomething(TestEvent e) { logger.info("AnnotationSub receive message : {}", e.message); } @Subscribe(value = TestEvent.class, async = true) private void doAsyncSomething(TestEvent e) { logger.info("Async AnnotationSub receive message : {}", e.message); } @Subscribe private void doSomething2(TestEvent e) { logger.info("CoC AnnotationSub receive message : {}", e.message); } @Subscribe(async = true) private void doAsyncSomething2(TestEvent e) { logger.info("Async CoC AnnotationSub receive message : {}", e.message); } @Subscribe public void doSomething3(TestEvent e, TestEvent1 e1) { if (e != null) logger.info("doSomething3 CoC AnnotationSub receive TestEvent message : {}", e.message); if (e1 != null) logger.info("doSomething3 CoC AnnotationSub receive TestEvent1 message : {}", e1.message); } } public static class ChildSub extends AnnotationSub { @Subscribe public void doSomething3(TestEvent e, TestEvent1 e1) { if (e != null) logger.info("doSomething3 CoC AnnotationSub receive TestEvent message : {}", e.message); if (e1 != null) logger.info("doSomething3 CoC AnnotationSub receive TestEvent1 message : {}", e1.message); } } public static class TestEvent implements Event { public String message; public TestEvent(String message) { this.message = message; } } public static class TestEvent1 implements Event { public String message; public TestEvent1(String message) { this.message = message; } } }