JxBrowser запускается только один раз, если я использую onBeforeSendHeaders - java .lang.IllegalStateException: канал уже закрыт - PullRequest
0 голосов
/ 12 марта 2020

Я использую jxbrowser 5.2 в моем java апплете.

У меня есть метод, который возвращает BrowserContext

    protected BrowserContext initChromiumContext()
    {
        String binariesPath = ContextTool.getInstance().getGeneralProperty("JXBROWSER_CHROMIUM_DIR");
        String chromium_switch = ContextTool.getInstance().getGeneralProperty("JXBROWSER_CHROMIUM_SWITCH");
        String cache_path="";
        String galileoLang=ContextTool.getInstance().getContextData("LANGUAGE").toLowerCase();
        BrowserContext context;
        String OS = System.getProperty("os.name");
        //BrowserPreferences.setChromiumSwitches("--lang="+galileoLang, "--disable-gpu"); //--disable-gpu --disable-gpu-compositing 
        BrowserPreferences.setChromiumSwitches(chromium_switch);
        if(binariesPath!=null && (binariesPath.equals("JAVA_CACHE") || binariesPath.equals("JAVA_CACHE_STRICT")
                || binariesPath.equals("JAVA_CACHE_DISK") ||binariesPath.equals("OS_RELATIVE")

                ))
        {
            String javaCacheDirStr = com.sun.deploy.config.Config.getCacheDirectory();
            try{
                File javaCacheDir = new File(javaCacheDirStr);
                if(javaCacheDir.exists() && javaCacheDir.isDirectory() )
                {
                    File parentDir = null;
                    if(binariesPath.equals("JAVA_CACHE_STRICT") || (binariesPath.equals("OS_RELATIVE")&&OS.toUpperCase().contains("XP") ))
                    {
                        parentDir = javaCacheDir;
                    }

                    if(binariesPath.equals("JAVA_CACHE"))
                    {
                        parentDir = javaCacheDir.getParentFile();
                    }

                    if(binariesPath.equals("JAVA_CACHE_DISK"))
                    {
                        //parentDir = javaCacheDir.getAbsolutePath().re;
                        File[] roots = javaCacheDir.listRoots();
                        parentDir = roots[0];
                    }

                    if(binariesPath.equals("OS_RELATIVE") && !OS.toUpperCase().contains("XP"))
                    {

                        String appo_chrome_temp=System.getenv("CHROMIUMTEMP");
                        if (appo_chrome_temp ==null)
                            appo_chrome_temp=System.getenv("temp");
                        parentDir=new File(appo_chrome_temp);

                    }

                    File chromiumDir = new File(parentDir,"jxbrowser-chromium-"+ChromiumBuild.version());
                    if(!chromiumDir.exists())
                    {
                        chromiumDir.mkdirs();

                    }
                    if(chromiumDir.canWrite())
                    {
                        cache_path=chromiumDir.getAbsolutePath();
                    }
                    else throw new IOException("Cannot write in "+chromiumDir+ " folder. Default chromium dir will be used");
                }
            }catch(Exception e)
            {
                logger.error("Error creating chromium dir in java cache directory", e);
            }
        }
        else if(binariesPath!=null && binariesPath.trim().length()>0)
        {
            binariesPath = binariesPath.trim();
            try{
                File chromiumDir = new File(binariesPath,"jxbrowser-chromium-"+ChromiumBuild.version());
                if(!chromiumDir.exists())
                {
                    chromiumDir.mkdirs();
                }
                if(chromiumDir.canWrite())
                {
                    cache_path=chromiumDir.getAbsolutePath();
                }
                else throw new IOException("Cannot write in "+chromiumDir+ " folder. Default chromium dir will be used");

            }catch(Exception e)
            {
                logger.error("Error creating chromium dir in " + binariesPath, e);
            }
        }

        logger.debug("[JxBrowserComponent.BrowserContext] language: "+galileoLang +" cachePath: " +cache_path);
        if  (cache_path.equals(""))

        {     
            logger.debug("[JxBrowserComponent.BrowserContext] Default Location");
            context = new BrowserContext(BrowserPreferences.getDefaultDataDir(),galileoLang);
        }
        else 
        {
            logger.debug("[JxBrowserComponent.BrowserContext] altered location");
            BrowserPreferences.setChromiumDir(cache_path);
            context = new BrowserContext(cache_path+"/data",galileoLang);
        } 
NetworkService NS = new NetworkService(new IPC(null,null)  ,context.getIdentifier()  );
context.getNetworkService().setNetworkDelegate(new DefaultNetworkDelegate() {

            @Override
            public void onBeforeSendHeaders(BeforeSendHeadersParams params) {




                    HttpHeaders headers = params.getHeaders();



                    logger.debug("###PARAM GET METHOD###  "+ params.getMethod() );
                    logger.debug("###PARAM GET URL###    "+ params.getURL()  );





                    if (params.getMethod().equals("POST") && 
                            ( params.getURL().equals("https://portaleoperatore.azero.veneto.it/LoginOperatori/consensi-paziente") || 
                                    params.getURL().equals("https://portaleoperatore-test.azero.veneto.it/LoginOperatori/consensi-paziente")  
                                    )   )
                    {


                        logger.debug("###MODIFICO HEADER###"  );
                        params.getHeaders().setHeader("Content-Type", "application/json");



                    }



            }
        });




         return context;

    }

Апплет создает элемент браузера каждый раз, когда я открываю панель Swing. Когда я закрываю панель, я запускаю метод dispose на моем экземпляре Browser.

Если я открываю панель Swing во второй раз, я получаю следующую ошибку

ehealth.fgForm - [FgClassLoader. loadClassData] Класс формы, загруженный с сервера: de.gm dnet .webmed.fg.generated.SOLINFO.Panelgraphic_button_bar network: Connessione a http://netgalileotst02.sanita.padova.it: 9080 / webmed / SCart / SFgClassReader con proxy = DIRECT 2020 -03-11 23: 50: 58,247 DEBUG ehealth.fgForm - [FgClassLoader.loadClassData] кэшированный класс: de.gm dnet .webmed.fg.generated.SOLINFO.Panelgraphic_button_bar обновлен, изменен на сервере: 29 июля 2016 14.36.16 CEST local Дата: 29 июля 2016 г. 14.36.16 CEST 2020-03-11 23: 50: 58 263 DEBUG ehealth.fgForm - [JxBrowserComponent.init] os.name значение свойства = Windows 2003 2020-03-11 23 : 50: 58,263 DEBUG ehealth.fgForm - язык [JxBrowserComponent.BrowserContext]: it cachePath: 2020-03-11 23: 50: 58,263 DEBUG ehealth.fgForm - [JxBrowserComponent.BrowserContext] Местоположение по умолчанию 11:50:58 ИНФОРМАЦИЯ: имя ОС Windows 2003 11:50:58 ИНФОРМАЦИЯ: версия JRE: 1.6.0_18-b07 32-разрядная 11:50:58 ИНФОРМАЦИЯ: версия JxBrowser: 5.2 2020-03-11 23: 50: 58,263 ОШИБКА ehealth.fgForm - [PanelJxBrowser. PanelJxBrowser] java .lang.IllegalStateException: канал уже закрыт. на com.teamdev.jxbrowser.chromium.internal.ip c .SocketChannelWriter.write (неизвестный источник) на com.teamdev.jxbrowser.chromium.internal.ip c .SocketChannel.send (неизвестный источник) на com.teamdev .jxbrowser.chromium.NetworkService.a (Unknown Source) на com.teamdev.jxbrowser.chromium.NetworkService.setNetworkDelegate (Unknown Source) в de.gm dnet .webmed.fg.elements.custom.JxBrowserComponent.initChromiumContext (JxBrowserComponent. java: 315) в de.gm dnet .webmed.fg.elements.custom.JxBrowserComponent. (JxBrowserComponent. java: 133) в de.gm dnet .webmed.fg.elements.PanelJxBrowser. ( PanelJxBrowser. java: 89) на de.gm dnet .webmed.fg.generated.SOLINFO.Paneljxb_panel.addChild1 (Paneljxb_panel. java: 94) на de.gm dnet .webmed.fg.generated. SOLINFO.Paneljxb_panel. (Paneljxb_panel. java: 57) на de.gm dnet .webmed.fg.generated.SOLINFO.Formmedication. (Formmedication. java: 3

Я замечаю что если я удалю из кода часть, относящуюся к onBeforeSendHeaders

> context.getNetworkService().setNetworkDelegate(new
> DefaultNetworkDelegate() {
> 
>           @Override
>           public void onBeforeSendHeaders(BeforeSendHeadersParams params) {
> 
>               ... .... ...                     })

проблема не возникает ...

...

Но я нуждаюсь в этом, потому что мне нужно переписать некоторые http-параметры

...