У меня есть следующий код:Почему этот цикл Jython терпит неудачу после одного прогона?
public static String getVersion()
{
PythonInterpreter interpreter = new PythonInterpreter();
try
{
interpreter.exec(IOUtils.toString(new FileReader("./Application Documents/Scripts/Version.py")));
PyObject get_version = interpreter.get("get_latest_version");
PyObject result = get_version.__call__(interpreter.get("url"));
String latestVersion = (String) result.__tojava__(String.class);
interpreter.close();
return latestVersion;
} catch (IOException ex) {
ex.printStackTrace();
interpreter.close();
return Version.getLatestVersionOnSystem();
}
Для полноты картины я добавил код Python:
import urllib2 as urllib
import warnings
url = 'arcticlights.ca/api/paint&requests?=version'
def get_latest_version(link=url):
request = urllib.Request(link)
handler = urllib.urllopen(request)
if handler.code is not 200:
warnings.warn('Invalid Status Code', RuntimeWarning)
return handler.read()
version = get_latest_version()
Он работает безотказно, но только 10% времени. Если я запускаю его следующим образом:
public static void main(String[] args)
{
for (int i = 0; i < 10; i++) {
System.out.println(getVersion());
}
}
Это работает в первый раз. Он дает мне вывод, который я хочу, который является данными из http-запроса, который написан в моем файле Versions.py
, который имеет код java выше вызовов. После второго раза он выдает эту массивную ошибку (длина которой составляет 950 строк, но, конечно, я не буду мучить вас, ребята). Вот суть его:
Aug 26, 2015 10:41:21 PM org.python.netty.util.concurrent.DefaultPromise execute
SEVERE: Failed to submit a listener notification task. Event loop shut down?
java.util.concurrent.RejectedExecutionException: event executor terminated
Мой Python отслеживающий, который поставляется в конце 950 строки Java трассировки стека в основном это:
File "<string>", line 18, in get_latest_version
urllib2.URLError: <urlopen error [Errno -1] Unmapped exception: java.util.concurrent.RejectedExecutionException: event executor terminated>
Если кому-то интересно, то, казалось бы, нарушившая линия мой get_latest_version
просто:
handler = urllib2.urlopen(request)
Поскольку сервер, что код вызывающего бежится (по CherryPy) на локальном хосте на моей сети, я могу видеть, как он взаимодействует с мой сервер. Он фактически отправляет два запроса (и выдает исключение сразу после второго).
127.0.0.1 - - [26/Aug/2015:22:41:21] "GET/HTTP/1.1" 200 3 "" "Python-urllib/2.7"
127.0.0.1 - - [26/Aug/2015:22:41:21] "GET/HTTP/1.1" 200 3 "" "Python-urllib/2.7"
В то время как я никогда не буду запускать этот код в цикле, скорее всего, я очень любопытно, как к двум вещам:
- Is обижая код мой Python или Java-код? Или это может быть просто проблема с Jython?
- Что означает исключение (это похоже на исключение Java)? Почему его бросают, когда это происходит? Есть ли способ сделать цикл, подобный этой работе? Может ли это быть написано лучше?
Вполне возможно, что вы обращаетесь к ресурсу слишком быстро, что при первом обращении к 'GetVersion()' вы получили блокировка файла, который еще не выпущен. Можете ли вы попробовать вызвать [Thread.sleep] (https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#sleep%28long%29) или [Thread.yield] (https : //docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#yield%28%29) после 'getVersion()' в цикле? – DaedalusUsedPerl
@DaedalusUsedPerl Я попробую скрыть тему, как долго, по-твоему, я должен это делать? Возможно, 2-3 секунды? – Zizouz212
Даже второй может быть излишним, но я не уверен. Попробуйте 2 и настройте вверх/вниз для соответствия. – DaedalusUsedPerl