一个简单的、无反射的、专注于性能的请求/事件调度库。如果你正在处理应用中的发布/订阅或域事件,并且想要一些轻量级和快速的东西,这可能值得一看。
- 高性能调度
- 清洁和灵活的API
- 经过全面测试,测试覆盖率为100%
- 无外部依赖
与其他类似库(Spring Events、Pipelinr等)相比,吞吐量增加约1000%
与其他类似库(Spring Events、Pipelinr等)相比,时间减少约90%
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 框架中获取实例。