2016-08-30 8 views
3

Spring AOP Aspectにタイムアウト実行を提供する方法は?Spring AOPのタイムアウト実行Aspect Aspect

私はメソッドの実行を停止したいない場合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

あなたのリプレイのおかげで、それは右のように見えるが、それを説明することはできますか? Callメソッドが30秒以上かかると、それは中断されますか? – user2602584

関連する問題