J'avais posé une question earlier concernant ExecutorService et l'initialisation d'Apache Velocity. Pour donner un récapitulatif rapide - j'ai une interface Java EE qui accepte les demandes des utilisateurs et ensuite pour chacune de ces requêtes, utilise ExecutorService (SingleThreadedExecutor en tant que démon) pour lancer un long workflow. Ce workflow est contenu dans une bibliothèque et fonctionne bien et comme prévu lorsqu'il est exécuté dans un mode autonome à travers éclipse. Quand j'ai été appelé depuis le site Web (servlet), j'ai observé que les flux de travail étaient constamment accrochés au point où Velocity Engine était en cours d'initialisation (Velocity.init() ou ve.init()). D'où ma question précitée. Quand aucune des réponses/suggestions n'a fonctionné, j'ai déduit que cela avait quelque chose à voir avec la façon dont Velocity a démarré et a décidé de passer à FreeMarker. Maintenant, je vois que le workflow est bloqué exactement au même endroit pour l'implémentation de FreeMarker. Ce 'lieu' est la partie de construction du courrier qui évalue un modèle par rapport à un ensemble d'objets de données transmis et renvoie la chaîne de messagerie. La classe qui appelle la classe Freemarking et la classe FreeMark sont les suivantes -Problème lors de l'exécution de tâches asynchrones à l'aide de ExecutorService
classe FreeMarkIT est la suivante -
public class FreeMarkIT {
private static final Logger log = Logger.getLogger(FreeMarkIT.class);
private static Configuration config;
private static Template template;
public static String ReturnReportString(Map model) throws IOException, TemplateException
{
StringWriter sw = new StringWriter();
try
{
log.info("Going to get the template");
config= new Configuration();
log.info("Now really");
template=config.getTemplate("src/resource/email_template.vm");
log.info("Done initializing template");
template.process(model, sw);
sw.flush();
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
return sw.getBuffer().toString();
}
}
maintenant, de mon exploitation forestière il semble que le thread de travail est suspendu à la ligne config=new Configuration()
Encore une fois, cela fonctionne comme prévu en mode autonome lorsqu'il est exécuté à partir eclipse mais se bloque quand on l'appelle à partir du servlet en utilisant ExecutorService.
Je commence à penser/réaliser que cela n'a rien à voir avec Velocity ou FreeMarker et que j'ai quelque chose à voir avec ExecutorService. Tout conseil ou suggestion serait d'une aide immense.
Merci
Votre code n'est pas valide Java code. Ce qui est sûr, c'est que c'est très loin d'être thread-safe. Montrez-nous le code réel, car toutes les corrections que nous pourrions faire sur le faux code ne seront pas utiles. Et s'il vous plaît, respectez les conventions de nommage Java: votre code est difficile à lire. –
Je m'excuse. J'ai corrigé le code maintenant. – ping