Преобразование обратного вызова в реактивного издателя (Flux) - PullRequest
0 голосов
/ 16 мая 2018

Я использую стороннюю библиотеку для регистрации MessageListener, и когда происходят определенные события, они вызывают зарегистрированных слушателей по методу onMessage

public interface MessageListener {  
   // third party code, it auto-scans for all MessageListeners and registers them
    void onMessage(Message message);
}


public class SimpleMessageListener implements MessageListener {
   public void onMessage(Message message) {
      //do something non blocking
      //is it possible to 'transmit' to messagePublisher
}
   public Flux<Message> messagePublisher() {
       // a method to which to subscribeOn    
   }
}

Итак, мой вопрос, как лучше всего превратить это в поток

В конце я хотел бы иметь возможность сделать что-то вроде этого

messagePublisher().subscribe(System.out::println);

************** edit Моя первая попытка что-то вроде этого

private List<FluxSink<Message>> handlers = new ArrayList<>();
public void onMessage(Message message) {
   handlers.forEach(han -> han.next(message));
}
public Flux<Message> messagePublisher() {
        return Flux.create(sink -> {
            handlers.add(sink);
            sink.onDispose(() -> handlers.remove(sink));
        });
    }

, который работает - но я чувствую, что это не очень хорошее решение, лучше ли, чтобы класс реализовывал FluxSink и обрабатывал вручную - в настоящее время я не ожидаю, что у меня будет много подписчиков. Но много MessageListeners (по одному для каждого типа)

...