设计模式无处不在,我们可以在各种开源框架中识别到各种设计模式是如何被巧妙地应用的。BlackStar,虽然并不刻意,但也使用到很多设计模式。我们来看看BlackStar的Reporter,看一些常用的设计模式是如何使其更加灵活和可扩展的。
1.什么是Reporter
BlackStar的JVM Monitor会进行JVM监控数据的采集,采集后的数据如何处理呢,就交个Reporter去进行数据的处理。
2.策略模式
数据处理可能记录到文件、也可能调用远端服务器接口进行记录、也可能存储到数据库,对于JVM Monitor来说,不会关心Reporter如何去存储数据,这就是策略模式。
如下上策略接口定义
public interface ResultReporter
{
void report(ReportData data);
}
3.装饰模式
为了不影响JVM Monitor继续后续的工作,对于结果记录我们希望采用异步的方式去处理,然而如果每种策略实现者都需要自己去处理异步,当然是一个很冗余乏味的工作,我们使用装饰模式来处理
下面是异步Reporter的实现(代码做了裁减)
public class AysnResultReporter implements ResultReporter
{
private final static Log LOGGER = LogFactory.getLog(AysnResultReporter.class);
private ResultReporter targetResultReporter;
private ExecutorService executorService;
public AysnResultReporter(ResultReporter targetResultReporter,
ExecutorService executorService)
{
super();
this.targetResultReporter = targetResultReporter;
this.executorService = executorService;
}
public void report(final ReportData data)
{
this.executorService.execute(new Runnable()
{
public void run()
{
targetResultReporter.report(data);
}
});
}
}
看下面的示例
ResultReporter reporter = new AsynResultReporter(new FileReporter(...), executorService);
//异步、文件Reporter
ResultReporter reporter = new AsynResultReporter(new HessianReporter(...), executorService);
//异步、Hessian Reporter
4.组合模式
我们的目标当然不仅仅这么简单,为了保证采集的数据一定会被记录,我们可能要求首先使用远程模式记录,而远程模式记录错误时,则使用文件记录,或者我们可能要求使用多个Reporter同时记录,我们看看组合模式如何处理的
看看ListResultReporter的实现
public class ListResultReporter implements ResultReporter
{
private final static Log LOGGER = LogFactory
.getLog(ListResultReporter.class);
private boolean isAndMode = true;
private List<ResultReporter> list = new ArrayList<ResultReporter>();
public ListResultReporter()
{
this(true);
}
public ListResultReporter(boolean isAndMode)
{
this.isAndMode = isAndMode;
}
public void addResultReporter(ResultReporter reporter)
{
this.list.add(reporter);
}
public void report(ReportData data)
{
for (ResultReporter reporter : list)
{
if (isAndMode)
{
reporter.report(data);
} else
{
try
{
reporter.report(data);
return;
} catch (Exception e)
{
LOGGER.error("Error When Report[" + reporter + "]", e);
}
}
}
}
}
看看怎么使用
ListResultReporter reporter = new ListResultReporter();
reporter.addResultReporter(new FileReporter(...));
reporter.addResultReporter(new HessianReporter(...));
5.适配器模式
我们知道,对于数据库的写入,一次批量写总是要比多次写要高效地多,因此对于数据库的Reporter,会使用一个BatchResultReporter的接口,而Monitor使用的是ResultReporter接口,因此需要在它们之间做一个适配
BatchResultReporter接口
public interface BatchResultReporter
{
void reportBatch(List<ReportData> datas);
}
适配器
public class BatchReporterAdapter implements ResultReporter
{
private final static Log LOGGER = LogFactory
.getLog(BatchReporterAdapter.class);
private final Object LOCK = new Object();
private BatchResultReporter targetBatchResultReporter;
private long maxBatchSize = 1000L;
private List<ReportData> datas = new ArrayList<ReportData>();
public BatchReporterAdapter(BatchResultReporter batchResultReporter)
{
super();
this.targetBatchResultReporter = batchResultReporter;
}
public void setMaxBatchSize(long maxBatchSize)
{
this.maxBatchSize = maxBatchSize;
}
public void report(ReportData data)
{
List<ReportData> oldDatas = null;
synchronized (LOCK)
{
this.datas.add(data);
if (this.datas.size() >= this.maxBatchSize)
{
oldDatas = this.datas;
this.datas = new ArrayList<ReportData>();
}
}
if (oldDatas != null)
{
commit(oldDatas);
}
}
public void commit()
{
List<ReportData> oldDatas = null;
synchronized (LOCK)
{
oldDatas = this.datas;
this.datas = new ArrayList<ReportData>();
}
commit(oldDatas);
}
protected void commit(List<ReportData> datas)
{
LOGGER.info("commit batch report data[" + datas.size() + "]");
try
{
this.targetBatchResultReporter.reportBatch(datas);
} catch (Exception e)
{
LOGGER.error("Error When commit batch datas", e);
}
LOGGER.info("commit success");
}
}
6.工厂模式
如何将上面这些各种各样的Reporter创建出来呢,我们可以选择使用简单xml配置的方式来管理这些Reporter并创建,我们也可以依赖于其他的创建工厂,譬如Spring,这就是工厂模式
工厂接口如下
public interface ReporterFactory
{
ResultReporter createReporter(String name);
}
分享到:
相关推荐
常规的电磁波无线随钻仪能够传送的信号参数有井斜、方位、工具面、磁场强度、重力和温度等,而美国BlackStar EM-MWD电磁波无线随钻仪除了可以测量上述参数之外,还可以测得高边伽马、低边伽马,这两个值对于判断煤层顶...
Dax tools for scalp DE30 german 30 index
LBS^2 blackstar
BLACK STAR.apk.1
BlackStar电磁波无线随钻测斜仪应用分析.pdf
应用空气潜孔锤技术在中硬-硬岩层中钻进效率高,钻孔质量好,将Blackstar电磁波无线随钻测量系统与空气潜孔锤技术相结合,在救援钻孔施工中既能提高钻进速度,又能保证钻孔精度。介绍了电磁波无线随钻测量系统工作原理,...
java设计模式资料汇总,主要java 21种设计模式详细说明,java与模式、建模语言概述;
黑星BlackStar是Roblox的所有标志和检查的一系列绕过步骤,以及详细而严格的解释,以帮助学习而不是用勺子喂食。 计划进行绕过的步骤包括memcheck,retcheck,hookcheck,FindWindowA,禁用日志,心跳和VEH。 Black...
《JAVA多线程设计模式》中包含JAVA线程的介绍导读,12个重要的线程设计模式和全书总结以及丰富的附录内容。每一章相关线程设计模式的介绍,都举一反三使读者学习更有效率。最后附上练习问题,让读者可以温故而知新,...
(修改消息中key为temp的值为15.36),点击勾进行保存节点修改后,必须点击右下角勾进行规则链的保存节点删除点击面板中的节点消息变换,点击节点右上角x按钮
基于Linux嵌入式平台BeagleBone Black的EtherCAT主站设计.pdf
blackjack经典21点小游戏,源码绝对可用,适合课程设计噢
BlackICE
BLACK
Black
bible black.torrent