Я задал вопрос ранее относительно инициализации ExecutorService и Apache Velocity. Чтобы дать краткий обзор - у меня есть интерфейс Java EE, который принимает запросы пользователей, а затем для каждого из этих запросов использует ExecutorService (SingleThreadedExecutor, установленный как демон), чтобы запустить длительный рабочий процесс. Этот рабочий процесс содержится в библиотеке и работает ну и как положено при запуске в автономном режиме через eclipse. При вызове с веб-сайта (сервлета) я заметил, что рабочие процессы постоянно зависали в точке, где инициализировался Velocity Engine (Velocity.init() или ve.init()). Отсюда мой вышеупомянутый вопрос.
Когда ни один из ответов/предложений не сработал, я сделал вывод, что это как-то связано с запуском Velocity, и решил перейти на FreeMarker. Теперь я вижу, что рабочий процесс зависает в том же месте и для реализации FreeMarker. Это «место» является частью создания почты, которая оценивает шаблон по паре переданных объектов данных и возвращает почтовую строку. Класс, который вызывает класс Freemark'ing и класс FreeMark, выглядит следующим образом:
public class mailBuilder {
private static final Logger log = Logger.getLogger( mailBuilder.class );
static String a;
static String b;
public mailBuilder(CustomDataStructure input)
{
a = input.getA();
b = input.getB();
}
public static String returnMailstring() throws Exception
{
log.info("Gathering elements to construct email.");
String mailText=null;
Map context = new HashMap();
context.put("a",a);
context.put("b",b);
log.info("Calling Freemarker");
mailText=FreeMarkIT.ReturnReportString(context);
log.info("Freeemarker returned string");
return mailText;
}
}
Класс FreeMarkIT выглядит следующим образом:
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();
}
}
Теперь из моего лога видно, что рабочий поток зависает на строке config=new Configuration()
Опять же, это работает, как и ожидалось, в автономном режиме при запуске из eclipse, но, тем не менее, зависает при вызове из сервлета с использованием ExecutorService.
Я начинаю думать/понимать, что это может не иметь ничего общего ни с Velocity, ни с FreeMarker, а иметь какое-то отношение к ExecutorService. Любой совет или предложение будет иметь огромную помощь.
Спасибо