### 1、发送（通用事件）与监听（通用事件）


```java
public class DemoApp {
    static String topic = "demo.hello";

    public static void main(String[] args) {
        //监听事件
        Dami.bus().listen(topic, event -> {
            System.err.println(event.getPayload());
        });

        //发送事件
        Dami.bus().send(topic, "hello");
    }
}
```

提醒：事件监听的参数差别（开发工具通过参数个数，推断为不同的类型）：


| 事件      | 监听 lambda 参数                 | 对应监听器接口 |
| ------ | ----------------------- | -------- |
| send      | `(event)->{}`                         | EventListener     |
| call        | `(event, data, sink)->{}`         | CallEventListener     |
| stream   | `(event, att, data, sink)->{}`    | StreamEventListener     |



### 2、使用泛型（自由定制的基础）

泛型可指定“荷载”（payload）的类型

```java
public class DemoApp {
    static String topic = "demo.hello";

    public static void main(String[] args) {
        //监听事件
        Dami.bus().<String>listen(topic, event -> {
            System.err.println(event.getPayload());
        });

        //发送事件
        Dami.bus().<String>send(topic, "hello");
    }
}
```

### 3、使用附件数据

发送事件时，可使用 topic + playload 分开发送，也可使用 event 整体发送。使用 event 整体发送时，可以添加附件。

```java
public class DemoApp {
    static String topic = "demo.hello";

    public static void main(String[] args) {
        //监听事件
        Dami.bus().<String>listen(topic, event -> {
            System.err.println(event.getPayload());
            System.err.println(event.getAttach()); //附件
        });

        //发送事件
        Dami.bus().send(new SimpleEvent<>(topic, "hello", Map.of("from", "noear")));
    }
}
```



如果要用通用发送与监听所有事件（通过 payload 类型进行识别，并对应处理）：

```java
public class UniEventListener implements EventListener<Object> {
    @Override
    public void onEvent(Event<Object> event) throws Throwable {
        if (event.getPayload() instanceof CallPayload) {
            //is call
        } else if (event.getPayload() instanceof StreamPayload) {
            //is stream
        } else {
            //is send
        }
    }
}

//或者 lambda 方式：
public class DemoApp {
    static String topic = "demo.hello";
    
    public static void main(String[] args) {
        Dami.bus().listen(topic, event -> {
            if (event.getPayload() instanceof CallPayload) {
                //is call
            } else if (event.getPayload() instanceof StreamPayload) {
                //is stream
            } else {
                //is send
            }
        });
    }
}

//通用发送
Dami.bus().send("send");
Dami.bus().send(new CallPayload<>("call"));
Flux.<String>from(subscriber -> {
    Dami.bus().send(topic, new StreamPayload<>("stream", subscriber));
})
```