跟踪文件导入数据库

2024-03-04

我需要使用以下 Java 代码测试文件导入状态:

    @EventListener
    public void handleContextStart(ContextRefreshedEvent eventd) throws IOException, InterruptedException {
        System.out.println("Handling context started event.!!!");

        System.out.println("Running file verifier");
        System.out.println("monitoring folder " + folderPath);

        WatchService watchService = FileSystems.getDefault().newWatchService();
        Path path = Paths.get(folderPath);
        path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY);
        WatchKey key;
        while ((key = watchService.take()) != null) {
            for (WatchEvent<?> event : key.pollEvents()) {
                System.out.println("Event kind:" + event.kind() + ". File affected: " + event.context() + ".");
                if(event.kind().equals(StandardWatchEventKinds.ENTRY_DELETE)){
                    Instant start = Instant.now();

                    AtomicBoolean flag = new AtomicBoolean(true);

                    while(flag.get()) {
                        while ((key = watchService.take()) != null) {

                            List<EntityImportRequestsTable> list = entityImportRequestsService.findAll();
                            HashMap<String, String> map = new HashMap<>();
                            for(EntityImportRequestsTable item : list){
                                map.put(item.getRequestXmlSourceFile(), item.getStatusCode());
                            }

                            map.entrySet().forEach(entry -> {
                                System.out.println(entry.getKey() + " " + entry.getValue());

                                // compare file name from list and file name from the delete event by file name
                                if(entry.getKey().contains(event.context().toString())){
                                    // exit the monitoring while loop
                                    flag.set(false);
                                }
                            });
                        }
                        Thread.sleep(1000);
                    }

                    Instant end = Instant.now();
                    System.out.println(Duration.between(start,end));

                    long seconds = TimeUnit.MILLISECONDS.toSeconds(Duration.between(start,end).getSeconds());
                    long minutes = TimeUnit.MILLISECONDS.toMinutes(Duration.between(start,end).getSeconds());

                    System.out.format("Execution time %d minutes %d seconds", minutes, seconds);


                }

            }
            key.reset();
        }

        watchService.close();
    }

当从测试的应用程序处理文件时,该文件将被删除并导入到数据库中。如果文件导入成功,则状态已完成。

当我运行上面的程序时,没有任何反应。您知道如何正确跟踪文件导入吗?


您对事件的循环是有缺陷的,因为它会跳过事件,因为您有两次调用watchService.take()。第二个调用可能会阻塞,如果它有效,事件将被跳过,因此内部循环可能永远不会正确匹配删除或退出。删除第二个take():

while ((key = watchService.take()) != null) {
   ... 
   while ((key = watchService.take()) != null) {
   ... 

这是设置 WatchService 的逻辑示例,您应该尝试使用System.out.println()了解它是如何工作的:

Path watchDir = Path.of("whatever");
try (WatchService service = watchDir.getFileSystem().newWatchService()) {

    // Add whatever StandardWatchEventKinds events you need
    WatchKey wk = watchDir.register(service, StandardWatchEventKinds.ENTRY_DELETE /*, ENTRY_CREATE ENTRY_DELETE ... ETC */);
    // Insert your own loop termination condition here:
    while (running) {
        WatchKey key = service.poll(1, TimeUnit.SECONDS);
        if (key == null) {
            continue;
        }

        for (var event : key.pollEvents())  {
            Path evPath  = (Path) event.context();
            Path absPath = ((Path) key.watchable()).resolve(evPath);
            Kind<?> kind = event.kind();

            System.out.println("Kind=" + kind + " Path=" + evPath+" AbsPath=" + absPath);
            // Check each event to see if your termination condition is met
        }

        key.reset();
    }
}

运行上面的命令应该会让您了解什么WatchService提供,您可以将自己的逻辑填写到pollEvents()循环处理每个删除通知:

 // Check each event to see if your termination condition is met
 if (kind == StandardWatchEventKinds.ENTRY_DELETE) {
     if (absPath is one of the files you want) {
         Mark as received + print timings
         running = (number of remaining files you want > 0);
     }
 }

您可能会发现将监视服务部分重构为单独的组件更容易,以便它整理事件并将一组更改传递给侦听器 - 请参阅例子在这里 https://stackoverflow.com/questions/65223686/java-watchservice-perform-action-on-event-using-threads/65251819#65251819.

如果循环内的侦听器/处理程序可能需要一些时间,请在单独的线程中运行监视服务和处理程序,以便事件循环跟上监视事件发布,并且不要使用sleep因为这可能会导致溢出事件,因为您的侦听器/处理程序太慢。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

跟踪文件导入数据库 的相关文章

  • 我是否需要安装 SQLite 才能使 SQLiteJDBC 正常工作?

    我想我只是没有 明白 如果我的计算机上尚未安装 SQLite 并且我想编写一个使用嵌入式数据库的 Java 应用程序 并且我将 SQLiteJDBC JAR 下载 导入到我的项目中 那么这就是我所需要的吗 或者 我是否需要先安装 SQLit
  • 有没有创建 Cron 表达式的 Java 代码? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要一个 Java 代码来根据用户输入创建一个 cron 表达式 用户输入是时间 频率和执行次数 只需从评论中添加 自己创建 即可
  • 垃圾收集器如何在幕后工作来收集死对象?

    我正在阅读有关垃圾收集的内容 众所周知 垃圾收集会收集死亡对象并回收内存 我的问题是 Collector 如何知道任何对象已死亡 它使用什么数据结构来跟踪活动对象 我正在研究这个问题 我发现GC实际上会跟踪活动对象 并标记它们 每个未标记的
  • eclipse行号状态行贡献项是如何实现的?

    我需要更新状态行编辑器特定的信息 我已经有了自己的实现 但我想看看 eclipse 贡献项是如何实现的 它显示状态行中的行号 列位置 谁能指点一下 哪里可以找到源代码 提前致谢 亚历克斯 G 我一直在研究它 它非常复杂 我不确定我是否了解完
  • 为什么即使我的哈希码值相同,“==”也会返回 false

    我写了一个像这样的课程 public class HashCodeImpl public int hashCode return 1 public static void main String args TODO Auto generat
  • 如何调试“com.android.okhttp”

    在android kitkat中 URLConnection的实现已经被OkHttp取代 如何调试呢 OkHttp 位于此目录中 external okhttp android main java com squareup okhttp 当
  • Jframe 内有 2 个 Jdialogs 的 setModal 问题

    当我设置第一个选项时 我遇到了问题JDialog模态 第二个非模态 这是我正在尝试实现的功能 单击 测试对话框 按钮 一个JDialog有名字自定义对话框 主要的将会打开 如果单击 是 选项自定义对话框主 其他JDialog named 自
  • Runtime.exec 处理包含多个空格的参数

    我怎样才能进行以下运行 public class ExecTest public static void main String args try Notice the multiple spaces in the argument Str
  • Sun 在 EDT 之外做 GUI 工作的演示?

    我正在看SplashDemo java http download oracle com javase tutorial uiswing examples misc SplashDemoProject src misc SplashDemo
  • 如何在字段值无效的情况下更改 Struts2 验证错误消息?

    我在 Web 表单上使用 Struts2 验证 如果字段假设为整数或日期 则
  • 如何仅从 Firestore 获取最新更新的数据?

    在 Firestore 上发现任何更改时始终获取整个文档 如何只获取最近更新的数据 这是我的数据 我需要在第一次加载时在聊天中按对象顺序 例如 2018 09 17 30 40 msg和sendby 并且如果数据更新则仅获取新的msg和se
  • 如何在 ant 中为 junit 测试设置 file.encoding?

    我还没有完全完成file encoding 和 ant https stackoverflow com questions 1339352 how do i set dfile encoding within ants build xml
  • 在Java中运行bat文件并等待

    您可能会认为从 Java 启动 bat 文件是一项简单的任务 但事实并非如此 我有一个 bat 文件 它对从文本文件读取的值循环执行一些 sql 命令 它或多或少是这样的 FOR F x in CD listOfThings txt do
  • 轻松的反应

    我有一个与这里描述的类似的案例 动态更改RESTEasy服务返回类型 https stackoverflow com questions 3786781 dynamically change resteasy service return
  • 为什么\0在java中不同系统中打印不同的输出

    下面的代码在不同的系统中打印不同的输出 String s hello vsrd replace 0 System out println s 当我在我的系统中尝试时 Linux Ubuntu Netbeans 7 1 它打印 When I
  • Hibernate 本机查询 - char(3) 列

    我在 Oracle 中有一个表 其中列 SC CUR CODE 是 CHAR 3 当我做 Query q2 em createNativeQuery select sc cur code sc amount from sector cost
  • 列表过滤器内的 Java 8 lambda 列表

    示例 JSON id 1 products id 333 status Active id 222 status Inactive id 111 status Active id 2 products id 6 status Active
  • Java/Python 中的快速 IPC/Socket 通信

    我的应用程序中需要两个进程 Java 和 Python 进行通信 我注意到套接字通信占用了 93 的运行时间 为什么通讯这么慢 我应该寻找套接字通信的替代方案还是可以使其更快 更新 我发现了一个简单的修复方法 由于某些未知原因 缓冲输出流似
  • 由 Servlet 容器提供服务的 WebSocket

    上周我研究了 WebSockets 并对如何使用 Java Servlet API 实现服务器端进行了一些思考 我没有花费太多时间 但在使用 Tomcat 进行一些测试时遇到了以下问题 如果不修补容器或至少对 HttpServletResp
  • Java 和/C++ 在多线程方面的差异

    我读过一些提示 多线程实现很大程度上取决于您正在使用的目标操作系统 操作系统最终提供了多线程能力 比如Linux有POSIX标准实现 而windows32有另一种方式 但我想知道编程语言水平的主要不同 C似乎为同步提供了更多选择 例如互斥锁

随机推荐