Я ищу какой-либо учебник/пример, в котором показаны лучшие практики для написания автономного Java-класса, который будет работать как сервер (без выхода) и может быть остановлен путем выдачи другой команды из другого вызова JVM (вроде сервера Tomcat). Лучше всего искать классы в java.util.concurrent, так как есть интересные классы, такие как CountDownLatch? Пример был бы действительно полезен. Благодарю.Написание долговечного Java-класса, который можно остановить из другого JVM
ответ
Не знаете, что вы ищете.
Вот тривиальный сервер, который с радостью рассчитывает на 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 строк кода ...
JMX может быть решением для удаленного управления Java-приложением. В этом answer представлена подробная информация о решении JMX для отключения JVM.
Обратите внимание, что JMX позволяет управлять вашим приложением по сети. Если вы не хотите рисковать вредоносным удаленным выключением, вам нужно будет secure the access to the JMX interface. Хотя правило брандмауэра блокировать доступ к порту JMX может быть достаточно хорошим в средах с низким уровнем риска.
- 1. Остановить аудиоклип из другого сценария
- 2. Загрузить существующие объекты класса в JVM из другого JVM
- 3. Остановить медиапланер, который был запущен из другого приложения
- 4. Java: взаимодействие с JFrame другого процесса (JVM)
- 5. Остановить WebSphere JVM в срок?
- 6. Написание сценария bash для перезапуска JVM
- 7. Как можно десериализовать объект класса, который поступает из другого проекта?
- 8. Java - Как остановить аудиоклип из другого класса
- 9. Как остановить поток из другого потока
- 10. Как остановить таймер из другого viewControllers
- 11. Как остановить проигрыватель VLC из другого приложения?
- 12. Как остановить поток из другого потока?
- 13. Java - остановить поток из другого класса
- 14. Попытка остановить таймер из другого класса
- 15. Как остановить ReadDirectoryChangesW из другого потока
- 16. Как можно «остановить» повешение?
- 17. Выполнить C# из JVM
- 18. Написание java.net.SocketImplFactory
- 19. Можно ли остановить ходунка?
- 20. Можно ли вызвать php-скрипт из другого?
- 21. Написание R-пакета, который отличается для архитектуры
- 22. Остановить функцию onclick от другого
- 23. JVM из памяти
- 24. Написание другого текстового файла на основе сохраненного файла из Tkinter
- 25. Написание конструктора принимает аргумент перечисления из другого класса
- 26. Глобальный статус в JVM, который записывает OutOfMemoryError?
- 27. XmlHttpRequest - можно прочитать JSON из другого домена?
- 28. Какую еще альтернативу можно остановить?
- 29. написание другого текста в каждом аспекте ggplot
- 30. Можно ли запустить JVM android на ПК?
Спасибо за хороший пример. Как можно было бы использовать этот тип логики без вызова Thread.sleep()? – John
На самом деле это дает мне больше идей. Я могу просто использовать CountdownLatch (1) вместо AtomicBoolean и в методе stop вызвать метод countDown(). – John
The Thread.sleep был просто там, чтобы приостановить простой цикл. Вы не хотите использовать CountDownLatch. CountDownLatches - это одноразовые переключатели, которые лучше использовать для хранения вещей, а не останавливать их позже. У меня есть несколько потоков, ожидающих на одном CDL для основной системы, чтобы инициализировать все, затем я установил защелку на 0, и они ушли в гонки. После его установки на 0 вы не можете сбросить его. AtomicBoolean - хороший выбор для этого, поскольку это просто глобальное состояние, указывающее на запуск основного цикла. –