繁体   English   中英

将对象添加到arraylist时,如何在Springboot上创建触发器?

[英]How can I create a trigger on Springboot when an object is added to an arraylist?

我有一个问题要解决,我不确定如何进行。 我有一个接收要处理的文件的端点。 这个文件很大,所以我想将它包含在一个列表中,返回一个类似“添加到处理列表中的元素”的响应,然后使用调度程序处理所有数据。

我实现了一个调度程序,它每秒检查列表中是否包含新元素,如果是,我开始处理信息,就像这样:

@Service
@Transactional("generation-transaction_manager")
@Slf4j
@EnableScheduling
public class SchedulerService
{
    @Scheduled(fixedRate = 1000)
    public void checkList()
    {
        if (!OwnConfiguration.fileList.isEmpty())
        {
           
            // Do something
        }
    }
}

但我认为这不是一种有效的方法,我只想在列表中包含元素时执行该方法,就像触发器一样。

你知道我需要使用哪些类或库吗? 我有点绝望

编辑:仅异步运行一个方法在这种情况下不起作用,因为我需要一个一个地加载文件,验证前一个文件是否已成功加载。 我需要确保之前加载了上一个文件才能从下一个文件开始

做到这一点的“最佳”方法是使用队列。 https://docs.spring.io/spring-amqp/reference/html/它有许多额外的优点,但它更复杂。

另一种方法是异步方法。 你说你的执行顺序有问题。 您可以使用线程池 singleThreadExecutor 来实现这一点(而不是 async/await),它应该尊重任务启动的顺序。 https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executors.html#newSingleThreadExecutor()

相关的javadoc引用:

创建一个使用单个工作线程在无界队列上运行的 Executor。 (但请注意,如果该单线程在关闭前的执行过程中因失败而终止,则如果需要执行后续任务,则新线程将取代它。)任务保证按顺序执行,并且不会有多个任务处于活动状态在任何给定时间。 与其他等效的 newFixedThreadPool(1) 不同,返回的执行程序保证不可重新配置以使用额外的线程。

但是最好的解决方案是使用队列,你可以获得更大的弹性,运行多个 pod 的能力(如果你扩大服务,所有其他解决方案都会中断)等等。

您可以创建自己的类来扩展 ArrayList 并覆盖 add 方法,您可以在其中添加对 fireAction 方法“触发器”的调用

class MyArrayList<X> extends ArrayList<X>{
//...
//...
// override the add method here 
public boolean add (X x) {
 fireAction();
 super.add(x);
 }


  public static void fireAction(){
  // .... put your code here 
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM