1

我正在设计一个应用程序来监视组件的可用性。

所以首先我有一个Scheduler来定期运行可用性检查(例如Jobs)。

有几个组件(预计将来会支持更多组件)需要监控,并且每个组件都有不同的方法来确定它是否可用。

所以我想我会用一个名为verify的抽象布尔方法来做一个抽象的ComponentStatusVerifier类,并为每个组件创建一个子类来实现特定的验证策略。

不过问题有点复杂。应用程序应该支持在两个不同的平台上运行(例如服务器,并且将来有可能支持更多平台),并且要监视的组件集取决于部署应用程序的平台。

可以为每个目标服务器单独构建应用程序,或者通过配置让应用程序知道它在哪里运行 - 所以问题不在于如何让应用程序知道它在哪里运行。

我的问题是如何补充应用程序的设计以支持这些运行模式,同时不失去各个类的高内聚性。

4

4 回答 4

1

您可以让您的ComponentStatusVerifierthat 检查一个组件还检查它是否应该在运行时根据它的运行位置进行验证。您的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;
    }

    ...
  }
}
于 2012-07-03T14:40:34.147 回答
0

好的,根据您的描述,听起来您应该有一个ComponentStatusVerifier

该对象应该包含一个ComponentConnectorClass

ComponentConnectorClass应该包含一个Verifier类的列表,这些类将运行并检查您需要验证的所有内容。

或者你应该能够运行ComponentConnectorClass,然后给它一个Verifier类的列表来使用。

于 2012-07-03T07:32:20.183 回答
0

有几种方法可以解决这个问题。

您可以配置所有应用程序以在您的监控应用程序中进行验证。这在一定程度上是灵活和可扩展的。

另一种方法(尽管更具侵入性)是让要检查的应用程序在监控应用程序中注册它们自己。这样,您的监视器唯一要做的就是调用已注册的应用程序。这也是非常灵活和可扩展的,因为您的监控应用程序可能是“愚蠢的”。

我建议使用提议的 Yochai 架构,并有多个验证器类,每个验证器类都实现另一种验证方式,尽管是 http 请求、rmi 等。

于 2012-07-03T07:41:36.460 回答
0

您可以编写代理类来进行必要的编码以检查它是否还活着。



    // 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();
        }
    }


于 2012-07-03T08:01:04.400 回答