Springactioninterceptor вызывается, когда ни один класс или метод не помечен как транзакционный.
Я работаю над приложением Gigaspace XAP, которое использует пружину под капотом. Менеджер транзакций jini, предоставляемый gigaspaces, не поддерживает сериализацию.
У меня есть класс, который использует Spring-пакет для обработки файла. Ниже описано, как это вызывает работу
public class FileProcessor implements BasicFileProcessor {
@Value("${feeddownload.basedir}")
private String baseDir;
@Autowired
private JobLauncher jobLauncher;
@Autowired
private Job cmJob;
@Autowired
private MapJobRepositoryFactoryBean repositoryFactoryBean;
@Override
public void process(RiskRunCompletion riskRunCompletion, VersionedSliceName versionedSliceName, GigaSpace gigaSpace) {
Transaction tx = gigaSpace.getCurrentTransaction();
try {
//Adding current time to the parameter, to enable multiple times calling job with same parameters
long currentTimeInMillis = System.currentTimeMillis();
JobParameter currentTimeInMillinsParam = new JobParameter(currentTimeInMillis);
Map parameterMap = new LinkedHashMap();
addDirectoryParams(valuationSliceRun, parameterMap);
parameterMap.put(CURRENT_TIME, currentTimeInMillinsParam);
JobParameters paramMap = new JobParameters(parameterMap);
JobExecution cmExecution = launchJobWithParameters(paramMap);
for (Throwable t : cmExecution.getAllFailureExceptions()) {
throw new RuntimeException(t);
}
} catch (Exception e) {
throw new RuntimeException("Exception during batch job", e);
} finally {
repositoryFactoryBean.clear();
}
}
private JobExecution launchJobWithParameters(JobParameters paramMap) throws Exception {
return jobLauncher.run(cmJob, paramMap);
}
}
Метод process вызывается из другого класса, как показано ниже
public class FileBasedProcessingEventListener implements ApplicationContextAware {
@Value("${feeddownload.basedir}")
private String baseDir;
@Autowired
private BasicFileProcessor cmProcessor;
@Autowired
private FileBasedProcessingExceptionHandler fileBasedProcessingExceptionHandler;
public void handle(FileBasedProcessingEvent fileBasedProcessingEvent, GigaSpace gigaSpace) throws IOException {
LOGGER.info("Processing file based processing event : " + fileBasedProcessingEvent);
createLockFiles(fileBasedProcessingEvent);
handleEvent(fileBasedProcessingEvent, gigaSpace);
}
private void handleEvent(FileBasedProcessingEvent fileBasedProcessingEvent, GigaSpace gigaSpace) {
Transaction tx = gigaSpace.getCurrentTransaction();
cmProcessor.process(fileBasedProcessingEvent.getRiskRunCompletion(), versionedSliceName, gigaSpace);
}
}
Метод дескриптора вызывается из фреймворка. Теперь я не уверен, почему я получаю исключение, как показано ниже
Caused by: org.springframework.transaction.InvalidIsolationLevelException: Jini Transaction Manager does not support serializable isolation level
at org.openspaces.core.transaction.manager.AbstractJiniTransactionManager.applyIsolationLevel(AbstractJiniTransactionManager.java:271)
at org.openspaces.core.transaction.manager.AbstractJiniTransactionManager.doJiniBegin(AbstractJiniTransactionManager.java:251)
at org.openspaces.core.transaction.manager.AbstractJiniTransactionManager.doBegin(AbstractJiniTransactionManager.java:207)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:372)
at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:417)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:255)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
Ни один из классов не помечен как транзакционный, я не уверен, почему TransactionInterceptor вызывается, если я не пометил ни один класс или любой метод как транзакцию, это не должно вызывать беспокойства. Я также использовал Transaction tx = gigaSpace.getCurrentTransaction(); чтобы проверить, что транзакция не активна, она имеет значение только null
я в замешательстве, когда ни один из классов не помечен как транзакционный, почему Spring пытается вызвать этот метод в транзакции
2 ответа
Похоже, что менеджер транзакций Gigaspaces основан на инфраструктуре управления транзакциями Spring, что можно понять из документации, приведенной здесь - поэтому, если вы используете API транзакций Gigaspaces, то вы используете управление транзакциями Spring. Также стоит обратить внимание на любую конфигурацию диспетчера транзакций внутри файлов конфигурации xml, которая указывает точный класс диспетчера транзакций.
Действительно, кажется, что транзакции используются, проверьте, определите ли вы менеджер транзакций в вашем файле pu.xml, в частности проверьте инициализацию jobLauncher.