当前位置: 首页 > 知识库问答 >
问题:

为Spring AOP 方面提供超时执行

张玺
2023-03-14

如何为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);
    }
}

共有1个答案

邢凌
2023-03-14

使用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);
    }

 }
 类似资料:
  • 我有一个应用程序,我需要一个长时间运行的Selenium web驱动程序实例(我在无头模式下使用Chrome驱动程序83.0.4103.39)。基本上,应用程序不断地从队列中提取url数据,并将提取的url提供给Selenium,Selenium应该对网站进行一些分析。许多这样的网站可能会关闭,无法访问或中断,所以我设置了10秒的页面加载超时,以避免Selenium永远等待页面加载。 我这里遇到的

  • 问题内容: 我浏览了文档,但找不到使用Spring 3.0使用@Async带注释的方法时,是否有办法为生成的异步操作指定超时。 有没有办法做到这一点?我认为这在触发异步计算时非常重要。 问题答案: 注释不提供超时,因为超时应由函数的调用者而不是函数本身决定。 我假设您是在-annotated方法上引用超时,该方法返回结果。此类方法应返回的实例,并且on 方法用于指定超时。 例如 然后

  • 我有一个PHP Android推送通知脚本。当我运行脚本时,我在浏览器中得到以下响应“504网关超时nginx”。在常规日志概述中的服务器上,我收到以下错误: 错误: 504,消息: GET/gcm_test.phpHTTP/1.1,来源: nginx SSL访问 在我的服务器上的代理错误日志中,我收到以下错误: 2016/07/25 08:18:19[错误]23882#0:*4375从上游读取响

  • 我在我的项目中使用了SQS。我想在将消息推送到SQS标准队列时提供超时。我所说的超时(不是可见性超时)是指,如果我的消息没有在200毫秒内推送到SQS,那么我会在某个时候重试推送它。我使用JAVA API来实现同样的目的。 最初,我试图通过请求一个可调用的任务将消息推送到SQS来处理超时,它返回给我一个未来的对象,我通过提供超时来等待。但这导致请求被发送到SQS,当消息被推送时,我的超时出现在图片

  • 在下面的代码中,我试图理解java-8中提供的可选的概念。我创建了下面的例子来掌握orElse()背后的原理。执行代码后,defaultmethod()的主体被执行,并返回 对象y。log语句按照我的预期打印了正确的数据。 问题是,为什么defaultMethod()中的所有日志都没有打印??引入is-orElse()仅返回值,而不执行所提供方法的整个主体。? 代码: 日志:

  • 我正在使用调用Android上的云函数,但如果需要超过10秒,则该函数返回error。当我在firebase(服务器端)上检查时,它显示功能完成(没有任何错误)。 她是我的职责, 下面是堆栈跟踪日志, 更新:Firebase控制台日志 是不是我错过了什么?我真的很感激任何帮助。