Visualizzazione post con etichetta resin. Mostra tutti i post
Visualizzazione post con etichetta resin. Mostra tutti i post

martedì, maggio 22, 2007

Apache Resin request dispatch

Per fare in modo che il webserver Apache sappia quali richieste debba servire e quali invece debba passare a Resin, esistono due possibili configurazioni:

1) Resin, tramite il ResinConfigServer, comunica ad Apache quali risorse e' suo compito servire
2) Apache sa esattamente quali risorse deve servire Resin

Io preferisco di gran lunga la seconda :)

<Location "/webapp/jsp/">
CauchoHost localhost 6802
SetHandler caucho-request
</Location>

giovedì, marzo 29, 2007

Resin profiler

Resin dispone di una servlet filter in grado di misurare i tempi di risposta del servlet engine nel servire le richieste HTTP.

E' possibile configurare la servlet filter nel file resin-web.xml (preferibile: essendo una feature di Resin, inserire la configurazione nel file web.xml minerebbe la portabilita' della webapplication su differenti application server) in questo modo:

<!-- resin profiler filter -->

<filter>
<filter-name>resin-profiler-filter</filter-name>
<filter-class>com.caucho.tools.profiler.ProfilerFilter</filter-class>
<init-param>
<param-name>use-query</param-name>
<param-value>false</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>resin-profiler-filter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>

I tempi di risposta misurati dalla servlet filter possono essere visualizzati in un browser, grazie ad una servlet il cui compito e' 'intabellare' i dati, da configurare anch'essa nel file resin-web.xml:

<!-- resin profiler servlet -->

<servlet>
<servlet-name>resin-profiler-servlet</servlet-name>
<servlet-class>com.caucho.tools.profiler.ProfilerServlet</servlet-class>
<init>
<profiler enabled="true" />
</init>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>resin-profiler-servlet</servlet-name>
<url-pattern>/resin-profiler</url-pattern>
</servlet-mapping>

La suddetta servlet, se invocata col parametro in get format=xml, e' in grado di fornire gli stessi dati in formato xml.

E' cosa buona e giusta non permettere a chiunque di vedere i dati raccolti dal 'resin profiler'... una semplice soluzione puo' essere configurare, nel file resin-web.xml, un 'filtro' per l'imitare l'accesso alla servlet 'ProfilerServlet' solo a determinati indirizzi IP:

<security-constraint>
<web-resource-collection>
<url-pattern>/resin-profiler</url-pattern>
</web-resource-collection>
<ip-constraint>
<allow>127.000.000.001/32</allow><!-- localhost -->
<allow>192.168.000.000/16</allow><!-- classe C -->
</ip-constraint>
</security-constraint>

giovedì, marzo 08, 2007

Resin 3.0.19 Hibernate JPA

Sembrerebbe che la versione 3.0.19 di Resin abbia qualche problema con l'implementazione JPA di Hibernate3: nonostante siano state importate tutte le dipendenze e sia stato configurato il file services.xml per l'utilizzo di Hibernate3 come JPA provider, Resin si ostina ad utilizzare Amber come implementazione di JPA.
La stessa webapplication non presenta il problema sopra riportato ne' su Resin 3.0.22, ne' su Resin 3.1.0.

martedì, febbraio 20, 2007

Resin e Jdk Logging

Resin permette di configurare l'output ottenuto dalle api java.util.logging.* nel file di configurazione resin-web.xml:

<resin:set var="logpath" value="~/logs/" />
<resin:set var="logfile" value="${logpath}${app.name}.log" />
<resin:set var="tmstamp" value="[%Y/%m/%d %H:%M:%S.%s]" />

<log name="${app.name}" level="info" path="${logfile}" timestamp="${tmstamp}" size="100mb" format=" ${fmt.sprintf('%-7s %-35s %s',log.level,log.loggerName,log.message)}">
<logger name="net.sf.j2ep" level="fine" />
<logger name="com.opensymphony.oscache" level="info" />
</log>

lunedì, gennaio 22, 2007

resin-web.xml

Il file resin-web.xml contiene direttive e configurazioni custom del servlet engine Resin, relative alla Web Application associata.
La sua presenza e' facoltativa, ma caldamente consigliata, in quanto permette di non 'sporcare' il file di configurazione standard j2ee 'web.xml' con delle configurazioni ad hoc per Resin (comportamento che mina la portabilita' delle web application java fra web container di produttori differenti).
Il file, se presente, si trova nella directory WEB-INF, esattamente come il file web.xml, e come root del documento presenta il seguente tag:

<web-app xmlns="http://caucho.com/ns/resin" xmlns:resin="http://caucho.com/ns/resin/core"></web-app>

martedì, gennaio 09, 2007

Resin 3 e la system property 'javax.servlet.context.tempdir'

In un web container JavaEE la system property 'javax.servlet.context.tempdir' identifica il path della directory temporanea dell'applicazione web.
Di default Resin 3 crea la directory 'tmp' nella directory WEB-INF della document root della webapp.
Nel caso in cui questo comportamento non sia quello voluto, e' possibile riconfigurare il path della directory 'tmp' inserendo nel file di configurazione della webapp 'resin-web.xml':

<temp-dir>~/.my_temp_directory</temp-dir>

lunedì, ottobre 09, 2006

Resin 3: compilare mod_caucho

E' verissimo che Resin funziona alla grande come http server, ma in un tipico ambiente di produzione la configurazione ideale risulta sempre essere Apache + Resin, dove il primo si preoccupa di servire il contenuto statico e di 'proxare' le chiamate che verranno risolte dinamicamente da Resin, mentre il secondo funge da servlet engine / application server.
Il componente che permette suddetta comunicazione tra Apache e Resin e' mod_caucho; e' necessario ricompilare i sorgenti distribuiti con Resin, ed e' consigliato ricompilare cercando di sfruttare al meglio la configurazione hardware disponibile per l'esecuzione del software.
Personalmente ho a disposizione una macchina Linux (Suse 9.0 enterprise edition) con 4 CPU Xeon MP 3GHZ, e, seguendo i consigli del gentoo-wiki e dell'help di configure (configure --help) ho deciso di compilare i sorgenti in questo modo:
./configure --prefix=resin_dir --enable-linux-smp --with-apache=apache_dir --with-java-home=java_dir CFLAGS="-march=pentium4 -O2 -pipe -fomit-frame-pointer"
make
make install

resin_dir e' la directory nella quale saranno scritti i file necessari per l'esecuzione di Resin: sara' quindi la directory contenente l'intero servlet engine (escluse ovviamente le applicazioni che ci gireranno sopra)
apache_dir e' la directory contenente il web server apache: mod_caucho sara' copiato nella directory apache_dir/modules (si chiamera' mod_caucho.so)
java_dir e' la directory contenente la jdk (coincide con la variabile d'ambiente JAVA_HOME)

Suggerisco di cancellare la directory di lavoro di resin (quella contenente i sorgenti per la compilazione di mod_caucho) ad ogni ricompilazione... ho impiegato un po' di tempo per capire che lo script non copiava mod_caucho nella directory 'modules' di apache proprio perche' 'aveva memoria' delle compilazioni precedenti :)

mercoledì, settembre 13, 2006

Resin 3: JMX remote monitoring

Utilizzando Java 5 (l'implementazione di Sun) abilitare il monitoring remoto di Resin e della java virtual machine e' estremamente semplice.
E' sufficiente settare tre system property java.
Ipotizziamo di volere in ascolto l'agent JMX sulla porta 9999:
com.sun.management.jmxremote.port=9999
com.sun.management.jmxremote.ssl=false
com.sun.management.jmxremote.authenticate=false
E' possibile passare le system property all'interprete java modificando il file di startup di Resin 'httpd.sh'; ecco un esempio:

# Extra arguments to Java. If you're passing arguments to the JVM, you'll
# need to use -Jxxx. For example, args="-J-ms48m". You can modify
# the pid file with args="-pid server-a.pid"
#
args="-Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"

Per una panoramica delle system property disponibili: http://java.sun.com/j2se/1.5.0/docs/guide/management/agent.html

giovedì, agosto 17, 2006

Resin 3: war deploy

Resin, come altri servlet engine, permette il deploy di un war, che il container si occupa di esplodere nella directory corrispondente.
Dal passaggio alla release 3.0.18 ho pero' notato che come comportamento di default, Resin, nel caso in cui il file web.xml fosse gia' presente (tipicamente nel rilascio di una nuova versione dell'applicativo in sostituzione della vecchia) preferiva mantenere la vecchia versione del file e non sovrascriverla con la nuova presente nel pacchetto war.
Ho tagliato la testa al toro aggiungendo queste poche righe di configurazione (che non sono standard JavaEE, ma sono proprietarie di Resin) nel file resin-web.xml (ma nulla vieta che possa essere fatta la stessa cosa intervenendo sul file resin.conf):

<web-app-deploy path="webapps">
<expand-cleanup-fileset>
<include>*</include>
</expand-cleanup-fileset>
</web-app-deploy>

Ho assegnato all'attributo path dell'element web-app-deploy il valore 'webapps' (che e', nella configurazione di default, il nome della directory contenente i war e gli applicativi esplosi), mentre ho detto, per mezzo di <expand-cleanup-fileset><include>*</include></expand-cleanup-fileset>, a Resin, di eliminare qualsiasi file preesistente al momento dell'esplosione del war.