es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Obteniendo “No hay sesión actualmente vinculada al contexto de ejecución” al usar Threadpool Executor.

Soy nuevo en Dropwizard y Hibernate. Actualmente estoy trabajando en una aplicación donde necesito utilizar AsyncThreadPool para realizar algunas operaciones que consumen tiempo desde mi hilo principal, el cual necesita enviar una respuesta de inmediato.
En el flujo síncrono las operaciones funcionan bien porque mi listener tiene la anotación @UnitOfWork en su lugar. Pero en el hilo generado por el threadpool siempre recibo el error “No hay una sesión asociada al contexto de ejecución”.
Intenté poner la anotación @UnitOfWork tanto en la clase de hilo como en el método run(), ya que la documentación dice que tengo que usar esta anotación desde el recurso que accede a la instancia.
Aquí está mi clase Runnable.

public class CallbackTask implements Runnable{

<pre><code>Snapshot baseSnapshot;
ProcessorResponse processorResponse;
Job job;
ElasticSearchDAO esDao;
OrchestratorJobService orchestratorJobService;
Snapshot snapshot;
RestoreHelper restoreHelper;
String indexName;
public CallbackTask(Snapshot baseSnapshot, ProcessorResponse processorResponse, Job job, ElasticSearchDAO esDao, OrchestratorJobService orchestratorJobService, Snapshot snapshot, RestoreHelper restoreHelper, String indexName) {
    this.baseSnapshot = baseSnapshot;
    this.processorResponse = processorResponse;
    this.job = job;
    this.esDao = esDao;
    this.orchestratorJobService = orchestratorJobService;
    this.snapshot = snapshot;
    this.restoreHelper = restoreHelper;
    this.indexName = indexName;
}

@Override
@Transactional
public void run() {
    int retryCount = job.getRetrialCount()==null ? 0: job.getRetrialCount();
    if(retryCount< JOB_RETRY_COUNT){
        job.setRetrialCount(++retryCount);
        //orchestratorJobService.runConfig(job.getConfigId(), null);
    }else{
        snapshot.setSoftDelete(true);
    }
    orchestratorJobService.persistData(job, snapshot);
}
</code></pre>

Gracias de antemano por cualquier ayuda.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para resolver el error “No session currently bound to execution context”, debes asegurarte de que haya una sesión atada al contexto de ejecución del hilo creado. Una solución es utilizar el SessionManager de Hibernate para vincular la sesión al contexto del hilo.

    Modifica tu clase CallbackTask de la siguiente manera:

    public class CallbackTask implements Runnable{
    
        // ... constructor y campos
    
        @Override
        public void run(){
            Session session = null;
            try{
                session = HibernateBundle.getSessionFactory().openSession();
                ManagedSessionContext.bind(session);
                int retryCount = job.getRetrialCount() == null ? 0 : job.getRetrialCount();
                // ... resto del código
            } finally{
                if(session != null){
                    ManagedSessionContext.unbind(HibernateBundle.getSessionFactory());
                    session.close();
                }
            }
        }
    }
    
    

    Este código abre una nueva sesión para el hilo generado, la vincula a ManagedSessionContext y la desvincula cuando el hilo termina. Cabe destacar que HibernateBundle es la clase Bundle para tu aplicación Dropwizard, siempre que la hayas configurado correctamente.

    Con esta modificación, deberías poder ejecutar tus operaciones que requieren mucho tiempo desde la clase CallbackTask sin encontrar el error “No session currently bound to execution context”.

Comments are closed.