编写可以从不同JVM停止的长寿命Java类

编写可以从不同JVM停止的长寿命Java类,java,Java,我正在寻找任何教程/示例,其中展示了编写独立Java类的最佳实践,该类将像服务器一样运行(w/o退出),并且可以通过从JVM的不同调用(有点像Tomcat服务器)发出另一个命令来停止。在java.util.concurrent中查找类的最佳方法是什么,因为那里有一些有趣的类,比如CountDownLatch?举个例子会很有帮助。谢谢。可以作为远程控制Java应用程序的解决方案。这提供了一个基于JMX的解决方案的详细信息,用于关闭JVM 请注意,JMX还可以通过网络控制您的应用程序。如果你不想冒恶

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

可以作为远程控制Java应用程序的解决方案。这提供了一个基于JMX的解决方案的详细信息,用于关闭JVM


请注意,JMX还可以通过网络控制您的应用程序。如果你不想冒恶意远程关机的风险,你必须这样做。尽管防火墙规则阻止对JMX端口的访问在低风险环境中可能已经足够好了。

不确定您在寻找什么

这是一个简单的服务器,它将很高兴地计数到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,它有一个方法(stop),该方法将运行的变量设置为“false”,从而停止循环。请注意,“running”是一个原子布尔值,这一点很重要。如果使用普通布尔值,这很可能永远不会停止。它也适用于易失性布尔值

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


你想让你的服务器做什么,我不知道。但这让您体验了40行代码可以做什么…

谢谢您提供了一个很好的示例。如果不调用Thread.sleep(),我们将如何使用这种类型的逻辑呢?实际上,这给了我更多的想法。我可以简单地使用CountdownLatch(1)而不是AtomicBoolean,并在stop方法中调用countDown()方法。你不想使用倒计时闩锁。倒计时锁存器是一种一次性开关,更好地用于保持状态,而不是稍后停止。我有几个线程在一个CDL上等待主系统初始化所有内容,然后我将闩锁设置为0,它们就可以开始比赛了。一旦设置为0,就无法重置它。AtomicBoolean是一个很好的选择,因为它的全局状态告诉主循环运行。