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

Apache Camel:无法删除文件并锁定

饶元章
2023-03-14

我正在使用ApacheCamel文件组件从本地目录读取数据并上传到AWS S3存储桶。这条路线在过去工作得很完美,但现在每天都有一些文件出现问题。

在我迄今为止的调试调查(3天的痛苦)中,我发现该路由到达了委托同步处理器类,并且在交换上没有设置任何异常(供参考,请参阅下面前面提到的类的相关代码)。考虑到没有任何异常,我似乎无法弄清楚为什么onComplection()方法从不针对特定文件触发。有问题的文件没有/没有任何异常;但是,在所有逻辑执行后(包括将消息最终传输到. to()endpoint),文件和锁继续存在,暗示存在一些内部Camel问题。我怀疑这是因为路由在除了文件和锁删除之外的各个方面都表现正常。

在为Camel启用调试日志后,我很沮丧地看到在路由执行期间没有与错误相关的日志。我很想听听关于引擎盖下可能发生的事情的任何建议。

一些额外的事情要注意:

  • 我在跑骆驼2.16.0

更新:

使用为camel启用的调试日志进行更多调试没有结果。我只发现我的. Process()代码中的逻辑是问题所在。当代码执行时间过长(即使没有异常)时,文件删除失败。

更新2:

我发现骆驼路线实际上是在哪里分崩离析的。CamelEventLogger.java类在尝试“logEvent”时完全失败。下面添加了该类的相关代码。当代码到达matcher.find()时,它超时。

我的路线课。爪哇:

from(importProcessingEndpoint)
        .convertBodyTo(byte[].class)
        .process((exchange) -> {
           // some logic here
        })
        .to(outgoingEndpoint)
        .threads(MAX_NUMBER_OF_CAMEL_THREADS)
        .process((exchange) -> {
           // some logic here
        })
        .log("Finished processing import file.")
        .to(outgoingEndpoint);

委派同步处理器。爪哇:

@Override
public boolean process(Exchange exchange, AsyncCallback callback) {
    // force calling the sync method
    try {
        processor.process(exchange);
    } catch (Throwable e) {
        // must catch throwable so we catch all
        exchange.setException(e);
    } finally {
        // we are bridging a sync processor as async so callback with true
        callback.done(true);
    }
    return true;
}

骆驼事件记录器。JAVA

private void logEvent(final String label, final Exchange exchange, final Endpoint endpoint,
            final long elapsedTime, final boolean logTID) {
        Matcher matcher = PATTERN.matcher(extractMessage(exchange));
        if (matcher.find()) {
            //CHECKSTYLE:OFF
            String evtType = matcher.group(1);
            String evtName = matcher.group(2);
            String guid = matcher.group(3);
            String tid = matcher.group(4);
            //CHECKSTYLE:ON
            if (tid == null || !logTID) {
                tid = "";
            } else {
                tid = "intuit_tid=" + tid;
            }
            log.info(LOG_FORMAT, label, exchange.getExchangeId(), guid, evtName, evtType, endpoint, elapsedTime, tid);
        } else { // the message is not parseable, fall back to minimum log entry
            log.info("Event {} id={} {} elapsedTimeMs={}", label, exchange.getExchangeId(), endpoint, elapsedTime);
        }
    }

共有1个答案

薛高澹
2023-03-14

起初,我很惊讶这不是Camel的常见问题,但在修复它之后,我逐渐意识到这肯定是一个用户错误(尽管这是一个有趣的错误)。

说到这个问题不常见,我会给出我的解决方案(希望它对某人有一定的价值)。

如上所述,我的骆驼路由有挂起并且无法删除锁定文件和消息(在这种情况下是一个文件)。对于有问题的文件消息(我想强调这一点,因为这是一个间歇性问题),调试器似乎把我带到了线程开始挂起的地方。在这里,我意识到我被带到了一个自定义的Camel Logging类。日志记录类将根据不同的输入失败。

我的处境对其他人有什么帮助?我将描述一种在遇到类似情况时进行调试的策略。

如果camel路由的行为类似,请找到一个路由挂起的用例,暂停调试器(在它开始挂起后)并进行线程转储。它就在这个线程转储和暂停的调试器中,您可以在其中回溯一点。对我来说,我注意到大约10帧/步之前,我到达了一个奇怪的类。我在那里设置了一个调试点,可以看出这是有问题的。

 类似资料:
  • 问题内容: 我必须从指定的路径中删除属性文件。我使用以下代码: 返回false。 但是成功删除了一个文本文件而不是属性文件。 问题答案: 失败的原因有两个: 这是一个目录,不能为空 您没有操作系统权限才能删除文件 该文件仍在某处打开 最后一个可能是您自己的错误,如果您为该文件打开了FileInput / OutputStream却忘记了将其关闭。

  • 我对在ubuntu中使用PHP unlink()删除文件感到沮丧。 我创建了一个非常简单的模拟,如下所示: 使用766权限在/var/www下创建名为“files”的文件夹 “image.png”仍然存在于“files”目录中 这里是delete.php的php脚本: 我还尝试了以下脚本: 但仍然无法删除该文件。

  • 我在我的本地有一个cordova插件。我可以通过键入将其添加到我的项目中而没有问题: 添加cordova插件——链接/用户/goforu/工作区/MyProject/cordovaPlugins/cordova插件IFlyspeech 但我无法将其从我的项目中删除: 它总是记录错误 错误:项目中不存在插件“cordova Plugin Xunfeilistenspeak”。请参见cordova插件

  • 我正在研究我的高中顶点。这是一个程序,用户可以从互联网下载歌曲并以有组织的方式存储它们并播放它们。我的程序必须包含一个功能,用户只需按一个按钮即可删除指定的.mp3文件。我已经在媒体播放器上尝试了.dispose()方法,然后尝试删除似乎不起作用的文件。它会产生一个错误,指出.mp3文件仍在使用中。如何阻止 Javafx 访问该文件?我在网上搜索了答案,但没有一个答案适合我的需求。如果有人能为我提

  • 我正在寻找一个简单的批处理脚本,它将允许我删除旧文件并记录它是否删除了旧文件。搜索完网站后,我发现“forfiles”非常有用: 来自:批处理文件以删除超过N天的文件 正如我所说,我关心的是记录已删除的内容。我尝试了很多东西,但仍然不起作用。这是我的实际代码: 日志文件已创建,但为空,旧文件不会被删除。(它应该删除我2016年的8个文件)当我使用原始代码时,它会删除文件。我可能读过关于逃离 目标是