Проблема в управлении транзакциями Hibernate - PullRequest
1 голос
/ 01 мая 2019

Я использую подход, основанный на потоках, для опроса статуса конкретной задачи в AWS.Для этого я использую цикл while, чтобы постоянно проверять состояние, как показано в приведенном ниже коде.Проблема заключается в том, что при переключении кода с одной службы на другую возникает ошибка -

Could not obtain transaction-synchronised hibernate session  

Функция в потоке выглядит следующим образом:

        Runnable task = new Runnable() {
            @Override
            public void run() {
                Session session = null;
                try {
                    session = sessionFactory.openSession();
                    RmlWorkspace rmlWorkspace = session.get(RmlWorkspace.class, id);
                    logger.info("Starting Status check for "+id);
                    if (rmlWorkspace.getCloudStack().getStatus() == RUNNING_STATUS.STARTING) {
                        while (rmlWorkspace.getCloudStack().getStatus() != RUNNING_STATUS.ON) {
                            logger.info("Checking Status for "+id);
                            rmlWorkspace = checkStatus(session, rmlWorkspace);
                            TimeUnit.SECONDS.sleep(5);
                        }
                    } else if (rmlWorkspace.getCloudStack().getStatus() == RUNNING_STATUS.STOPPING) {
                        while (rmlWorkspace.getCloudStack().getStatus() != RUNNING_STATUS.OFF) {
                            Transaction tx = session.beginTransaction();
                            rmlWorkspace = checkStatus(session, rmlWorkspace);
                            tx.commit();
                            TimeUnit.SECONDS.sleep(5);
                        }
                    }
                    session.close();
                } catch (Exception e) {
                    logger.info(e.getMessage());
                    if (session != null)
                        session.close();
                }
            }
};

checkStatus function пытается вызвать функцию внутри другого класса с аннотацией @Service.Код встречает ошибку в следующем коде:

private AssumeRoleResult assumeRole() {
        try {
            BasicAWSCredentials credentials = new BasicAWSCredentials(configAttributeService.getAttribute("aws.iamkey"),
                    configAttributeService.getAttribute("aws.iampass"));
            AWSSecurityTokenService client = AWSSecurityTokenServiceClientBuilder.standard()
                    .withRegion(Regions.US_WEST_2).withCredentials(new AWSStaticCredentialsProvider(credentials))
                    .build();
            AssumeRoleRequest request = new AssumeRoleRequest()
                    .withRoleArn(configAttributeService.getAttribute("aws.assumerole"))
                    .withRoleSessionName(UUID.randomUUID().toString()).withDurationSeconds(900);
            AssumeRoleResult assumeRoleResult = client.assumeRole(request);
            return assumeRoleResult;
        } catch (Exception e) {
            throw e;
        }
    }

Класс, содержащий вышеупомянутую функцию, имеет аннотацию @Service("xxx")

Может кто-нибудь объяснить причину этого и как заставить это работать.

...