ich den folgenden Code haben:Warum schlägt diese Jython-Schleife nach einem einzigen Durchlauf fehl?
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();
}
Aus Gründen der Vollständigkeit, ich bin der Python-Code hinzufügen:
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()
Es funktioniert einwandfrei, aber nur 10% der Zeit. Wenn ich es mit einem Haupt wie folgt ausführen:
public static void main(String[] args)
{
for (int i = 0; i < 10; i++) {
System.out.println(getVersion());
}
}
Es funktioniert das erste Mal. Es gibt mir die Ausgabe, die ich will, das sind die Daten aus der http-Anfrage, die in meiner Versions.py
Datei geschrieben ist, die der obige Java-Code aufruft. Nach dem zweiten Mal wirft es diesen massiven Fehler (der 950 Zeilen lang ist, aber natürlich werde ich euch nicht foltern). Hier ist der Kern von ihm:
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
Mein Python Zurückverfolgungs, die am Ende des 950 Zeile Java-Stack-Trace geliefert wird, ist vor allem dieser:
File "<string>", line 18, in get_latest_version
urllib2.URLError: <urlopen error [Errno -1] Unmapped exception: java.util.concurrent.RejectedExecutionException: event executor terminated>
Wenn jemand neugierig, die scheinbar störende Zeile in mein get_latest_version
ist nur:
handler = urllib2.urlopen(request)
Seit dem Server, wobei der Code laufen ruft (von cherrypy) ist auf dem lokalen Host im Netzwerk, kann ich sehen, wie es ist, die Interaktion mit mein Server. Es sendet tatsächlich zwei Anfragen (und wirft die Ausnahme gleich nach der zweiten).
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"
Während ich wahrscheinlich nie diesen Code in einer Schleife laufen gehen, ich bin sehr neugierig, wie zwei Dinge:
- Sind der betreffende Code meines Python oder Java-Code? Oder könnte es überhaupt ein Problem mit Jython sein?
- Was bedeutet die Ausnahme (es sieht wie eine Java-Ausnahme aus)? Warum wird es geworfen, wenn es ist? Gibt es eine Möglichkeit, eine solche Schleife funktionieren zu lassen? Könnte das besser geschrieben werden?
Es ist möglich, dass Sie die Ressource zu schnell zuzugreifst, dass in dem ersten Aufruf von 'getVersion()' Du bekommst eine Sperre für die Datei, die noch nicht freigegeben wurde. Können Sie versuchen, [Thread.sleep] (https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#sleep%28long%29) oder [Thread.yield] (https : //docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#yield%28%29) nach 'getVersion()' in der Schleife? – DaedalusUsedPerl
@DaedalusUsedPerl Ich werde versuchen, den Thread zu schlafen, wie lange denkst du, dass ich das tun sollte? 2-3 Sekunden vielleicht? – Zizouz212
Selbst eine Sekunde ist vielleicht zu viel, aber ich bin mir nicht sicher. Probieren Sie 2 aus und passen Sie sie an, um sie anzupassen. – DaedalusUsedPerl