Skip to content

Filtering


Filtering events

User events can implement Event, which provides an optional filtering field. Event handlers can specify the filter value, so they only see events with matching filters

See sample - StaticFiltering.java

public class StaticFiltering {

    public static class MyNode {
        @OnEventHandler(filterString = "CLEAR_SIGNAL")
        public boolean allClear(Signal<String> signalToProcess) {
            System.out.println("allClear [" + signalToProcess + "]");
            return true;
        }

        @OnEventHandler(filterString = "ALERT_SIGNAL")
        public boolean alertSignal(Signal<String> signalToProcess) {
            System.out.println("alertSignal [" + signalToProcess + "]");
            return true;
        }

        @OnEventHandler()
        public boolean anySignal(Signal<String> signalToProcess) {
            System.out.println("anySignal [" + signalToProcess + "]");
            return true;
        }
    }

    public static void main(String[] args) {
        var processor = DataFlowBuilder
                .subscribeToNode(new MyNode())
                .build();

        processor.onEvent(new Signal<>("ALERT_SIGNAL", "power failure"));
        System.out.println();
        processor.onEvent(new Signal<>("CLEAR_SIGNAL", "power restored"));
        System.out.println();
        processor.onEvent(new Signal<>("HEARTBEAT_SIGNAL", "heartbeat message"));
    }
}

Output

alertSignal [Signal: {filterString: ALERT_SIGNAL, value: power failure}]
anySignal [Signal: {filterString: ALERT_SIGNAL, value: power failure}]

allClear [Signal: {filterString: CLEAR_SIGNAL, value: power restored}]
anySignal [Signal: {filterString: CLEAR_SIGNAL, value: power restored}]

anySignal [Signal: {filterString: HEARTBEAT_SIGNAL, value: heartbeat message}]

Filter variables

The filter value on the event handler method can be extracted from an instance field in the class. Annotate the event handler method with an attribute that points to the filter variable @OnEventHandler(filterVariable = "[class variable]")

See sample - VariableFiltering.java

public class VariableFiltering {
    public static class MyNode {
        private final String name;

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


        @OnEventHandler(filterVariable = "name")
        public boolean handleIntSignal(Signal.IntSignal intSignal) {
            System.out.printf("MyNode-%s::handleIntSignal - %s%n", name, intSignal.getValue());
            return true;
        }
    }

    public static void main(String[] args) {
        DataFlowBuilder.subscribeToNode(new MyNode("A"));
        var processor = DataFlowBuilder
                .subscribeToNode(new MyNode("B"))
                .build();

        processor.publishIntSignal("A", 22);
        processor.publishIntSignal("B", 45);
        processor.publishIntSignal("C", 100);
    }
}

Output

MyNode-A::handleIntSignal - 22
MyNode-B::handleIntSignal - 45