订阅发布者模式是工作中经常用到的。比如我在工作中就遇到了配置文件定时更新的需求,当然可以起定时线程进行强制更新,但是强制更新势必会造成资源的消耗,共享变量的等待等,因此可以采用订阅发布者模式,当有需要时进行更新操作。
有很多实现方式,这里是在研究flume源码的时候碰到的一种方式,感觉非常简单好用。写个demo如下:
package com.xx.testSubPub;
/**
* function:
*
* @author X
* @date 2019/5/17.
*/
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
public class PublisherTest {
public static void main(String[] args) {
//相当于调度中心
final EventBus eventBus = new EventBus("PublisherTest");
//将注册订阅者到调度中心
eventBus.register(new Subscriber());
Timer timer = new Timer("hello");
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
new Publisher(eventBus).start();
}
}, 0, 3000);
}
}
/**
* 订阅者
*/
class Subscriber {
/**
* 订阅者,每次发布者有变动时触发的方法
*
* @param event
*/
@Subscribe
public static void sub(Object event) {
System.out.println("订阅者方法触发。。。" + event);
}
}
/**
* 发布者
*/
class Publisher extends Thread {
EventBus eventBus;
public Publisher(EventBus eventBus) {
this.eventBus = eventBus;
}
@Override
public void run() {
//模拟当有需要时触发发布方法
if (new Random().nextInt(10) < 3) {
System.out.println("发布者检测到更新操作启动发布");
eventBus.post(refreshConf());
} else {
System.out.println("dont need refresh");
}
}
//具体的更新操作逻辑
public Object refreshConf() {
System.out.println("刷新配置文件");
return new Object();
}
}