How to lock the thread until the Observable be complete
我正在测试一个场景,我想发送一个事件,并观察使用者何时完成处理以继续流程,即,当我触发事件时,我需要将该主线程阻塞直到事件结束。消费者处理,使用rxJava Observable,我没有成功锁定主线程以等待可观察的结果。
我的制片人
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | @Service public class Producer { private MessageChannel output; @Autowired private Consumer consumer; @Autowired public Producer(Processor processor) { this.output = processor.output(); } public void send(String event) { System.out.println("SENDING EVENT..."); output.send(MessageBuilder.withPayload(event).build()); //Observable<Boolean> obs = consumer.execute(); //obs.subscribe(); //Blocking process BlockingObservable.from(consumer.execute()).subscribe(); //Continue to flow System.out.println("EVENT PROCESSED..."); } } |
我的消费者
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | @Service public class Consumer { @StreamListener(target = Processor.INPUT) public void receiver(@Payload String event){ System.out.println("EVENT RECEIVED, PROCESSING..."); try { TimeUnit.SECONDS.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } execute(); } public Observable<Boolean> execute() { return Observable.<Boolean>create(emitter -> { try { System.out.println("EVENT STILL PROCESSING..."); emitter.onNext(Boolean.TRUE); } catch (Exception e) { emitter.onError(new RuntimeException("ERROR")); } emitter.onCompleted(); }); } } |
您需要使用运算符toBlockig(等待消费者消费)来获取值。
1 2 3 4 5 6 7 8 | @Test public void observableEvolveAndReturnToStringValue() { assertTrue(Observable.just(10) .map(String::valueOf) .toBlocking() .single() .equals("10")); } |
您可以在此处查看更多示例https://github.com/politrons/reactive/blob/master/src/test/java/rx/observables/utils/ObservableToBlocking.java
您可以使用