2010-08-02 1 views
1

Можно ли ограничить время, в течение которого пользовательский код работает в JRuby?Ограничение времени выполнения кода пользователя (JRuby)

+0

Извините за туманность. Пользователь предоставил рубиновый код в моем приложении Java, поэтому мне нужен способ запустить его только в течение определенного времени. Это необходимо, потому что пользователь может написать код, который приводит к бесконечным циклам, которых следует избегать. – instantsetsuna

+0

Я не знаю, как это сделать на Java, но в Ruby вы можете сделать это с помощью библиотеки Timeout: http://www.ruby-doc.org/stdlib-1.9.3/libdoc/timeout/rdoc/Timeout. html –

ответ

2

Не знаю, как вы встраивание кода на Ruby, но вы можете легко иметь таймер нить фона, который оценивает

raise YourTimeLimitExceededException, 'no more time' 

после определенного периода времени. Вы также хотите отключить Thread.new и Thread.start (а также java.lang.Thread.new) для кода пользователя, или они могут легко обойти ваш таймер.

+0

Можете ли вы подробнее рассказать о своем ответе? (Я использую JRuby-embed) – instantsetsuna

+0

Имейте фоновый поток, чтобы измерить потраченное время и вызовите 'scriptingContainer.evalScriptlet (« raise Timeout :: Timeout »)' из потока таймера. Вы можете использовать фьючерсы java.util.concurrent, чтобы помочь убедиться, что таймаут не поднят, если скрипт завершится вовремя. –

+0

Спасибо за ответ, я посмотрю! :) – instantsetsuna