OVH Cloud OVH Cloud

[TOMCAT] Partager une classe entre contexte?

8 réponses
Avatar
seb
Bonjour, :)

Voil=E0, j'ai une webapp qui a un pool de chiffre a attribuer =E0 des=20
utilisateurs.

Pour des raisons idiotes, je suis OBLIGE de d=E9marre cette webapp en deu=
x=20
exemplaires (soit deux contextes dans tomcat).

Seulement, je veux que le pool de chiffre soit commun au deux webapps....=
=2E

Cela est-il possible? Si oui comment?
Sinon, une solution =E0 me proposer? J'ai bien pens=E9 =E0 un fichier txt=
ou=20
je stocke mes chiffres... mais cette solution ne me plait pas trop...

Merci =E0 tous! :)

8 réponses

Avatar
captainpaf

Bonjour, :)

Salut,


Voilà, j'ai une webapp qui a un pool de chiffre a attribuer à des
utilisateurs.

Pour des raisons idiotes, je suis OBLIGE de démarre cette webapp en deux
exemplaires (soit deux contextes dans tomcat).



étonnant !

Seulement, je veux que le pool de chiffre soit commun au deux webapps.....

Cela est-il possible? Si oui comment?
Sinon, une solution à me proposer? J'ai bien pensé à un fichier txt ou
je stocke mes chiffres... mais cette solution ne me plait pas trop...

Merci à tous! :)



Les 2 webapp sont identiques ?? Ben alors allons y gaiement, pourquoi
pas une 3ème webapp qui contiendrait une servlet faisant appel à une
méthode synchronizée d'une class static ? Des 2 webapp, tu appels
cette servlet qui se charge de l'ajout ou le retrait des chiffres.
Mais bon, c'est vraiment en attendant de trouver une meilleur
solution... Comme par exemple de passer outre les raisons "idiotes"
qui te pousses à executer les 2 webapp identiques dans 2 context
différents.

Avatar
seb
solution... Comme par exemple de passer outre les raisons "idiotes"
qui te pousses à executer les 2 webapp identiques dans 2 context
différents.


En fait les raisons sont simples:
le premier contexte est appellé par un mapping en httpS.

Or, nos ... de clients ne peuvent pas accéder au site en https de leur
intranet (merci le firewall!)
Comme c'est trop compliqué oulala! d'ouvrir le port ssl, on leur a fait
une adresse 'spéciale' rien que pour eux à laquelle ils peuvent accé der.
En déclarant donc un deuxième contexte dans server.xml...

D'où les deux webapps... bon maintenant s'il y a moyen de faire pointer
deux contextes sur la meme webapp, je suis preneur! :)

(Je suis pas un pro de l'admin tomcat, c'est l'admin tomcat qui a fait
ca comme ca... c'est lui qu'il faudra blâmer si sa solution est nulllle !
:p )

Avatar
seb
Hum, en fait j'ai jetté un oeil dans le fichier de conf:

c'est deux host qui sont déclarés en fait:

<Host name="adresse_publique.toto.fr" appBase="/var/...">
<Context path="" docBase="web/site"
debug="0"
/>
</Host>

<Host name="adresse_privée.toto.fr" appBase="/var/...">
<Context path="" docBase="web/site"
debug="0"
/>
</Host>

Il faudrait donc faire pointer deux host sur un seul contexte...

Des idées???

merci! :)
Avatar
Seb X
hummmm....

Il faut savoir, c'est deux hosts différents ou deux ports différents (pas la
meme chose)

Apparemment comme il s'agit d'un problème de Firewall, il faut rajouter un
port (sûrement 80)
Et donc regarder dans server.xml et rajouter <Http10Connector port etc etc
....>


"seb" a écrit dans le message de news:
3f98f700$0$27579$
Hum, en fait j'ai jetté un oeil dans le fichier de conf:

c'est deux host qui sont déclarés en fait:

<Host name="adresse_publique.toto.fr" appBase="/var/...">
<Context path="" docBase="web/site"
debug="0"
/>
</Host>

<Host name="adresse_privée.toto.fr" appBase="/var/...">
<Context path="" docBase="web/site"
debug="0"
/>
</Host>

Il faudrait donc faire pointer deux host sur un seul contexte...

Des idées???

merci! :)
Avatar
Xavier Tarrago
Bon, petites réflexions sur le sujet (sans garanties...)
D'abord, ce qui doit être partagé, c'est une classe, ou une instance?
Je suppose que c'est une instance créée par un contexte et utilisé par les
deux.

1 - Créer un singleton (ou une classe service basée sur un singleton). La
classe doit être dans un jar déposé dans les librairies common de tomcat
(<tomcat_home>/common/lib). Je pense qu'elle doit alors être chargée par un
class loader partagé entre tous les contextes.

2 - Créer un service partagé par les deux applications. Pour cela, il y a
soit un container EJB, soit un web service. C'est fait pour ça, mais ça doit
nécessiter un plus gros investissement (en temps).

3 - L'attribut de contexte tomcat crossContext permet de récupérer un
autre contexte par Servletcontext.getContext( string). Il faudrait créer un
troisième contexte qui gérerait le pool. Ensuite, les deux applications
utiliseraient ce contexte pour récupérer une référence sur le pool.

Notes : A mon avis, seule la solution 2 est portable. C'est aussi la plus
lourde. (étonnant, non ?).
La solution 1 ne doit pas être conforme avec la spéc j2ee.
La solution 3 est spécifique tomcat.

PS : j'ai supposé que l'environnement est tomcat et je m'apercois à
l'instant que ce n'est pas précisé dans la question.

"seb" a écrit dans le message de
news:3f98e76c$0$27575$
Bonjour, :)

Voilà, j'ai une webapp qui a un pool de chiffre a attribuer à des
utilisateurs.

Pour des raisons idiotes, je suis OBLIGE de démarre cette webapp en deux
exemplaires (soit deux contextes dans tomcat).

Seulement, je veux que le pool de chiffre soit commun au deux webapps.....

Cela est-il possible? Si oui comment?
Sinon, une solution à me proposer? J'ai bien pensé à un fichier txt ou
je stocke mes chiffres... mais cette solution ne me plait pas trop...

Merci à tous! :)
Avatar
Frederic Pepin
Salut Seb,

D'après la doc de Tomcat: "The shared class loader: This class loader is the
place to put classes and resources that you wish to share across ALL web
applications (unless Tomcat internal classes also need access, in which case
you should put them in the Common class loader instead). All unpacked
classes and resources in $CATALINA_HOME/shared/classes."

Je pense que tu pourrais wrapper ton code dans un "Singleton" et par créer
un ensemble de methodes
statiques qui te permetteront d'obtenir et ajouter des chiffres dans ton
pool...

Pour plus d'info sur class loader :
http://jakarta.apache.org/tomcat/tomcat-4.1-doc/class-loader-howto.html

Frederic

"seb" wrote in message
news:3f98e76c$0$27575$
Bonjour, :)

Voilà, j'ai une webapp qui a un pool de chiffre a attribuer à des
utilisateurs.

Pour des raisons idiotes, je suis OBLIGE de démarre cette webapp en deux
exemplaires (soit deux contextes dans tomcat).

Seulement, je veux que le pool de chiffre soit commun au deux webapps.....

Cela est-il possible? Si oui comment?
Sinon, une solution à me proposer? J'ai bien pensé à un fichier txt ou
je stocke mes chiffres... mais cette solution ne me plait pas trop...

Merci à tous! :)
Avatar
Frederic Pepin
Je suis d'accord avec toi pour la solution 1: c'est pas très élégant.
Cependant, en créant un "Custom Ressources Factory", il serait possible
d'accéder au pool en utilisant JNDI
(http://jakarta.apache.org/tomcat/tomcat-4.1-doc/jndi-resources-howto.html),
ce qui correspondrait mieux à la spec J2EE...

Frederic





"Xavier Tarrago" wrote in message
news:bnb8tu$pld$
Bon, petites réflexions sur le sujet (sans garanties...)
D'abord, ce qui doit être partagé, c'est une classe, ou une instance?
Je suppose que c'est une instance créée par un contexte et utilisé par
les

deux.

1 - Créer un singleton (ou une classe service basée sur un singleton).
La

classe doit être dans un jar déposé dans les librairies common de tomcat
(<tomcat_home>/common/lib). Je pense qu'elle doit alors être chargée par
un

class loader partagé entre tous les contextes.

2 - Créer un service partagé par les deux applications. Pour cela, il y
a

soit un container EJB, soit un web service. C'est fait pour ça, mais ça
doit

nécessiter un plus gros investissement (en temps).

3 - L'attribut de contexte tomcat crossContext permet de récupérer un
autre contexte par Servletcontext.getContext( string). Il faudrait créer
un

troisième contexte qui gérerait le pool. Ensuite, les deux applications
utiliseraient ce contexte pour récupérer une référence sur le pool.

Notes : A mon avis, seule la solution 2 est portable. C'est aussi la plus
lourde. (étonnant, non ?).
La solution 1 ne doit pas être conforme avec la spéc j2ee.
La solution 3 est spécifique tomcat.

PS : j'ai supposé que l'environnement est tomcat et je m'apercois à
l'instant que ce n'est pas précisé dans la question.

"seb" a écrit dans le message de
news:3f98e76c$0$27575$
Bonjour, :)

Voilà, j'ai une webapp qui a un pool de chiffre a attribuer à des
utilisateurs.

Pour des raisons idiotes, je suis OBLIGE de démarre cette webapp en deux
exemplaires (soit deux contextes dans tomcat).

Seulement, je veux que le pool de chiffre soit commun au deux webapps.....

Cela est-il possible? Si oui comment?
Sinon, une solution à me proposer? J'ai bien pensé à un fichier txt ou
je stocke mes chiffres... mais cette solution ne me plait pas trop...

Merci à tous! :)




Avatar
seb
Bon! :)

Merci merci pour vos conseils, je vais réfléchir à tous ça et uti liser
la meilleure solution possible par rapport à mon appli! ;)

Merci encore,

seb.