简单快速的CQRS库:将请求和事件分派到相应的处理程序


一个简单的、无反射的、专注于性能的请求/事件调度库。如果你正在处理应用中的发布/订阅或域事件,并且想要一些轻量级和快速的东西,这可能值得一看。
  • 高性能调度
  • 清洁和灵活的API
  • 经过全面测试,测试覆盖率为100%
  • 无外部依赖
该库旨在帮助构建应用命令查询责任隔离(CQRS)模式的应用程序。

与其他类似库(Spring Events、Pipelinr等)相比,吞吐量增加约1000%

与其他类似库(Spring Events、Pipelinr等)相比,时间减少约90%

Java 11基准测试

Java 17基准测试

Maven



    io.github.joel-jeremy.deezpatch
    deezpatch-core
    ${version}

请求是以下消息之一:

  • CQRS中的命令
  • 在CQRS中查询

public class GreetCommand implements Request {
    private final String name;
    
    public GreetRequest(String name) {
        this.name = name;
    }
    
    public String name() {
        return name;
    }
}

public class PingQuery implements Request {}

请求处理程序
请求由请求处理程序处理。请求处理程序可以通过使用@ RequestList注释来注册。

一个请求只能有一个请求处理程序。

(@RequestHandlers完全支持方法,void返回类型!无需将方法返回类型设置为Void和返回nullfor no reason.)


public class GreetCommandHandler {
    @RequestHandler
    public void handle(GreetCommand command) {
        sayHi(command.name());
    }
}

public class PingQueryHandler {
    @RequestHandler
    public Pong handle(PingQuery query) {
        return new Pong("Here's your pong!");
    }
}

请求调度程序
请求被分派到单个请求处理程序,这可以通过分派器来完成。


public static void main(String[] args) {
    // Use Spring's application context as InstanceProvider in this example
    // but any other DI framework can be used e.g. Guice, Dagger, etc.
    ApplicationContext applicationContext = springApplicationContext();

    // Deezpatch implements the Dispatcher interface.
    Dispatcher dispatcher = Deezpatch.builder()
        .instanceProvider(applicationContext::getBean)
        .requests(config -> config.handlers(
            GreetCommandHandler.java,
            PingQueryHandler.java
        ))
        .build();

    // Send command!
    dispatcher.send(new GreetCommand("Deez"));

    // Send query!
    Optional pong = dispatcher.send(new PingQuery());
}

领域事件Events

事件是表明系统中发生了某些事情的信息


public class GreetedEvent implements Event {
    private final String greeting;

    public GreetedEvent(String greeting) {
        this.greeting = greeting;
    }

    public String greeting() {
        return greeting;
    }
}

事件处理程序
事件由事件处理程序处理。可以使用@EventHandler注解来注册事件处理程序。

一个事件可以有零个或多个事件处理程序。


public class GreetedEventHandler {
    @EventHandler
    public void sayHello(GreetedEvent event) {
        // Well, hello!
    }

    @EventHandler
    public void sayKumusta(GreetedEvent event) {
        // Well, kumusta?
    }

    @EventHandler
    public void sayGotEm(GreetedEvent event) {
        // Got 'em! 
    }
}

事件发布者

事件被分派给零个或多个事件处理程序,这可以通过发布者完成。


public static void main(String[] args) {
    // Use Spring's application context as InstanceProvider in this example
    // but any other DI framework can be used e.g. Guice, Dagger, etc.
    ApplicationContext applicationContext = springApplicationContext();

    // Deezpatch implements the Publisher interface.
    Publisher publisher = Deezpatch.builder()
        .instanceProvider(applicationContext::getBean)
        .events(config -> config.handlers(
            GreetedEventHandler.java
        ))
        .build();

    // Publish event!
    publisher.publish(new GreetedEvent("Hi from Deez!"));
}

轻松与依赖注入(DI)框架集成
该库提供了一个InstanceProvider接口作为扩展点,允许用户自定义请求/事件处理程序实例的实例化方式。这可以像new创建请求/事件处理程序一样简单,也可以从 Spring ApplicationContext、GuiceInjector等 DI 框架中获取实例。