В моем проекте dropwizard у меня есть фон, который будет все время работать для обработки данных из очереди.В этом потоке мне нужно будет прочитать данные из базы данных, а затем они обновят данные в соответствии с выполненным процессом.Теперь я сталкиваюсь с «org.hibernate.HibernateException: сессия в данный момент не связана с контекстом выполнения», когда я пытаюсь прочитать данные из базы данных в моем потоке.
Пожалуйста, помогите мне о том, как я могу читать и записывать данныев базу данных из моего фонового запущенного потока в проекте dropwizard с помощью hibernate.
Вот полная трассировка стека ошибок -
org.hibernate.HibernateException: No session currently bound to execution context
at org.hibernate.context.internal.ManagedSessionContext.currentSession(ManagedSessionContext.java:58)
at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:464)
at io.dropwizard.hibernate.AbstractDAO.currentSession(AbstractDAO.java:44)
at com.test.kmt.db.SmsDAO.findById(SmsDAO.java:19)
at com.test.kmt.client.SmsConsumer.sendSms(SmsConsumer.java:59)
at com.test.kmt.client.SmsConsumer.run(SmsConsumer.java:50)
at com.test.kmt.client.SmsConsumer_$$_jvst4ac_7._d7run(SmsConsumer_$$_jvst4ac_7.java)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at io.dropwizard.hibernate.UnitOfWorkAwareProxyFactory.lambda$create$0(UnitOfWorkAwareProxyFactory.java:81)
at com.test.kmt.client.SmsConsumer_$$_jvst4ac_7.run(SmsConsumer_$$_jvst4ac_7.java)
at java.lang.Thread.run(Thread.java:748)
Инициализируйте экземпляр SmsConsumer с UnitOfWorkAwareProxyFactory в TestDropwizardApplication.java
MessageSendingService htMessagingClientService = new MessageSendingServiceImpl(accountDAO);
SmsConsumer smsConsumer = new UnitOfWorkAwareProxyFactory(hibernate).create(MessageSendingService.class, new Class[] { SmsDAO.class, MessageSendingService.class }, new Object[] { smsDAO, messageSendingService });
SmsConsumer.java
public class SmsConsumer implements Runnable {
private SmsDAO smsDAO;
private MessageSendingService messageSendingService;
public SmsConsumer(SmsDAO smsDAO, MessageSendingService messageSendingService) {
this.smsDAO = smsDAO;
messageSendingService = messageSendingService;
}
@Override
public void run() {
while (true) {
Sms smsDto = RequestSubmitter.getInstance().getOtpQueue().poll();
sendSms(smsDto);
}
}
@UnitOfWork
private void sendSms(SmsDto smsDto) {
try {
Sms sms = smsDAO.findById(smsDto.getMsgId());
Response response = (Response) messageSendingService.sendSMS(sms);
if (response != null) {
Sms latestSms = smsDAO.findById(sms.getMsgId());
latestSms.setStatus("sent");
smsDAO.update(latestSms);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
SmsDAO.java
public class SmsDAO extends AbstractDAO<Sms> {
public SmsDAO(SessionFactory sessionFactory) {
super(sessionFactory);
}
public Sms findById(String msgId) {
return currentSession().get(Sms.class, msgId);
}
public String create(Sms sms) {
sms.setCreateDate(new Date());
sms.setUpdateDate(new Date());
return persist(sms).getMsgId();
}
public void update(Sms sms) {
sms.setUpdateDate(new Date());
currentSession().saveOrUpdate(sms);
}
}