Я пытаюсь сделать вызов асинхронного метода в моем коде сервисного уровня. Некоторый псевдокод для того же, как показано ниже:
public void createXXX ()
{
dao.saveOrUpdate(entity); // save an entity
...................
...................
callAServiceXXX ()
}
...........
...........
public void callAServiceXXX()
{
SomeEntity entity = dao.getEntity(); // entity NOT NULL
this.threadPoolTaskExecutor.execute(new Runnable() {
public void run() {
try {
callAMethodXXX()
}catch()
{}
}
public void callAMethodXXX()
{
SomeEntity entity = dao.getEntity(); // entity always NULL
}
В моем конфигурационном файле spring для bean-компонента сервисного уровня определено следующее, содержащее указанную выше логику:
<property name="transactionAttributes">
<props>
<prop key="callAServiceXXX">PROPAGATION_REQUIRED</prop>
<prop key="callAMethodXXX">PROPAGATION_MANDATORY</prop>
</props>
</property>
Как указано выше, когда я пытаюсь получить объект сущности, который я сохраняю в методе createXXX(), он всегда равен NULL, когда вызов dao выполняется из метода callAMethodXXX().
Я не уверен в причине такого поведения. Попробовал несколько других транзакционных атрибутов в файле конфигурации spring, но не добился успеха.
Обходной путь, который я пытался сделать, был:
1) Создайте вспомогательный класс. Внедрите его в этот класс сервисного уровня. 2) Переместите метод callAMethodXXX() в этот вспомогательный класс. 3) Определите <prop key="callAMethodXXX">PROPAGATION_REQUIRES_NEW</prop>
, так как я хочу убедиться, что callAMethodXXX() должен выполняться в новой транзакции.
Однако я не хочу использовать дополнительный вспомогательный класс и хочу убедиться, что логика работает нормально с одним классом сервисного уровня.
Любая информация о вышеизложенном будет полезна.
С уважением,