Предполагая следующую конструкцию классов:Локальный вызов абстрактного метода EJB открывает новую транзакцию?
Filereader
, что находит соответствующий импортер для файла и вызывает метод Importer.import
.
Этот метод вызывает абстрактный метод , который аннотируется REQUIRES_NEW.
С точки зрения контейнера локальный вызов не открывает новую транзакцию, но из перспективы наследования я не уверен.
Совершает ли звонок в ImporterBase.import
создать новую транзакцию или нет, и почему это так?
Класс FileReader:
@Singleton(name = "FileReader")
public class FileReader extends Traceable {
/*@Inject
@Any
public Instance<Importer> importers;*/
@EJB
ExampleImporter importer;
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void listenToFileAvailableEvent(@Observes FileAvailable event) throws InterruptedException {
for (final String filename : event.getFilenames()) {
readFile(filename);
}
}
public void readFile(String filenameWithPath) {
//[...]-> Extract FileMetadata and find correct importer
importer.import(dateiMeta);
}
}
импортер Интерфейс:
@Local
public interface Importer {
void import(FileMetaData dateiMeta) throws Exception;
void importSpecific(FileMetaData dateiMeta) throws Exception;
}
Класс ImporterBase:
public abstract class ImporterBase implements Importer {
@Resource
private SessionContext ctx;
@Override
public void import(FileMetaData dateiMeta) throws Exception {
try {
ctx.getBusinessObject(Importer.class).importSpecific(dateiMeta);//This causes the error
} catch (Exception ex) {
//[...] Log Error
throw ex;
}
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public abstract void importSpecific(FileMetaData dateiMeta) throws Exception;
}
Класс ExampleImporter:
@Stateless
public class ExampleImporter extends ImporterBase {
@Override
public void importSpecific(FileMetaData dateiMeta) throws Exception {
//Import from file
}
}
Спасибо за ваш ответ. Я попробовал ваше решение, но я всегда получаю WFLYEJB0051: Не удалось найти [...] Импортер EJB [...] ExampleImporter. Я добавил аннотацию «@Local» на интерфейс. –
Мне нужно увидеть ваш код, чтобы помочь вам больше ... можете ли вы обновить свой вопрос с помощью модифицированного кода? –
Я редактировал код. Заранее спасибо –