JRuby: закрыть runScriptlet, если это займет слишком много времени? - PullRequest
0 голосов
/ 28 июня 2019

Я хочу использовать JRuby для запуска сценариев Ruby.

Однако мне бы хотелось, чтобы если сценарий занимал больше t секунд, он автоматически закрывался.

Вот моя попытка:

ScriptingContainer ruby = new ScriptingContainer();
int t = 3;

new Thread() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(t * 1000); // Timeout
                        System.out.println("Timeout passed.");
                        ruby.terminate(); // This has no effect?
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }.start();

Object output = ruby.runScriptlet(scriptWithAnInfiniteLoop);
ruby.terminate(); // Terminate without timeout, at the end of the script

1 Ответ

0 голосов
/ 29 июня 2019

Вот ответ, используя устарело Thread.stop():

        ScriptingContainer ruby = new ScriptingContainer();
        int t = 5;

        String script = content;
        Thread runner = new Thread() {
            @Override
            public void run() {
                try {
                    ruby.runScriptlet(script);
                    ruby.terminate(); // Close normally.
                } catch (Exception e) {
                    ruby.terminate(); // Close if JRuby crashes.
                }
            }
        };

        Thread killer = new Thread() {
            @Override
            public void run() {
                try {
                    Thread.sleep(t * 1000);
                    runner.stop();
                    ruby.terminate(); // Close forcefully.
                } catch (Exception e) {}
            }
        };

        runner.start();
        killer.start();

См. Эту статью о том, почему оно устарело: https://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html

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

...