Ho il seguente codice:Perché questo ciclo Jython ha esito negativo dopo una singola esecuzione?
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();
}
Per ragioni di completezza, sto aggiungendo il codice 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()
Esso funziona perfettamente, ma solo il 10% del tempo. Se lo eseguo con un main come segue:
public static void main(String[] args)
{
for (int i = 0; i < 10; i++) {
System.out.println(getVersion());
}
}
Funziona la prima volta. Mi dà l'output che desidero, ovvero i dati della richiesta http scritta nel mio file Versions.py
, che il codice java sopra chiama. Dopo la seconda volta, questo errore enorme (che è lungo 950 linee, ma ovviamente non ti torturerò). Ecco l'essenza di esso:
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
mio Python traceback che viene fornita alla fine del 950 linea di Java stack trace è principalmente questo:
File "<string>", line 18, in get_latest_version
urllib2.URLError: <urlopen error [Errno -1] Unmapped exception: java.util.concurrent.RejectedExecutionException: event executor terminated>
Se qualcuno è curioso, la linea apparentemente incriminata in la mia è solo get_latest_version
:
handler = urllib2.urlopen(request)
Poiché il server che il codice sta chiamando è gestito (da CherryPy) sul localhost sulla mia rete, posso vedere come si sta interagendo con il mio server In realtà invia due richieste (e lancia l'eccezione subito dopo il secondo).
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"
Mentre sto mai andare a eseguire questo codice in un ciclo probabilmente, sono abbastanza curioso di sapere due cose:
- è il codice incriminato il mio codice Python o Java? O potrebbe essere solo un problema con Jython del tutto?
- Che cosa significa l'eccezione (sembra un'eccezione java)? Perché viene lanciato quando è? C'è un modo per fare un ciclo come questo? Potrebbe essere scritto meglio?
E 'possibile che si sta accedendo alla risorsa troppo in fretta, che nella prima chiamata a 'getVersion()' hai un blocco sul file che non è stato ancora rilasciato. Puoi provare a chiamare [Thread.sleep] (https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#sleep%28long%29) o [Thread.yield] (https : //docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#yield%28%29) dopo 'getVersion()' nel ciclo? – DaedalusUsedPerl
@DaedalusUsedPerl Proverò a dormire il thread, per quanto pensi che dovrei farlo? Forse 2-3 secondi? – Zizouz212
Anche un secondo potrebbe essere eccessivo, ma non ne sono sicuro. Prova 2 e regola su/giù per adattarsi. – DaedalusUsedPerl