2016-06-09 6 views
0

В моем приложении у меня есть 2 @Async методов: один для целей аудита, а другой для обновления некоторых карт в 2 совершенно разных фасоли, вызывается из разных бобов, но в то же время. Один из прослушивателей аудита и другой из контроллера.Как я могу @Aync работать на 2 разных потоках для 2 разных методов весной.?

Моя проблема заключается в том, что оба они работают в одном потоке, то есть сначала выполняется аудит, а затем в том же потоке создаются эти карты. Таким образом, если аудит выдает какое-то исключение, карты не будут созданы или карты выдают ошибку, аудит не будет записан.

Есть ли способ, я могу использовать эти два метода в разных потоках Async.

Method1:

@Async(value="myExecutor") 
@Transactional(propagation = Propagation.REQUIRES_NEW) 
public void regenerateZoneMapAsync(DemandSource ds) { 
    System.out.println("\n\n********************Current Thread in Async Class*****************" + Thread 
      .currentThread()); 
    regenerateZmFilesByDs(ds); 
    System.out.println("\n\n*********Current Thread********" + Thread.currentThread()); 
} 

Method2:

@Async(value="myExecutor") 
@Transactional(propagation = Propagation.REQUIRES_NEW) 
public void callAudit(DemandSource ds) { 
    System.out.println("\n\n************Current Thread in Audit Class*********" + Thread 
      .currentThread()); 
    callAudit(ds); 
    System.out.println("\n\n***********Current Thread********" + Thread.currentThread()); 
} 

Println был добавлен для моей собственной ясности, чтобы знать, какой поток был выполнен. Я новичок как в многопоточности, так и в Spring.

Моего класса конфигурационных

<task:annotation-driven executor="myExecutor"/> 
<task:executor id="myExecutor" pool-size="5"/> 

После добавления выше конфигураций с @Async(value="myExecutor") моим кодом перестал работать вообще, Под этим я имею в виду, боб, в котором regenerateZoneMapAsync() был определен, не вызывается из моего вызывающего боба, некоторые возникает проблема с прокси-сервером.

Edit:

Одна вещь, которая приходит на мой взгляд, это может быть возможно, что аудит нить завершает обработку и отправить поток обратно в бассейн, а затем карта выбирает один и тот же поток и начинает его обработку.

В принципе, я хочу, чтобы в случае если аудит выдает какую-либо ошибку, а всплывающее обновление карты должно продолжаться.

+0

Добавить конфигурацию на ваш вопрос. –

+0

какая часть конфигурации вы хотите точно? – dgupta3091

+0

Конфигурация конфигурации асинхронизации и пула потоков. –

ответ

0

Ну, я получил свой ответ.

@Transactional (распространение = Propagation.REQUIRES_NEW) всегда создает новую транзакцию, если вызвана из другого компонента.

Если вы вызываете из одного и того же компонента, новая транзакция никогда не выполняется, а так как это @Async, она начинается с уже запущенного потока Async.

Итак, мне пришлось сделать еще один компонент для моего метода, и оба метода начали работать в двух разных потоках одновременно.

Получил мое обращение от:

@Async имеет два ограничения:

он должен применяться только открытые методы; self invocation - вызов метода async из одного класса - не будет работать;

Причины просты - метод должен быть общедоступным, чтобы его можно было проксировать. И самозапуск не работает, поскольку он обходит прокси, а напрямую вызывает базовый метод.

http://www.baeldung.com/spring-async