2013-02-23 2 views
0

Как создать реальный синглтон для всего компьютера в Java?True singleton для всего компьютера?

У меня есть консольное приложение, написанное на Java. если приложение выполняется во второй раз, я хочу, чтобы он знал, что основное приложение уже запущено (и выполняет задания). Второе выполнение просто позволит пользователю запрашивать данные (задания). Я знаю, что могу создать файл и написать ему все, но тогда мне придется также поддерживать сбрасывание компьютеров и т. Д.

Есть ли лучший способ сделать это?

резюмировать:

  • я запустить приложение. Он имеет рабочие места и выполняет их в нужный промежуток времени.
  • Я запускаю приложение во второй раз. Я получаю сообщение о том, что задания уже запущены, и я могу запрашивать данные из первого приложения.
  • Запустите приложение в третий раз, и оно работает так же, как и во второй раз.
  • Если я останавливаю первый экземпляр и запускаю новый, он работает как первый экземпляр.

P.S. Я знаю, что этот вопрос нужно было задавать более одного раза, но поиск google и StackOverflow дает мне ссылки только относительно шаблона проектирования Singleton.

+0

Вы делаете это с помощью сокетов или с чем-то вроде [terracotta] (http://terracotta.org/) –

+1

Одиночные игры - это не очень хорошая идея для одной JVM; Я думаю, что они еще хуже для всех JVM на машине. – duffymo

+6

Попросите ваше первое приложение подключиться к сокету в качестве сервера. Остальные не смогут связываться с этим портом в качестве сервера, пока не умрет первый. В качестве бонуса другие могут затем привязываться как клиент и использовать этот сокет для связи между ними. –

ответ

2

Here - это ссылка, которая будет делать то, что вы хотите.

Это дает пример кода, который связывается с сокетом при запуске, а затем, если что-то обязательно при запуске, то он посылает сообщение

Вы можете использовать это, чтобы communitcate между вашими процессами.

+0

В примере явно указывается один порт сокета. Это может быть неприятно, если какое-либо другое приложение использует один и тот же порт. Альтернативой является распределение порта динамически, запись в порт где-то четко определен (файл, db, реестр, ...), подключение к нему и подтверждение идентификации. –

2

Как упоминалось в комментариях @PaulTomblin, вероятно, вы должны привязать серверный сокет к определенному порту. Это служит двум целям. Если порт в настоящее время не подключен, то текущий процесс становится основным экземпляром. Если порт уже связан, то текущий процесс становится клиентом и вместо этого подключается к порту для связи с основным экземпляром.

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

  • Нет связанных вопросов^_^