3

У меня есть вопрос о примечании Spring @Async. У меня есть контроллер autowired услуги (GnInsuranceDetailsService)Spring @Async аннотация

@RequestMapping(value="/agn/AP0W01A_010/insertDetail.do") 
public ResponseEntity<?> insertDetail(@ModelAttribute("dto")GnInsuranceDetailsDTO dto,HttpSession session) throws Exception { 
    gnInsuranceDetailsDTO.setBkFlag(getAgnUserInfo(session).getBkFlag()); 
    gnInsuranceDetailsService.insertGnInsuranceDetail(dto);//open another thread to insert data 
    MessageDTO dto = new MessageDTO(AgnConstant.INSERT_SUCCESS); 
    return new ResponseEntity<MessageDTO>(dto,HttpStatus.OK);// increase return time for client 
    } 

и методы Service insertGnInsuranceDetail я декларировать @Async вверх метод.

@Transactional(readOnly = false) 
@Async 
public void insertGnInsuranceDetail(GnInsuranceDetailsDTO gnInsuranceDetailsDTO) throws Exception{ 
GnInsuranceDetails entity = gnInsuranceDetailsDTO.convert(); 
gnInsuranceDetailsDAO.save(detailsEntity); 
} 

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

ответ

3

Вы не потеряете ничего, когда вы добавите @Async в службу метода, будет выполняться в другом потоке, метод Controllers insertDetail не будет возвращен до тех пор, пока ваш insertGnInsuranceDetail не будет возвращен или не будет исключен.

+0

Хеллоу, @ kuhajeyan.I использовать тестовый код тему. sleep (10000L) перед insertGnInsuranceDetail метод begin.but не работает.Controller будет ждать> 10s для сервиса insertGnInsuranceDetail метод закончен. –

+0

@HamiltonLin вы уверены, что вы включили @ EnableAsync в конфигурации для @ Async для работы – kuhajeyan

+0

Как установить эту конфигурацию весной –

0

Я положил @Async для метода службы, чтобы увеличить время отклика контроллера для клиентской стороны, но он не работает, как я думаю.

@Async - Аннотация, обозначающая метод в качестве кандидата для асинхронного выполнения. Может также использоваться на уровне типа, и в этом случае все методы типа рассматриваются как асинхронные.

Эта аннотация @Async не поможет вам отложить время отклика. Для того, чтобы ввести задержку, используйте Thread.sleep(milliseconds);


Если вы хотите основной поток (контроллер), чтобы ждать, пока нить вставки данных, чтобы получить результат (выигрыш/неисправность), вы можете просто ссылаться на код дб слоя от контроллера. Если вы хотите, чтобы ответ клиента отправлялся ранее, создайте новый поток внутри контроллера и используйте этот поток для вставки данных. В последнем подходе к созданию нового потока для вставки данных ваш клиент не будет знать о состоянии вставки данных, так как поток создается в контроллере, и он заканчивается контроллером, клиенту и клиенту не может быть предоставлена ​​обратная связь/ответ , так как у нас не будет деталей клиента.

Надеюсь, что это поможет!

Ссылка: https://www.tutorialspoint.com/java/lang/thread_sleep_millis.htm

+0

Я хочу открыть поток afther, чтобы иметь дело с вставкой Data и клиентом ответа основного потока раньше (основной поток находится в контроллере). –

+0

Вторая проблема связана с вставкой данных, основная нить не дожидается окончания второй нити. –

+0

@HamiltonLin - см. Мой обновленный ответ –

0

@Async должен быть первым включен в вашем @Configuration боба:

@Configuration 
@EnableAsync 
public class AppConfiguration { 

    [...] 
} 

для конфигурации XML добавить следующее: <task:annotation-driven>

+0

Я установил в мой файл spring.xml, тогда он отлично работает с @ Async.Don't enabled @Configuration! –

+0

На самом деле я теряю настройку задачи в файле spring.xml. \ –

+1

'<задача: аннотация-управляемая>' должна использоваться, если вы используете конфигурацию xml – dit

Смежные вопросы