Guava EventBus Несколько подписчиков одного типа

import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;

public class Test {

    public static class Processing { }
    public static class ProcessingResults { }
    public static class ProcessingFinished { }

    public static EventBus bus = new EventBus();

    @Subscribe
    public void receiveStartRequest(Processing evt) {
        System.out.println("Got processing request - starting processing");
    }

    @Subscribe
    public void processingStarted(Processing evt) {
        System.out.println("Processing has started");
    }

    @Subscribe
    public void resultsReceived(ProcessingResults evt) {
        System.out.println("got results");
    }

    @Subscribe
    public void processingComplete(ProcessingFinished evt) {
        System.out.println("Processing has completed");
    }


    public static void main(String[] args) {
        Test t = new Test();
        bus.register(t);
        bus.post(new Processing());
    }
}

Итак, в приведенном выше примере видно, что есть 2 подписчика, принимающих один и тот же тип обработки. Теперь, во время post(), какие все функции будут вызываться? Если будут вызваны две функции ReceiveStartRequest и processingStarted, то в каком порядке они будут вызываться?


person hatellla    schedule 09.06.2017    source источник


Ответы (1)


Оба ваших метода будут вызываться в произвольном порядке.

Чтобы противостоять этому, просто создайте два дополнительных класса: ProcessingStarted и ProcessingRequested.

public class ProcessingStarted {
  private Processing processing;
  // Constructors
  // Getters/Setters
}


public class ProcessingStarted {
  private Processing processing;
  // Constructors
  // Getters/Setters
}

Затем при необходимости вызовите post(new ProcessingRequested(processing)) и post(new ProcessingStarted(processing)) вместо одного post(processing).

person Olivier Grégoire    schedule 09.06.2017
comment
Но мой вопрос был в том, что произойдет, если мы этого не сделаем? Будут ли тогда звонить обоим подписчикам? - person hatellla; 09.06.2017
comment
@hatella На самом деле я начал писать это как комментарий, но потом на полпути я подумал, что ответ будет лучше, и забыл включить эту часть. Я ответил на этот вопрос в своем ответе сейчас. Извините, что не был внимательнее :) - person Olivier Grégoire; 09.06.2017
comment
Большое спасибо @Oliver - person hatellla; 09.06.2017
comment
Спасибо! Это помогает мне. - person Dinith Rukshan Kumara; 13.03.2020