2016-08-30 4 views
3

Как я могу обеспечить выполнение тайм-аута для параметра AOP Spring AOP?, обеспечивающий выполнение тайм-аута для параметра AOP Spring AOP

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

MyAspect Код:

@Aspect 
@Component 
public class MyAspect { 

    @Autowired 
    private myService myService; 

    @AfterReturning(pointcut = "execution(* xxxxx*(..))", returning = "paramOut") 
    public void logger(final JoinPoint jp, Object paramOut){ 
     Event event = (Event) paramOut; 
     myService.save(event); 
    } 
} 

MYSERVICE Интерфейс:

public interface myService { 
    void save(Event event); 
} 

myServiceImpl:

@Service 
@Transactional 
public class myServiceImpl implements myService { 

    @PersistenceContext 
    private EntityManager entityManager; 

    @Override 
    public void save(Event event) { 
     entityManager.persist(event); 
    } 
} 
+0

Пожалуйста, вставьте код в вопрос –

+0

@LajosArpad сделано, что я хочу сделать, это: избегать, что метод логгера моего Аспекта принимает неограниченное выполнение времени. Спасибо – user2602584

+0

Я бы предложил использовать асинхронное ведение журнала, тогда он может потребоваться, хотя это и нужно. – Taylor

ответ

2

Использование java.util.concurrent.Future, чтобы проверить таймаут. Смотрите следующий пример:

@AfterReturning(pointcut = "execution(* xxxxx*(..))", returning = "paramOut") 
public void logger(final JoinPoint jp, Object paramOut){ 
    Event event = (Event) paramOut; 

    ExecutorService executor = Executors.newSingleThreadExecutor(); 

    Future<Void> future = executor.submit(new Callable<Void>() { 
     public Void call() throws Exception { 
      myService.save(event); 
      return null; 
     } 
    }); 

    try 
    { 
     future.get(30, TimeUnit.SECONDS); 
    } 
    catch(InterruptedException | ExecutionException | TimeoutException e){ 
     //do something or log it 
    } finally { 
     future.cancel(true); 
    } 

} 
+0

Спасибо за ваш повтор, он выглядит правильно, но можете ли вы объяснить его? как насчет того, если метод вызова займет более 30 секунд, он будет прерван? – user2602584