Чтение / обновление данных в базу данных из фонового запущенного потока в Dropwizard-Hibernate - PullRequest
0 голосов
/ 30 мая 2019

В моем проекте 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);
}

}
...