1、Solon Cloud Event?
是 Solon 分布式事件总线的解决方案。也是 Solon “最终一致性”分布式事务的解决方案之一
2、事务特性
事务?就是要求 Event 有原子性,当多个 Event 发布时,要么全成功,要么全失败。
public class EventDemo {public void event_tran() {//新建一个 Event 事务EventTran eventTran = CloudClient.event().newTran();try {//发布,并使用事务CloudClient.event().publish(new Event("user.event1", "test1").tran(eventTran));CloudClient.event().publish(new Event("user.event2", "test2").tran(eventTran));CloudClient.event().publish(new Event("user.event2", "test3").tran(eventTran));//如果没问题,提交事务eventTran.commit();} catch (Throwable ex) {//如果有问题,回滚事务eventTran.rollback();}}
}
上面的体验与经典的 Jdbc 事务是很像的。加入 Solon 的事务注解管理后,体验可以再简洁些,也能与 Jdbc 事务整合到一起。
@Component
public class EventDemo {//使用 @Tran 管理事务(将 jdbc, event 事务整合到一起)@Tranpublic void event_and_jdbc_tran() {//新建一个 Event 事务,并加入 @Tran 的管理EventTran eventTran = CloudClient.event().newTranAndJoin(); CloudClient.event().publish(new Event("user.event1", "test1").tran(eventTran));CloudClient.event().publish(new Event("user.event2", "test2").tran(eventTran));CloudClient.event().publish(new Event("user.event2", "test3").tran(eventTran));}
}
3、拟模真实的场景应用:
我们设计一个用户注册的场景应用:
- 持久层添加用户记录
- 注册后发布一个已注册事件;再发布一个10天后触发的已唤醒事件
- 在已注册事件里,我们给用户送10个金币;再送手机100元冲值
- 在已唤醒事件里,我们检查用户的活动行为;如果有,再送100个金币(作为奖励);如果没发推送,告知有抽奖
主服务程序,负责主业务:
@Component
public class UserService {@InjectUserDao userDao;//用户注册@Tranpublic void userRegister(long userId, String name){userDao.addUser(userId, name);this.onUserRegistered(userId);}//当用户完成注册时(发布事件)private void onUserRegistered(long userId) {String eventJson = String.format("{\"userId\":%d}", userId);Date eventTime = DateTime.Now().addDay(10);EventTran eventTran = CloudClient.event().newTranAndJoin();//发布用户已注册事件CloudClient.event().publish(new Event("user.registered", eventJson).tran(eventTran));//发布用户已唤醒事件(用于检查用户在10内,有没有活动行为)CloudClient.event().publish(new Event("user.reawakened", eventJson).scheduled(eventTime).tran(eventTran));}
}
次服务程序,负责辅助业务(也可以合到主服务程序):
@CloudEvent("user.registered")
public class UserRegisteredEventHandler implements CloudEventHandler {@InjectUserService userService;@InjectMobileService mobileSerivce;@Overridepublic boolean handler(Event event) throws Throwable {long userId = ONode.load(event.context()).get("userId").getLong();//送10个金币userService.addGold(userId, 10);//送手机充值100块String mobie = userService.getMobile(userId);mobileSerivce.recharge(mobile, 100);return true;}
}@CloudEvent("user.reawakened")
public class UserReawakenedEventHandler implements CloudEventHandler {@InjectUserService userService;@InjectPushService pushService@Overridepublic boolean handler(Event event) throws Throwable {long userId = ONode.load(event.context()).get("userId").getLong();if (userService.hasLive(userId, 10)) {//再送100个金币userService.addGold(userId, 100);} else {//获取设备idString duid = userService.getDuid(userId);//发布推送pushService.push(duid, "有100个金币等你来拿哟...")}return true;}
}