0

我想将一些数据存储在静态变量中,并且我希望部署在同一个 JBOSS7 上的所有 Web 服务都能访问这些数据。我认为独立的 JBOSS 在单个 JVM 中运行,所有服务都在同一个 JVM 中运行,因此它们可以访问静态变量。

但是,我注意到当我的网络服务尝试获取数据时,我得到了 NullPointerException。

这是我的存储类:

public enum OneJvmCacheImpl {

    INSTANCE;

    private ConcurrentHashMap<String, Object> values = new ConcurrentHashMap<String, Object>();

    public <T> T get(String key, Class<T> type) {
        return type.cast(values.get(key));
    }

    ...     

}


OneJvmCacheImpl.INSTANCE.get(...);

你能告诉我为什么我不能从我的网络服务中访问这些吗?谢谢,V。

4

2 回答 2

1

如果部署意味着单独的war文件,则静态变量对其他war文件中的其他Web服务将不可见,因为它们是由不同的类加载器加载的。每场战争都有它自己的类加载器,因此它有自己的类的“类实例”。您也许可以通过将相关类移动到在部署之间共享它的地方来解决它,但我建议您无论如何都可以通过使用数据库或分布式缓存来解决它。

于 2013-11-10T11:19:16.100 回答
1

jBoss 绝对不允许您在不同的部署中共享静态变量。那将是一个巨大的安全问题,如果我在你旁边部署一场战争并开始改变你的静态变量......

您需要将这些值保存在数据库、内存缓存或共享文件等其他东西中。

于 2013-11-10T11:13:35.450 回答