如何从命令行初始化应用程序的java对象

时间:2013-12-27 15:47:44

标签: java ear websphere-7

我有一个在Websphere Application Server(WAS)上运行的ear应用程序(myApp)。我有一个jar(myJar)在启动WAS服务器时加载到myApp的类路径中。 myJar有一个类(MyInitClass),它从数据库读取并将一组数据(myData)加载到内存中。 myApp会多次读取此数据。关键是要将myData放入内存以防止每次使用此数据时都进行数据库调用。这部分效果很好!
我试图提供的解决方案是MyInitClass的手动初始化。 myData会不时更改,我希望能够从命令行重新初始化MyInitClass,这样我就不必重新启动应用程序了。这可能吗?
myApp调用类似这样的类(MyClass):

public static MyInitClass initClass;

public boolean doStuff()
{
    if (initClass == null)
    {
        // this method loads the data into initClass.myData array
        initClass.dataInitializer();
    }
    else
        // no need to reload initClass.myData
}

我在另一个类(MyManualInit)中创建了与此类似的代码:

public static void main(String[] args)
{
    MyClass.initClass = new MyInitClass();
    MyClass.initClass.dataInitializer();
}

当我从命令行运行MyManualInit时,它会打印从myApp初始化期间打印的所有相同调试信息。但myApp无法识别MyInitClass已重新初始化。我从两个进程中打印了System.out.println(System.getProperty(“java.home”))以验证我使用相同的JRE来运行它们。我在这里做了一些明显错误的事情,或者它是不是那样工作?我假设如果我在同一个JRE上运行MyManualInit它会起作用。 MyClass,MyInitClass和MyManualInit都在myJar中 如果您需要更多信息,请与我们联系。

1 个答案:

答案 0 :(得分:1)

你在搅拌东西。 Websphere在JVM的一个实例中运行,并且您的命令行程序实例化一个新的JVM,并且对象不在不同的JVM之间进行通信(至少不需要付出一些努力,启用套接字等)。

实际上你的代码会对你的initClass对象做一个懒惰的初始化,而且没有任何命令行交互就足够了。为什么这对你来说还不够?