Как работает SingleInstanceService Jnlp Api?

Как уже упоминалось, 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?


person hemali    schedule 12.01.2011    source источник
comment
Вы спрашиваете, как его использовать или как он реализован?   -  person finnw    schedule 12.01.2011
comment
Я не спрашиваю, как его использовать, я спрашиваю, как он работает? я уже упоминал, как он используется, и я использовал это также с моим приложением, но не понял, как он перестает регистрировать другой экземпляр приложения.   -  person hemali    schedule 12.01.2011


Ответы (2)


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

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

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"));
person WizardsOfWor    schedule 20.08.2013

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

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

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

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

person kazanaki    schedule 17.03.2014