2011-07-22 2 views
0

Я ищу какой-либо учебник/пример, в котором показаны лучшие практики для написания автономного Java-класса, который будет работать как сервер (без выхода) и может быть остановлен путем выдачи другой команды из другого вызова JVM (вроде сервера Tomcat). Лучше всего искать классы в java.util.concurrent, так как есть интересные классы, такие как CountDownLatch? Пример был бы действительно полезен. Благодарю.Написание долговечного Java-класса, который можно остановить из другого JVM

ответ

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, который имеет один метод (стоп), который устанавливает текущую переменную с "ложным", и, таким образом, останавливает цикл. Обратите внимание, что «running» - это AtomicBoolean, так как это важно. Если вы использовали обычное логическое значение, вполне возможно, что это никогда не остановится. Он также работал бы с volatile boolean.

Если вы запустите сервер (java Server), а затем запустите JConsole, он предложит сервер как процесс подключения. Затем перейдите на вкладку MBeans, найдите ServerBean -> TestBean -> Operations -> stop в древовидном представлении и нажмите кнопку остановки, и сервер остановится.

Что вы хотите, чтобы ваш сервер работал, я не знаю. Но это дает вам представление о том, что можно сделать, что, 40 строк кода ...

+0

Спасибо за хороший пример. Как можно было бы использовать этот тип логики без вызова Thread.sleep()? – John

+0

На самом деле это дает мне больше идей. Я могу просто использовать CountdownLatch (1) вместо AtomicBoolean и в методе stop вызвать метод countDown(). – John

+0

The Thread.sleep был просто там, чтобы приостановить простой цикл. Вы не хотите использовать CountDownLatch. CountDownLatches - это одноразовые переключатели, которые лучше использовать для хранения вещей, а не останавливать их позже. У меня есть несколько потоков, ожидающих на одном CDL для основной системы, чтобы инициализировать все, затем я установил защелку на 0, и они ушли в гонки. После его установки на 0 вы не можете сбросить его. AtomicBoolean - хороший выбор для этого, поскольку это просто глобальное состояние, указывающее на запуск основного цикла. –

0

JMX может быть решением для удаленного управления Java-приложением. В этом answer представлена ​​подробная информация о решении JMX для отключения JVM.

Обратите внимание, что JMX позволяет управлять вашим приложением по сети. Если вы не хотите рисковать вредоносным удаленным выключением, вам нужно будет secure the access to the JMX interface. Хотя правило брандмауэра блокировать доступ к порту JMX может быть достаточно хорошим в средах с низким уровнем риска.

Смежные вопросы