Как работает SingleInstanceService из Jnlp Api? - PullRequest
2 голосов
/ 12 января 2011

Как уже упоминалось, SingleInstanceService позволяет приложениям, запущенным в Java Web Start, регистрироваться как синглтоны и передаваться в новых наборах параметров, когда пользователь пытается запустить их новые экземпляры.

Как это работает?

Мы регистрируем списков в сервисе один раз, и он не позволяет ему создать еще один экземпляр. Но в основном, как он работает, я не получаю.

SingleInstanceService sis; 
    ... 

    try { 
        sis = (SingleInstanceService)ServiceManager.lookup("javax.jnlp.SingleInstanceService");
    } catch (UnavailableServiceException e) { sis=null; }

    ...


    // Register the single instance listener at the start of your application

    SISListener sisL = new SISListener();
    sis.addSingleInstanceListener(sisL);

    ...


    // Remember to remove the listener before your application exits

    sis.removeSingleInstanceListener(sisL);
    System.exit(0);


    // Implement the SingleInstanceListener for your application

    class SISListener implements SingleInstanceListener {
        public void newActivation(String[] params) {

            // your code to handle the new arguments here

            ...
        }
    }

то, что я хочу знатьэто то, как он не разрешит другой экземпляр, когда мы свяжем наше приложение с SingleInstanceListener?

Ответы [ 2 ]

0 голосов
/ 17 марта 2014

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

Если он не может подключиться, он знаетчто это первый экземпляр (или предыдущий был закрыт), и он запускает приложение в обычном режиме.

Это хорошо известный прием для принудительного применения единичных экземпляров приложений.Вы, конечно, можете реализовать это сами, просто у функции SingleInstance она уже есть для вас.

0 голосов
/ 20 августа 2013

Это старый, но нет ответа.

Я нашел этот пост, который мне помог.

http://tech.chitgoks.com/tag/singleinstancelistener/

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

 Runnable r = new Runnable()
 {

            public void run()
            {
                SingleInstanceService       isis  = null;
                try { 
                    isis = (SingleInstanceService) ServiceManager.lookup("javax.jnlp.SingleInstanceService");
                    isis.removeSingleInstanceListener(this);
                }
                catch(Throwable t)
                {
                    //...
                }
            }
 }; 
        Runtime.getRuntime().addShutdownHook(new Thread(r, "shutdown singleton instance"));
...