0

締め切りに間に合わず、汗だくです。過去数日間、私は問題に取り組んできましたが、今こそ大声で叫ぶときです。

アプリケーション (「APP」と呼びましょう) があり、APP 用に作成された「PerformanceStatistics」MBean があります。また、MBean がアプリケーションのランタイムにアクセスして計算するためのデータを提供するシングルトン データ クラス (「SDATA」と呼びましょう) もあります。したがって、アプリケーションの起動中とその後のアプリケーションのライフサイクル中に、SDATA インスタンスにデータを追加します。そのため、この SDATA インスタンスには常にデータが含まれています。

問題は、PerformanceStatistics MBean からデータまたはデータ構造にアクセスできないことです。データを追加するときにデータ構造を確認すると、すべての構造にデータが含まれています。しかし、MBean からこのシングルトン インスタンスを呼び出すと、空のデータが表示されます。

何が起こっているのか、誰かが説明したり、ヒントを得ることができますか? どんな助けでも大歓迎です。

念のため、あらゆる種類の SDATA クラスを final にして、すべてのメソッドを同期、静的などにしようとしました。しかし、今まで運がありません。

もう1つの残念なことは、異なる「ServicePerformanceData」インスタンスを取得する場合があることです(つまり、 ServicePerformanceData.getInstance() を出力すると、それらは異なる時点で異なります)。何が起こっているのかわからない。このアプリケーションを WebLogic サーバーで実行し、JConsole を使用しています。

シングル トンおよびデータ アクセス メソッドを持つ SDATA クラス

public class ServicePerformanceData {

private Hashtable<String, ServiceExecutionDataCollector> serviceExecutionDataMap = new Hashtable<String, ServiceExecutionDataCollector>();
private HashMap<ServiceExecutionType, String> serviceTypeCountMap = new HashMap<ServiceExecutionType, String>();
private HashSet<String> serviceNameSet = new HashSet<String>();

private static final long DEFAULT_COUNT = 1;
private static final ServicePerformanceData INSTANCE = new ServicePerformanceData();
private Object SYNC = new Object();

private ServicePerformanceData() {
    // don't allow anyone to instantiate this class
}

// clearly this must be a singleton
public static ServicePerformanceData getInstance() {
    return INSTANCE;
}

public void add(ServiceExecutionDataCollector data) {
    // I just add some runtime information to the data structures in this INSTANCE
    synchronized (SYNC) {
        if (INSTANCE.serviceTypeCountMap.containsKey(data.getServiceType())) {
            String count = INSTANCE.serviceTypeCountMap.get(data.getServiceType());
            INSTANCE.serviceTypeCountMap.put(data.getServiceType(), Integer.toString(Integer.parseInt(count) + 1));
        } else {
            INSTANCE.serviceTypeCountMap.put(data.getServiceType(), Integer.toString(1));
        }

        INSTANCE.serviceExecutionDataMap.put(data.getServiceName(), data);
        INSTANCE.serviceNameSet.add(data.getServiceName());
    }
}

public int getServiceTypeCount(ServiceExecutionType type) {
    if (INSTANCE.serviceTypeCountMap.containsKey(type)) {
        return Integer.parseInt(INSTANCE.serviceTypeCountMap.get(type));
    }
    return 0;
}

public Set getNameList() {
    return INSTANCE.serviceNameSet;
}

// I am copying all the data just to make sure that data structures have data
public void copyAllMasterData() {
    synchronized (SYNC) {
        serviceExecutionDataMap.putAll(ServicePerformanceData.INSTANCE.serviceExecutionDataMap);
        serviceNameSet.addAll(ServicePerformanceData.INSTANCE.serviceNameSet);
        serviceTypeCountMap.putAll(ServicePerformanceData.INSTANCE.serviceTypeCountMap);
    }
}

}

PerformanceStatistics MBean クラスServicePerformanceData .getInstance() のようなデータを呼び出すと、その構造には何もありません。したがって、私はこれで結果を得ることができません。

public class PerformanceStatistics
    implements PerformanceStatisticsMBean {

public void completeExecutionDump() {
    //
}


public int getexecuteSSCount() {
    return ServicePerformanceData.getInstance().getServiceTypeCount(ServiceExecutionType.ADD);
}

public String executionInfo(String serviceName) {
    // GIVES EMPTY LIST EVEN THOUGH THE ACTUAL instance HAS THE DATA
    return ServicePerformanceData.getInstance().getExecutionInfo(serviceName.trim());
}

public String calledServicesArray() {
    // servicePerformanceData DOES NOT CONTAIN ANY DATA EVEN THOUGH THE ACTUAL instance HAS THE DATA
    ServicePerformanceData servicePerformanceData = ServicePerformanceData.getInstance();
    servicePerformanceData.copyAllMasterData();

    System.out.println("ServicePerformanceData.INSTANCE" + ServicePerformanceData.getInstance());
    System.out.println(servicePerformanceData);

// GIVES EMPTY LIST EVEN THOUGH THE ACTUAL instance HAS THE DATA
    System.out.println("Name List" + ServicePerformanceData.getInstance().getNameList());

    return ServicePerformanceData.getInstance().getNameList().toString();
}

}

4

3 に答える 3

0

最初にすべての「インスタンス」を削除します。: それらは必要ありません。serviceNameSet = INSTANCE.serviceNameSet = ServicePerformanceData.INSTANCE.serviceNameSet : 同じことです。

次に、メソッド copyAllMasterData が何もしないことに気付くでしょう。セットから要素を取得し、それらを同じセットに配置するだけです。セット (serviceNameSet など) にデータを配置する唯一の場所は、add メソッド内にあり、それ (add メソッド) がどこにも呼び出されていません。

于 2009-08-14T15:38:01.390 に答える
0

クラスが異なるクラスローダーからロードされている可能性がありますか?

于 2009-08-03T07:57:15.307 に答える