编写一个可以从不同的JVM停止的长期存在的Java类

时间:2011-07-22 00:32:19

标签: java

我正在寻找任何教程/示例,其中显示了编写独立Java类的最佳实践,该类将像服务器一样运行(没有退出),并且可以通过从不同的调用发出另一个命令来停止JVM(有点像Tomcat服务器)。是在java.util.concurrent中查找类的最佳方法,因为有一些有趣的类,如CountDownLatch?一个例子真的很有帮助。感谢。

2 个答案:

答案 0 :(得分:2)

不确定你在寻找什么。

这是一个简单的服务器,可以很高兴地计入MAXINT并再次返回,直到它停止。

您可以使用JConsole来阻止它。

Server.java

import javax.management.*;
import java.lang.management.*;
import java.util.concurrent.atomic.AtomicBoolean;

public class Server implements ServerMBean {
    AtomicBoolean running;

    public void register() throws Exception {
        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
        ObjectName serverBeanName = null;
        serverBeanName = new ObjectName("ServerBean:name=TestBean");
        mbs.registerMBean(this, serverBeanName);
    }

    public void stop() {
        running.set(false);
    }

    public void runServer() throws Exception {
        int cnt = 0;
        running = new AtomicBoolean(true);
        while(running.get()) {
            Thread.sleep(1000);
            System.out.println("tic tic " + cnt++);
        }
    }

    public static void main(String args[]) throws Exception {
        Server bean = new Server();
        bean.register();
        bean.runServer();
    }
}

ServerMBean.java

public interface ServerMBean {
    public void stop();
}

这会注册一个简单的JMX MBean,它有一个方法(停止),它将运行变量设置为“false”,从而停止循环。请注意,'running'是一个AtomicBoolean,因为这很重要。如果你使用普通的布尔值,很可能永远不会停止。它也可以使用volatile布尔值。

如果启动服务器(Java Server)然后启动JConsole,它将提供Server作为连接的进程。然后转到MBeans选项卡,找到ServerBean - > TestBean - >操作 - >在树视图中停止,然后单击停止按钮,服务器将停止。

你想要服务器做什么,我不知道。但这让你体会到可以做什么,什么,40行代码......

答案 1 :(得分:0)

JMX可以是远程控制Java应用程序的解决方案。此answer提供了用于关闭JVM的基于JMX的解决方案的详细信息。

请注意,JMX也可以通过网络控制您的应用程序。如果您不想冒恶意远程关机的风险,则必须secure the access to the JMX interface。虽然阻止访问JMX端口的防火墙规则在低风险环境中可能已经足够了。