我们目前正在使用同步。网络电话发送电子邮件。这是为了证明一些基本功能的快速修复,但现在我们需要异步发送电子邮件。我已经对所有内容进行了重新设计以排队作业然后发送电子邮件,但我遇到了一个问题。我们将 FTL 用于我们的电子邮件模板,并且在我们将 servlet 上下文传递给 FTL 以获取模板文件夹之前。由于我们现在在由 Spring @Scheduled 作业处理的排队作业中执行此操作,因此我们不再有权访问 Web servlet。我已经研究和玩了一段时间了,但我似乎还没有想出一种真正可行的方法。
我有一种感觉有一些超级简单的方法可以得到
之前完成这项工作的代码与此类似:
@PUT
@Produces(MediaType.APPLICATION_JSON)
@Path("someStuffHere")
@Transactional
public function someWebServiceCall(@Context javax.servlet.http.HttpServletRequest req)
{
SomeStuff foo = gotSomeStuff();
sendEmail(req.getServlet(), foo);
}
public sendEmail(Servlet context, SomeStuff foo) //<-- lives in another class somewhere, just showing how FTL uses the servlet
{
Configuration cfg = new Configuration();
cfg.setServletContextForTemplateLoading(context,"communicationTemplates/email");
}
新代码现在看起来像这样:
public class someClass
{
@Autowired
private SomeRepo someRepo;
@Scheduled(cron = "* */2 * * * ?")
public void sendAnyOutstandingStuffEmails()
{
SomeStuff foo = someRepo.getStuff();
sendEmail(/*how to get context, or a resource so FTL can get the template folder*/, foo)
}