Java Spring hibernate多线程
我有一个要求,当客户端向数据库添加条目时,应该生成一封电子邮件并发送给用户。我在这里使用spring+hibernate。发送电子邮件将在一个单独的线程中完成,这样客户端就不需要等待电子邮件发送。示例代码段-Java Spring hibernate多线程,java,spring,multithreading,hibernate,spring-mvc,Java,Spring,Multithreading,Hibernate,Spring Mvc,我有一个要求,当客户端向数据库添加条目时,应该生成一封电子邮件并发送给用户。我在这里使用spring+hibernate。发送电子邮件将在一个单独的线程中完成,这样客户端就不需要等待电子邮件发送。示例代码段- private SessionFactory sessionFactory; public SessionFactory getSessionFactory() { return sessionFactory; } public void setSe
private SessionFactory sessionFactory;
public SessionFactory getSessionFactory() {
return sessionFactory;
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
@Override
@Transactional
public boolean addEntry()
{
Log log = new Log();
//setters
Session session = sessionFactory.getCurrentSession();
session.save(log);
Thread thread = new Thread(new Runnable() {
@Override
@Transactional
public void run() {
Session session = sessionFactory.getCurrentSession();
Query query = session.createQuery(" get employee email query");
// send email
}
});
thread.start();
return true;
}
我在会话中获取运行方法中的代码时出错
Exception in thread "Thread-1" org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
如何使多线程在spring-hibernate应用程序中工作?请帮忙。显然不是这样的。另外,在应用程序中创建线程基本上是不应该做的事情。创建另一个方法,只需使用
@Async
对其进行注释,并相应地配置任务执行器。首先插入用户,然后调用发送电子邮件的方法。您可以简单地写入记录并尽快返回给用户。然后,创建一个调度任务,轮询数据库中的新记录,并根据需要发送邮件。如果您每5分钟左右安排一次邮件作业,用户将在合理的时间内收到他们的邮件,并且他们不会阻止电子邮件的发送。@M.Deinum那么您的意思是,如果我使用带有'@Async'注释的方法,主执行将不会等待异步方法结束?(这实际上就是我想要的)主要问题是,我无法在run()方法中使用会话工厂。为什么会这样?因为@Transactional
在这里没有任何用处。但是我强烈建议不要创建线程,因为JEE规范(在JEE服务器中)基本上禁止创建线程。使用合适的工具。显然不是这样。另外,在应用程序中创建线程基本上是不应该做的事情。创建另一个方法,只需使用@Async
对其进行注释,并相应地配置任务执行器。首先插入用户,然后调用发送电子邮件的方法。您可以简单地写入记录并尽快返回给用户。然后,创建一个调度任务,轮询数据库中的新记录,并根据需要发送邮件。如果您每5分钟左右安排一次邮件作业,用户将在合理的时间内收到他们的邮件,并且他们不会阻止电子邮件的发送。@M.Deinum那么您的意思是,如果我使用带有'@Async'注释的方法,主执行将不会等待异步方法结束?(这实际上就是我想要的)主要问题是,我无法在run()方法中使用会话工厂。为什么会这样?因为@Transactional
在这里没有任何用处。但是我强烈建议不要创建线程,因为JEE规范(在JEE服务器中)基本上禁止创建线程。为此使用适当的工具。