我曾问过一个问题earlier https://stackoverflow.com/questions/8668839/java-velocity-engine-initialization-issue关于 ExecutorService 和 Apache Velocity 初始化。快速回顾一下——我有一个 Java EE 前端,它接受用户请求,然后对于每个请求,使用 ExecutorService(SingleThreadedExecutor 设置为守护进程)来启动冗长的工作流程。此工作流程包含在一个库中并且可以工作当通过 eclipse 以独立模式运行时,效果很好并且符合预期。当从网站(servlet)调用时,我观察到工作流程始终在初始化 Velocity 引擎(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 从 servlet 调用时会挂起。
我开始思考/意识到这可能与 Velocity 或 FreeMarker 无关,而与 ExecutorService 有关。
任何意见或建议都会有很大的帮助。
Thanks