动态路由
1.发布监听Redis主题的变化动态切换路由
1. 使用到ApplicationEventPublisher
观察者模式(订阅-发布)
ApplicationEventPublisherAware
是由Spring提供的用于为Service注入ApplicationEventPublisher
事件发布器的接口,使用这个接口,我们自己的service也具有发布时间的能力。例如,用户注册之后,不是调用service,而是发布一个用户注册事件。
@Service
public class RegisterService implements ApplicationEventPublisherAware {
private ApplicationEventPublisher applicationEventPublisher;
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
this.applicationEventPublisher = applicationEventPublisher;
}
public void registe(String name) {
System.out.println(name + "已经注册");
this.applicationEventPublisher.publishEvent(new RegistVo(name));
}
}
-
ApplicationListener
是由Spring提供的时间订阅者必须实现的接口,其中如果要使用异步的话,就要加上@Async
注解,而且必须新建一个@EnableAsync
注解来开启对异步任务的支持@Component public class RegisiterListener implements ApplicationListener<RegistVo> { @Async @Override public void onApplicationEvent(RegistVo registVo) { System.out.println("监听到变化"); System.out.println(registVo.getSource()); System.out.println(1 / 0); ; } }
@Configuration @EnableAsync public class TaskExecutorConfig { @Bean("taskExecutor") public TaskExecutor getAsyncExecutor() { ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); taskExecutor.setCorePoolSize(10); taskExecutor.setMaxPoolSize(20); taskExecutor.setQueueCapacity(10); taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); taskExecutor.initialize(); return taskExecutor; } } ```
-
ApplicationEventPublisher
是ApplicationContext
的父接口之一,这个接口的作用就是发布事件@Service public class RegisterService implements ApplicationEventPublisherAware { private ApplicationEventPublisher applicationEventPublisher; @Override public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) { this.applicationEventPublisher = applicationEventPublisher; } public void registe(String name) { System.out.println(name + "已经注册"); this.applicationEventPublisher.publishEvent(new RegistVo(name)); } }
2.动态路由的实际代码
业务逻辑代码:
@Service
public class DynamicRouteServiceImpl implements ApplicationEventPublisherAware{
@Autowired
private RouteDefinitionWriter routeDefinitionWriter;
private ApplicationEventPublisher publisher;
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
this.publisher = applicationEventPublisher;
}
//增加路由
public String add(RouteDefinition definition) {
routeDefinitionWriter.save(Mono.just(definition)).subscribe();
this.publisher.publishEvent(new RefreshRoutesEvent(this));
return "success";
}
//更新路由
public String update(RouteDefinition definition) {
try {
delete(definition.getId());
} catch (Exception e) {
return "update fail,not find route routeId: "+definition.getId();
}
try {
routeDefinitionWriter.save(Mono.just(definition)).subscribe();
this.publisher.publishEvent(new RefreshRoutesEvent(this));
return "success";
} catch (Exception e) {
return "update route fail";
}
}
//删除路由
public Mono<ResponseEntity<Object>> delete(String id) {
return this.routeDefinitionWriter.delete(Mono.just(id)).then(Mono.defer(() -> {
return Mono.just(ResponseEntity.ok().build());
})).onErrorResume((t) -> {
return t instanceof NotFoundException;
}, (t) -> {
return Mono.just(ResponseEntity.notFound().build());
});
}
}
。。。。。。。待更新
如果喜欢博主,可以关注我的公众号哈