Seite 1 von 1
Jython + Tomcat
Verfasst: Dienstag 7. Februar 2012, 15:47
von wnagy
Hallo,
Ich habe ein Servlet geschrieben.
Code: Alles auswählen
from javax.servlet.http import HttpServlet
import sys
from framework import MyForm
class start (HttpServlet):
toClient = None
def out(self,msg):
self.toClient.println (msg)
def doGet(self,request,response):
self.doPost (request,response)
def doPost(self,request,response):
self.toClient = response.getWriter()
response.setContentType ("text/html")
self.out('<html><head><title>Jython Servlet Test</title>')
self.out('<body>Test</body></html>')
self.out('<ul>')
for p in sys.path:
self.out("<li>%(path)s</li>" % {'path':p})
self.out('<ul>')
mf = MyForm(request,response,self.out)
mf.run('?????')
Das funktioniert sowei recht problemfrei.
Wenn ich das Servlet änder werden die Änderungen auch brav gemacht. Das Problem liegt in der importierten Klasse.
Code: Alles auswählen
class MyForm(object):
out = None
request = None
response = None
def __init__(self, request, response, out):
self.out = out
self.request = request
self.response = response
def run (self,msg):
self.out('hier ist **** MyForm: %(msg)s' % {'msg':msg})
Wenn ich dort Änderungen vornehme werden diese nicht durchgeführt. Erst ein Neustart des Tomcat's machen diese sichtbar.
Ich habe schon einiges in der Tomcat Conf probiert. Derzeitiger Zustand der server.xml
Code: Alles auswählen
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" debug="0" >
<Context path="/jythondemo"
reloadable="true"
reload="true"
docBase="../../../webapps/jythondemo"
workDir="../../../webapps/jythondemo/temp"
debug="1">
</Context>
</Host>
</Engine>
Zustand von web.xml
Code: Alles auswählen
<web-app>
<servlet>
<servlet-name>ServletTest</servlet-name>
<servlet-class>ServletTest</servlet-class>
</servlet>
<servlet>
<servlet-name>PyServlet</servlet-name>
<servlet-class>org.python.util.PyServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>PyServlet</servlet-name>
<url-pattern>*.py</url-pattern>
<load-on-startup>1</load-on-startup>
</servlet-mapping>
</web-app>
Hat jemand eine Idee wie ich das hinkriege, dass bei jeder Änderung diese sowohl Übersetzt als auch im Tomcat aktiviert wird?
Weitere Hinweis:
Ich habe das auch schon mit jetty probiert. Selber Effekt.
Besten Dank
Lg
\^/ili
Re: Jython + Tomcat
Verfasst: Mittwoch 8. Februar 2012, 15:38
von wnagy
Lösung, wenn auch ein wenig verwirrend!
Das Serlet liefert in sys.path einen Eintrag auf ./WEB-INF/jython
dort habe ich gedacht, dass alle *.py Dateien liegen sollten. Warum sonst sollte sonst das Verzeichnis im path automatisch einfügt worden sein?.
Wenn man die Klasse in ./classes ablegt wird sie korrekt (wenn auch ein bisschen lähmend) automatisch übersetzt.
lg
\^/ili
Re: Jython + Tomcat
Verfasst: Mittwoch 8. Februar 2012, 16:57
von nomnom
wnagy hat geschrieben:Warum sonst sollte sonst das Verzeichnis im path automatisch einfügt worden sein?.
Weil in `sys.path` Module (nicht Skripte) liegen, die Jython vermutlich braucht.
Re: Jython + Tomcat
Verfasst: Mittwoch 8. Februar 2012, 21:52
von wnagy
nomnom hat geschrieben:wnagy hat geschrieben:Warum sonst sollte sonst das Verzeichnis im path automatisch einfügt worden sein?.
Weil in `sys.path` Module (nicht Skripte) liegen, die Jython vermutlich braucht.
Hmm, wenn ich das Verzeichnis lösche so geschieht nichts. Also scheint Jython nichts weiter zu brauchen sollte ja alles in jython.jar vorhanden sein...
Re: Jython + Tomcat Lösung LEIDER nein!
Verfasst: Donnerstag 9. Februar 2012, 09:49
von wnagy
Hallo,
bei genauem Hinsehen habe ich leider feststellen müssen, dass meine Lösung keine ist!
Wenn ich da Jython File in ./classes ändere, so wird u. A. "Beschwerde" vom Tomcat-Abenteuer Spielplatz gemeldet.
Das erklärt das 'neuladen' der Anwendung.
Gewissensfrage:
1) Arbeite jemand mit Jython?
2) Hat jemand schon eine Webanwendung mit Jython auf einem Tomcat geschrieben?
3) Gibt es alternativen? (Apache + python ist leider für mich im Augenblick keine - ich möchte gerne Java Objkete verwenden)
Mein Problem besteht darin, dass ich ca. 50 Oracle Forms Anwendungen umzustellen habe.
Diese sollten dann auf einer einheitlichen Plattform laufen.
Mir gefällt Python an sich sehr gut und ich hätte gerne darauf gebaut. Bei 50 Anwendunge kann man schon von einer strategischen Entscheidung sprechen
Lg & besten Dank bisher
\^/ili
INFO: Reloading Context with name [/jythondemo] has started
09.02.2012 08:23:25 org.apache.catalina.loader.WebappClassLoader clearReferences
Threads
SCHWERWIEGEND: The web application [/jythondemo] appears to have started a threa
d named [org.python.google.common.base.internal.Finalizer] but has failed to sto
p it. This is very likely to create a memory leak.
09.02.2012 08:23:25 org.apache.catalina.loader.WebappClassLoader clearThreadLoca
lMap
SCHWERWIEGEND: The web application [/jythondemo] created a ThreadLocal with key
of type [java.lang.ThreadLocal] (value [java.lang.ThreadLocal@a9509d]) and a val
ue of type [org.python.core.ThreadState] (value [org.python.core.ThreadState@1eb
9fde]) but failed to remove it when the web application was stopped. This is ver
y likely to create a memory leak.
09.02.2012 08:23:25 org.apache.catalina.loader.WebappClassLoader clearThreadLoca
lMap
SCHWERWIEGEND: The web application [/jythondemo] created a ThreadLocal with key
of type [java.lang.ThreadLocal] (value [java.lang.ThreadLocal@a9509d]) and a val
ue of type [org.python.core.ThreadState] (value [org.python.core.ThreadState@4ca
adb]) but failed to remove it when the web application was stopped. This is very
likely to create a memory leak.
java.lang.NullPointerException
at com.kenai.jffi.Function.finalize(Function.java:177)
at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method)
at java.lang.ref.Finalizer.runFinalizer(Finalizer.java:83)
at java.lang.ref.Finalizer.access$100(Finalizer.java:14)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:160)
java.lang.NullPointerException
at com.kenai.jffi.Function.finalize(Function.java:177)
at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method)
at java.lang.ref.Finalizer.runFinalizer(Finalizer.java:83)
at java.lang.ref.Finalizer.access$100(Finalizer.java:14)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:160)
java.lang.NullPointerException
at com.kenai.jffi.Function.finalize(Function.java:177)
at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method)
at java.lang.ref.Finalizer.runFinalizer(Finalizer.java:83)
at java.lang.ref.Finalizer.access$100(Finalizer.java:14)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:160)
java.lang.NullPointerException
at com.kenai.jffi.Function.finalize(Function.java:177)
at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method)
at java.lang.ref.Finalizer.runFinalizer(Finalizer.java:83)
at java.lang.ref.Finalizer.access$100(Finalizer.java:14)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:160)
java.lang.NullPointerException
at com.kenai.jffi.Function.finalize(Function.java:177)
at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method)
at java.lang.ref.Finalizer.runFinalizer(Finalizer.java:83)
at java.lang.ref.Finalizer.access$100(Finalizer.java:14)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:160)
java.lang.NullPointerException
at com.kenai.jffi.Function.finalize(Function.java:177)
at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method)
at java.lang.ref.Finalizer.runFinalizer(Finalizer.java:83)
at java.lang.ref.Finalizer.access$100(Finalizer.java:14)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:160)
java.lang.NullPointerException
at com.kenai.jffi.Function.finalize(Function.java:177)
at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method)
at java.lang.ref.Finalizer.runFinalizer(Finalizer.java:83)
at java.lang.ref.Finalizer.access$100(Finalizer.java:14)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:160)
java.lang.NullPointerException
at com.kenai.jffi.Function.finalize(Function.java:177)
at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method)
at java.lang.ref.Finalizer.runFinalizer(Finalizer.java:83)
at java.lang.ref.Finalizer.access$100(Finalizer.java:14)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:160)
java.lang.NullPointerException
at com.kenai.jffi.Function.finalize(Function.java:177)
at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method)
at java.lang.ref.Finalizer.runFinalizer(Finalizer.java:83)
at java.lang.ref.Finalizer.access$100(Finalizer.java:14)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:160)
java.lang.NullPointerException
at com.kenai.jffi.Function.finalize(Function.java:177)
at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method)
at java.lang.ref.Finalizer.runFinalizer(Finalizer.java:83)
at java.lang.ref.Finalizer.access$100(Finalizer.java:14)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:160)
java.lang.NullPointerException
at com.kenai.jffi.Function.finalize(Function.java:177)
at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method)
at java.lang.ref.Finalizer.runFinalizer(Finalizer.java:83)
at java.lang.ref.Finalizer.access$100(Finalizer.java:14)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:160)
Re: Jython + Tomcat
Verfasst: Donnerstag 9. Februar 2012, 10:07
von BlackJack
@wnagy: Ad 1) Ich benutze Jython ab und zu um eine Java-Bibliothek nutzen zu können, ohne Java-Quelltext schreiben zu müssen.
Ad 2) Ist aber weder für Tomcat noch eine Webanwendung.
Ad 3) Ich weiss nicht ob es in der Kombination was taugt, aber Django soll wohl auch mit Jython laufen. Produktiv wohl auch in Kombination mit einem Tomcat.
https://docs.djangoproject.com/en/1.3/howto/jython/
Re: Jython + Tomcat akzeptabler Workaround
Verfasst: Donnerstag 9. Februar 2012, 15:37
von wnagy
Liebe Freunde,
nach einigem herumgesuche habe ich ein akzepablen workaround gefunden.
Es existiert einen Tomcat Ersatz.
http://winstone.sourceforge.net/
Dieser startet sehr schnell und ist somit geeignet eine raschen 'reastart' durchzufüren. Tomcat braucht zu lange um konfortabel zu arbeiten.
Ich starte das Ding mit einem Batch (startit.bat)
Code: Alles auswählen
java -jar winstone-0.9.10.jar --webappsDir=webapps --controlPort=8089 & exit
Ein kleines python Skript erstellt:
Code: Alles auswählen
import os
import telnetlib
try:
tn=telnetlib.Telnet('localhost',8089)
tn.write('0')
tn.close()
except:
pass
os.system('start startit.bat & exit')
welches den Restart durchführt.
Die Ausführung habe ich auf eine Tastenkombination auf meine Editor gelegt. Somit ist mit einem Handgriff der Restart durchgführt und in kaum merkbarer Zeit abgelaufen.
So kann ich wenigsten Ausprobieren, ob jython für mich zukunft hat.
lg
\^/ili