2 votes

Projet séparé en deux parties avec Apache tomcat

J'ai deux parties dans ma demande : l'administration y client partie.

  • Dans l'administration, les administrateurs téléchargent des fichiers, remplissent un formulaire et créent d'autres outils d'administration.

  • Côté client, les utilisateurs effectuent une recherche sur les entités enregistrées dans la partie administration.

Je l'exécute dans le même projet avec serveur tomcat Mais parfois, lors du téléchargement de fichiers, j'obtiens Java Heap Le problème est que le serveur s'arrête et que les utilisateurs ne peuvent plus faire de recherche jusqu'à ce que je redémarre le serveur et je ne veux pas non plus charger la bande passante avec le téléchargement de fichiers. Et il y a un conflit entre les variables de session et le timeout.

Je veux donc les séparer en deux indépendant projets

  1. Comment faire fonctionner deux projets de manière à ce que, si le projet d'administration est en panne, mes clients continuent d'utiliser mon application web ?
  2. Et comment puis-je appeler services communs (contrôleurs) et ressources communes (img, files, css, js, ...) entre la partie client et la partie admin ?

2voto

kaqqao Points 872

Votre question est très large, il est donc presque impossible d'y répondre.

Problèmes liés au tas

Tout d'abord, la raison de ce problème de tas pourrait tout aussi bien être que vous mettez en mémoire tampon l'ensemble du fichier téléchargé (c'est-à-dire que vous désérialisez l'image téléchargée en byte[] ou autre). C'est quelque chose que vous ne devez jamais faire avec un contenu non fiable ou des limites de taille raisonnables, car quelqu'un pourrait télécharger un fichier de 16 Go et détruire complètement votre mémoire vive. Au lieu de cela, vous pouvez diffuser les octets téléchargés soit sur le disque, soit vers quelque chose d'autre qui fonctionne avec des flux.

FileUpload de Apache Commons vous offre un moyen simple et agréable de prendre des téléchargements de taille arbitraire et de décider dynamiquement de les mettre en mémoire tampon ou sur disque en fonction de leur taille :

// Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();

// Set factory constraints
factory.setSizeThreshold(yourMaxMemorySize);
factory.setRepository(yourTempDirectory);

// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);

// Set overall request size constraint
upload.setSizeMax(yourMaxRequestSize);

// Parse the request
List<FileItem> items = upload.parseRequest(request);

Séparer les applications

En ce qui concerne la séparation des candidatures, il suffit de faire 2 WAR, il n'y a pas de magie là-dedans. Mais gardez à l'esprit que tout ce qui fait planter votre application à cause de problèmes de tas est susceptible de faire planter toute la JVM Pour les isoler, il faut donc les répartir dans des JVM distinctes (c'est-à-dire des instances Tomcat distinctes).

Pour partager des classes communes, comme les contrôleurs, il suffit de les séparer dans un JAR dont dépendent les deux WAR. Un simple projet multi-module maven un module pour chaque WAR et un pour chaque JAR partagé.

Les ressources peuvent être partagées de plusieurs manières :

  • Il faut également les regrouper dans un JAR partagé sous META-INF/resources : Cette fonction est prise en charge à partir de Servlet 3.0. Voici un guide détaillé . Cette approche a l'avantage d'être simple à déployer, il suffit de traiter le JAR de ressources comme n'importe quelle autre dépendance. L'inconvénient est qu'elle ne permet pas un redéploiement facile sans redémarrer l'application.
  • Les déployer sur un lecteur partagé : Vous devez gérer un déploiement séparé, mais vous pouvez toujours redéployer sans affecter l'application.

JAR partagé avec des ressources statiques

S'il se trouve dans votre chemin de classe (c'est-à-dire à l'intérieur de WEB-INF/lib/ de votre WAR) vous avez un JAR qui contient META-INF/resources/image.jpg vous pourrez y accéder via :

http://localhost:8080/<subcontext>/image.jpg

Véase le guide pour plus de détails.

Emplacement externe partagé

Vous pouvez demander à Tomcat de rechercher des ressources dans un emplacement externe. La configuration est différente selon la version de Tomcat :

  • Utilisation alias
<Context aliases="/images=/var/www/images" />
  • La même configuration en utilisant la fonction Resources .
<Context>
  <Resources>
    <PostResources className="org.apache.catalina.webresources.DirResourceSet"
                   base="/var/www/images" webAppMount="/images" />
  </Resources>
</Context>

Vous mettez ensuite les ressources statiques dans /var/www/images (par exemple /var/www/images/image.jpg ) et d'y accéder par l'intermédiaire de http://localhost:8080/<subcontext>/images (par exemple http://localhost:8080/<subcontext>/images/image.jpg ).

Véase ce tutoriel pour d'autres exemples.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X