Я использую подход, основанный на потоках, для опроса статуса конкретной задачи в 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")
Может кто-нибудь объяснить причину этого и как заставить это работать.