Govern EventBus 是一个历经四年生产环境验证的事件驱动架构框架, 通过事件总线机制来治理微服务间的远程过程调用。 使用本地事务来支持微服务内强一致性,事件总线来实现微服务间的最终一致性,另外还提供了事件发布/订阅失败的自动补偿机制。
create table compensate_leader ( name varchar(16) not null primary key, term_start bigint unsigned not null, term_end bigint unsigned not null, transition_period bigint unsigned not null, leader_id varchar(100) not null, version int unsigned not null ); create table publish_event ( id bigint unsigned auto_increment primary key, event_name varchar(100) not null, event_data mediumtext not null, status smallint unsigned not null, published_time bigint unsigned default 0 not null, version smallint unsigned not null, create_time bigint unsigned not null ); create index idx_status on publish_event (status); create table publish_event_compensate ( id bigint unsigned auto_increment primary key, publish_event_id bigint unsigned not null, start_time bigint unsigned not null, taken bigint unsigned not null, failed_msg text null ); create table publish_event_failed ( id bigint unsigned auto_increment primary key, publish_event_id bigint unsigned not null, failed_msg text not null, create_time bigint unsigned not null ); create table subscribe_event ( id bigint unsigned auto_increment primary key, subscribe_name varchar(100) not null, status smallint unsigned not null, subscribe_time bigint unsigned not null, event_id bigint unsigned not null, event_name varchar(100) not null, event_data mediumtext not null, event_create_time bigint unsigned not null, version smallint unsigned not null, create_time bigint unsigned not null, constraint uk_subscribe_name_even_id_event_name unique (subscribe_name, event_id, event_name) ); create index idx_status on subscribe_event (status); create table subscribe_event_compensate ( id bigint unsigned auto_increment primary key, subscribe_event_id bigint unsigned not null, start_time bigint unsigned not null, taken int unsigned not null, failed_msg text null ); create table subscribe_event_failed ( id bigint unsigned auto_increment primary key, subscribe_event_id bigint unsigned not null, failed_msg text not null, create_time bigint unsigned not null ); insert into compensate_leader (name, term_start, term_end, transition_period, leader_id, version) values ('publish_leader', 0, 0, 0, '', 0); insert into compensate_leader (name, term_start, term_end, transition_period, leader_id, version) values ('subscribe_leader', 0, 0, 0, '', 0);
val eventbusVersion = "0.9.2"; implementation("me.ahoo.eventbus:eventbus-spring-boot-starter:${eventbusVersion}") implementation("me.ahoo.eventbus:eventbus-spring-boot-autoconfigure:${eventbusVersion}") { capabilities { requireCapability("me.ahoo.eventbus:rabbit-bus-support") //requireCapability("me.ahoo.eventbus:kafka-bus-support") } }
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <artifactId>demo</artifactId> <properties> <eventbus.version>0.9.2</eventbus.version> </properties> <dependencies> <dependency> <groupId>me.ahoo.eventbus</groupId> <artifactId>eventbus-spring-boot-starter</artifactId> <version>${eventbus.version}</version> </dependency> <dependency> <groupId>me.ahoo.eventbus</groupId> <artifactId>eventbus-rabbit</artifactId> <version>${eventbus.version}</version> </dependency> <!--<dependency>--> <!-- <groupId>me.ahoo.eventbus</groupId>--> <!-- <artifactId>eventbus-kafka</artifactId>--> <!-- <version>${eventbus.version}</version>--> <!--</dependency>--> </dependencies> </project>
spring: application: name: eventbus-demo datasource: url: jdbc:mysql://localhost:3306/eventbus_db?serverTimezone=GMT%2B8&characterEncoding=utf-8 username: root password: root rabbitmq: host: localhost username: eventbus password: eventbus govern: eventbus: rabbit: exchange: eventbus compensate: db: publish: schedule: initial-delay: 30 period: 10 subscribe: schedule: initial-delay: 30 period: 10 enabled: true subscriber: prefix: ${spring.application.name}.
一般情况下 Publisher 与 Subscriber 不在同一个应用服务内。 这里只是作为演示用途。
/** * 定义发布事件 */ public class OrderCreatedEvent { private long orderId; public long getOrderId() { return orderId; } public void setOrderId(long orderId) { this.orderId = orderId; } @Override public String toString() { return "OrderCreatedEvent{" + "orderId=" + orderId + '}'; } }
package me.ahoo.eventbus.demo.service; import me.ahoo.eventbus.core.annotation.Publish; import me.ahoo.eventbus.demo.event.OrderCreatedEvent; import org.springframework.stereotype.Service; /** * @author ahoo wang */ @Service public class OrderService { @Publish public OrderCreatedEvent createOrder() { OrderCreatedEvent orderCreatedEvent = new OrderCreatedEvent(); orderCreatedEvent.setOrderId(1L); return orderCreatedEvent; } }
package me.ahoo.eventbus.demo.service; import lombok.extern.slf4j.Slf4j; import me.ahoo.eventbus.core.annotation.Subscribe; import me.ahoo.eventbus.demo.event.OrderCreatedEvent; import org.springframework.stereotype.Service; @Slf4j @Service public class NoticeService { @Subscribe public void handleOrderCreated(OrderCreatedEvent orderCreatedEvent) { log.info("handleOrderCreated - event:[{}].", orderCreatedEvent); /** * 执行相应的业务代码 * send sms / email ? */ } }
translated_page: https://github.com/PX4/Devguide/blob/master/en/middleware/drivers.md translated_sha: 95b39d747851dd01c1fe5d36b24e59ec865e323e 驱动框架 PX4的代码库使用一个轻量级的,统一的驱动抽象层:DriverFramework. POSIX和 QuR
问题内容: 尽管Java的简单,接口驱动的事件通知框架早于寒武纪就已经存在(例如,java.beans.PropertyChangeSupport),但是使用注释驱动的事件通知的框架正变得越来越流行。 有关示例,请参见JBossCache 2.2。侦听器类的侦听器方法带有注释,而不是遵循严格的接口。因为您不必编写您不感兴趣的侦听器回调的空实现(而且是的,我知道侦听器适配器超类),所以这更容易编程和
本文向大家介绍Nginx学习笔记之事件驱动框架处理流程,包括了Nginx学习笔记之事件驱动框架处理流程的使用技巧和注意事项,需要的朋友参考一下 ngx_event_core_module模块的ngx_event_process_init方法对事件模块做了一些初始化。其中包括将“请求连接”这样一个读事件对应的处理方法(handler)设置为ngx_event_accept函数,并将此事件添加到epo
本文向大家介绍解释行为驱动框架。,包括了解释行为驱动框架。的使用技巧和注意事项,需要的朋友参考一下 行为驱动框架从项目中的所有涉众那里获取信息,比如开发人员、测试人员、产品所有者、经理、客户和业务分析师。这个想法是为了让项目的每个成员都有相同的理解。 行为驱动框架致力于团队中每个人之间的协作和协调。技术编码知识是不必要的,因为功能需求或规范是用非技术性的,通用的语言描述的。 在自动和手动测试人员设
本文向大家介绍说明数据驱动框架和关键字驱动框架之间的差异。,包括了说明数据驱动框架和关键字驱动框架之间的差异。的使用技巧和注意事项,需要的朋友参考一下 下文介绍了数据驱动框架和关键字驱动框架之间的差异。 在数据驱动的测试中,我们可以借助参数化对多个组合的多个数据进行测试。在这里,数据被视为测试脚本逻辑的输入。每个数据集都可以视为一个单独的测试用例。 在关键字驱动的测试中,开发的关键字表示动作。依序
本文向大家介绍解释数据驱动的框架。,包括了解释数据驱动的框架。的使用技巧和注意事项,需要的朋友参考一下 数据驱动框架用于将测试脚本逻辑与测试数据分离。在此框架中,我们可以在参数化的帮助下,使用多个组合的多组数据来运行测试脚本。测试数据保存在单独的文件中,例如excel,access,txt等。 测试脚本需要连接到这些外部文件以获取数据。该框架的主要目的是针对各种数据集运行我们的测试脚本,从而减少测
背景与概述 Sensor 是物联网重要的一部分,“Sensor 之于物联网”相当于“眼睛之于人类”。人没有眼睛就看不到这大千的花花世界,物联网没有了 Sensor 更是不能感知这变化万千的世界。 现在,为物联网开发的 Sensor 已经很多了,有加速度计(Accelerometer),磁力计(Magnetometer),陀螺仪(Gyroscope),光感计(Ambient light sensor