观察者模式个简单运用之 spring Event ,guava EventBus ,rabbitMq_weixin_33850890的博客-CSDN博客

总结:灵活解耦,业务分离,单一责任,易维护 那么就可以使用观察模式了,例如:新用户注册 会有一系列的赠送活动(积分,优惠券等)。

 单体项目 优先推荐guava 的 EventBus 其次spring Event 事件机制,服务分离 就可以考虑 分布式消息队列。话不多说 代码入下:

1.spring 事件机制

    1.1 定义 事件源

/**
* 事件
* @author lyc
* @date 2019/6/10.
*/
public class UserRegisterEvent extends ApplicationEvent {

public UserRegisterEvent(Object source) {  
    super(source);  
}  

}
1.2 定义监听器

/**
* 监听器
* @author lyc
* @date 2019/6/10.
*/
@Component
@Slf4j
public class UserRegisterListener implements ApplicationListener {

@Override  
public void onApplicationEvent(ApplicationEvent applicationEvent) {  
    //触发事件 这里是同步的 异步处理 考虑线程池  
    if(applicationEvent instanceof UserRegisterEvent) {  
        log.info("事件触发");  
        UserRegisterEvent userRegisterEvent = (UserRegisterEvent) applicationEvent;  
        User user = (User) userRegisterEvent.getSource();  
        log.info("原数据{}", user);  
       //throw new FieldException("================================");  
    }  
}  

}
1.3 使用

/发布一个事件
SpringUtils.publishEvent(new UserRegisterEvent(user));

2 EventBus 使用

2.1
定义事件

/**
* @author lyc
* @date 2019/6/10.
*/
public class UserRegisterEvent {

private String message;  

public UserRegisterEvent(String message) {  
    this.message = message;  
}  

public String getMessage() {  
    return message;  
}  

}

  2.2 定义  EventBusService

@Component
public class EventBusService {
// private static EventBus eventBus = new EventBus("user"); //同步

private static AsyncEventBus eventBus = new AsyncEventBus("user", Executors.newFixedThreadPool(10));//异步  

/**  
 \* 注册事件  
 \* @param obj  
 */  

public static void register(Object obj){

   eventBus.register(obj);  

}

/**  
 \* 解除注册  
 \* @param obj  
 */  

public static void unregister(Object obj){

   eventBus.unregister(obj);  

}

/**  
 \* 发布事件  
 \* @param obj  
 */  

public static void post(Object obj){

   eventBus.post(obj);  

}
}
2.3 定义监听器 这里我定义了两个 监听器 对同一个注册事件 监听

@Component
@Slf4j
public class IntegralEventListener {

@Subscribe  
public void listen(UserRegisterEvent event){  
    //送积分  
    try {  
        Thread.sleep(1000);  
    } catch (InterruptedException e) {  

    }  
    log.info("送积分: "+event.getMessage());  
}  

@Subscribe  
public void listen(String message){  
   log.info("receive message: "+message);  
}  

}

@Component
@Slf4j
public class CashBackListener {

@Subscribe  
public void listen(UserRegisterEvent event){  
    //送现金  
    log.info("送现金: "+event.getMessage());  
}  

@Subscribe  
public void listen(String message){  
    log.info("receive message: "+message);  
}  

}
2.4 简单使用

UserRegisterEvent event = new UserRegisterEvent("注册了");
//注册一个监听
eventBusService.register(eventListener);
eventBusService.register(cashBackListener);
//发布一个事件
eventBusService.post(event);

3 rabbitMq 使用

3.1 定义一个队列

@Configuration
public class RabbitConfig {

@Bean  
public Queue registerQueue() {  
    return new Queue("register");  
}  

}

3.2 定义一个监听器

@Component
@Slf4j
public class Receiver {

@RabbitListener(queues = "register")

public void process(String msg) {  
   try {  
       Thread.sleep(1000);  
   } catch (InterruptedException e) {  

   }  
   log.info("rabbitMq : " + msg);  
}  

}
3.3 使用 发送到对应队列

rabbitTemplate.convertAndSend("register","注册了");

转载于:https://www.cnblogs.com/lyc88/articles/10999394.html


原网址: 访问
创建于: 2021-01-21 16:31:37
目录: default
标签: 无

请先后发表评论
  • 最新评论
  • 总共0条评论