我正在设计一个监控组件可用性的应用程序。
首先,我要有一个计划程序来定期运行可用性检查(例如作业)。
有一些组件(以及预计将来会支持更多组件)需要进行监控,并且每种组件都有不同的方法来确定它是否可用。
所以我想我会用一个名为验证的抽象布尔方法做一个抽象的 ComponentStatusVerifier 类,对于每个组件我创建一个子类来实现特定的验证策略。
但问题有点复杂。该应用程序应支持在两个不同的平台上运行(例如服务器,并且将来可能支持更多平台),并且要监视的组件集取决于部署应用程序的平台。
可以为每个目标服务器单独构建应用程序,也可以让应用程序知道它在配置中的运行位置 - 所以问题不在于如何让应用程序知道它在哪里运行。
我的问题是如何补充应用程序的设计以支持这些运行模式,同时不会失去各个类的高凝聚力。
答案 0 :(得分:1)
您可以让ComponentStatusVerifier
检查一个组件,同时检查 您的verify
方法应该进行一些扩展以支持它:它应该接收相关的参数:就像应用程序所在的平台一样:
interface ComponentStatusVerifier {
boolean verify(VerificationParameters parameters);
}
interface VerificationParameters {
Platform getPlatform();
}
enum Platform {
PLATFORM1,
PLATFORM2 // ...
}
此外,根据您的描述,似乎某些诊断信息很重要,而不是简单的boolean
结果。为此,我创建了一个消息列表,其中包含验证程序可以报告的信息,如下所示:
interface ComponentStatusVerifier {
VerificationResults verify(VerificationParameters parameters);
}
interface VerificationResults {
boolean succeeded();
Iterable<Message> getMessages();
}
interface Message {
string getDescription();
MessageType getType();
}
enum MessageType {
INFO,
WARNING,
ERROR
}
(请注意,我已经使用接口和枚举来展示概念,适当地进行调整......)
在不支持的平台上运行的验证程序可以执行此操作:
class Platform1SomeComponentVerifier implements ComponentStatusVerifier {
@Override
public VerificationResults verify(VerificationParameters parameters) {
VerificationResults results = new ...
if (parameters.getPlatform() != Platform.PLATFORM1) {
results.addMessage(
new InfoMessage("Skipping verification of component, platform is not PLATFORM1"));
return results;
}
...
}
}
答案 1 :(得分:0)
好的,根据你的描述,听起来你应该有一个 ComponentStatusVerifier 。
该对象应包含 ComponentConnectorClass 。
ComponentConnectorClass 应包含将运行的 Verifier 类列表,并检查您需要验证的所有内容。
或者您应该能够运行 ComponentConnectorClass ,然后为其提供一个 Verifier 类的列表。
答案 2 :(得分:0)
有几种方法可以解决这个问题。
您可以配置要在监控应用程序中验证的所有应用程序。这是灵活的,可扩展到某一点。
另一种方法(尽管更具侵入性)是让您的应用程序在监视应用程序中进行自我注册。这样,监视器唯一要做的就是调用已注册的应用程序。由于您的监控应用程序可能“笨拙”,因此这也非常灵活且可扩展。
我建议使用Yochai的建议架构,并且有多个Verifier类,每个类都实现了另一种验证方式,尽管是http请求,rmi等。
答案 3 :(得分:0)
您可以编写proxy class来进行必要的编码,以检查它是否还活着。
// Remote box
class remoteObject {
int check() {
// I write code for this universe
// is multiverse true ?
}
}
class remoteObjectProxy {
remoteObject y;
int check() {
// do things necessary
return y.check();
}
}
// Your box
class localProxy {
remoteObjectProxy z;
int check() {
// do things necessary
return z.check();
}
}