Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Guava EventBus: pause event posting

Tags:

guava

Is there any way to pause event posting by the EventBus from the guava library.

I have a method changeSomething() that posts an event (e.g. SomethingChangedEvent). Now this method is called in a loop by another method doStuff(). The problem is that the SomethingChangedEvent is posted on every call to changeSomething() even though only the last change matters. Due to the fact that the handlers of the event execute some heavy-weight calculations, the performance of the application degrades fast.

After the last time changeSomething() is executed I would like to tell guava to resume event processing.

Is there any way to tell guava to ignore all SomethingChangedEvents except the very last one?

like image 930
Denis Rosca Avatar asked Mar 10 '26 04:03

Denis Rosca


1 Answers

I tried this pattern, derived from the poison pill pattern using sub-classing :

 public class SomethingChangedEvent {

        private final String name;

        public SomethingChangedEvent(String name) {
            this.name = name;
        }

        @Override
        public String toString() {
            return name;
        }

    }

    public class IgnoreSomethingChangedEvent extends SomethingChangedEvent {
        public IgnoreSomethingChangedEvent(String name) {
            super(name);
        }

    }

    public class HandleSomethingChangedEvent extends SomethingChangedEvent {
        public HandleSomethingChangedEvent(String name) {
            super(name);
        }

    }

    private void eventBusTest() {
        EventBus eventBus = new EventBus();
        eventBus.register(new EventBusSomethingChanged());
        eventBus.post(new SomethingChangedEvent("process this one"));
        eventBus.post(new IgnoreSomethingChangedEvent("ignore"));
        eventBus.post(new SomethingChangedEvent("don't process this one"));
        eventBus.post(new HandleSomethingChangedEvent("handle"));
        eventBus.post(new SomethingChangedEvent("process this one bis"));
    }

    public class EventBusSomethingChanged {
        private boolean ignore;

        @Subscribe
        public void SomethingChanged(SomethingChangedEvent e) {
            if (e instanceof IgnoreSomethingChangedEvent) {
                ignore = true;
                return;
            }
            if (e instanceof HandleSomethingChangedEvent) {
                ignore = false;
                return;
            }
            if (!ignore) {
                System.out.println("processing:" + e);
            }
        }
    }
like image 107
Pierre-Henri Avatar answered Mar 14 '26 01:03

Pierre-Henri



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!