Jython + Tomcat

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
wnagy
User
Beiträge: 6
Registriert: Montag 12. April 2010, 07:40

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
Zuletzt geändert von Anonymous am Donnerstag 9. Februar 2012, 09:56, insgesamt 1-mal geändert.
Grund: Quelltexte in entsprechende Code-Tags gesetzt.
wnagy
User
Beiträge: 6
Registriert: Montag 12. April 2010, 07:40

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
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

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.
wnagy
User
Beiträge: 6
Registriert: Montag 12. April 2010, 07:40

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...
wnagy
User
Beiträge: 6
Registriert: Montag 12. April 2010, 07:40

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)
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/
wnagy
User
Beiträge: 6
Registriert: Montag 12. April 2010, 07:40

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
Antworten