Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >camel读取目录,根据完成任务结果选择目标

camel读取目录,根据完成任务结果选择目标
EN

Stack Overflow用户
提问于 2017-08-24 14:44:22
回答 2查看 268关注 0票数 0

我需要读取包含csv文件(一个或多个文件)的目录。我使用Camel和springboot,并且我需要将任何完全处理(没有错误)的文件移动到OUT dir,但是如果最后的" to“路由失败(抛出异常),我需要将文件移动到REFUSED dir。

当我尝试我的代码时,camel进入无限循环,永远继续处理同一个文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
24/08/2017 16:27:57.070 ERROR [Camel (camel-1) thread #0 - file://src/main/resources/data] - org.apache.camel.processor.DefaultErrorHandler: Failed delivery for (MessageId: ID-CAD1652-39380-1503584865077-0-33 on ExchangeId: ID-CAD1652-39380-1503584865077-0-34). Exhausted after delivery attempt: 1 caught: com.cadit.exceptions.FileNotEvaluableException: Error: file tipo sconosciuto

Message History
---------------------------------------------------------------------------------------------------------------------------------------
RouteId              ProcessorId          Processor                                                                        Elapsed (ms)
[route2            ] [route2            ] [file://src/main/resources/data?idempotent=false&move=OUT%2FVB%2F              ] [        10]
[route2            ] [unmarshal1        ] [unmarshal[org.apache.camel.model.dataformat.CsvDataFormat@28f6cf0f]           ] [         1]
[route2            ] [to1               ] [bean:myCsvHandler?method=doHandleCsvDataVB                                    ] [         8]

Stacktrace
---------------------------------------------------------------------------------------------------------------------------------------
com.cadit.exceptions.FileNotEvaluableException: Error: file tipo sconosciuto
    at com.cadit.handlers.MyCsvHandler.doHandleCsvDataVB(MyCsvHandler.java:172)
    at com.cadit.handlers.MyCsvHandler$$FastClassBySpringCGLIB$$f4b8f70b.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:721)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:656)
    at com.cadit.handlers.MyCsvHandler$$EnhancerBySpringCGLIB$$d81d9e7f.doHandleCsvDataVB(<generated>)
    at sun.reflect.GeneratedMethodAccessor97.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.apache.camel.component.bean.MethodInfo.invoke(MethodInfo.java:458)
    at org.apache.camel.component.bean.MethodInfo$1.doProceed(MethodInfo.java:289)
    at org.apache.camel.component.bean.MethodInfo$1.proceed(MethodInfo.java:262)
    at org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:178)
    at org.apache.camel.component.bean.BeanProducer.process(BeanProducer.java:41)
    at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:145)
    at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:542)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:197)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:120)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:83)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:197)
    at org.apache.camel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:460)
    at org.apache.camel.component.file.GenericFileConsumer.processBatch(GenericFileConsumer.java:227)
    at org.apache.camel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:191)
    at org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:175)
    at org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:102)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

下面是主要代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Component
public class CamelContextConf extends RouteBuilder{

     static final Logger logger = Logger.getLogger(CamelContextConf.class);

    @Override
    public void configure() throws Exception {
        restConfiguration().component("servlet").dataFormatProperty("prettyPrint", "true") ;
                    CsvDataFormat csv = new CsvDataFormat();
        csv.setDelimiter(";");  
        csv.setSkipHeaderRecord(true);


        from("direct:csvprocessor")
        .streamCaching()
        .from("file:src/main/resources/data?move=OUT/VB/")
        .unmarshal(csv) 
        .to("bean:myCsvHandler?method=doHandleCsvDataVB")
        .onCompletion().onFailureOnly().to("file:src/main/reources/data/REFUSED").end()
        .setBody(constant("OK"))
        .setHeader(Exchange.HTTP_RESPONSE_CODE, constant(200))
        .setHeader(Exchange.CONTENT_TYPE, constant("text/html"));

        logger.info("** Route config ok");

    }

然后,在myCsvHandler ->方法doHandleCsvDataVB中,我显式地抛出了一个异常来测试失败:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Component
public class MyCsvHandler {


    @Inject
    AFVINCCrudRepository _entityManagerVINC;

    @Inject
    AFFileCrudRepository _entityManagerAfFile;

        @Transactional(propagation = Propagation.REQUIRED , transactionManager="DbTransactionManagerVB")
    public void doHandleCsvDataVB(List<List<String>> csvData) throws FileNotEvaluableException
    {
        //System.out.println("stampo..");
            if (csvData.size() > 0){
            AfFileEntity afbean = new AfFileEntity();
            afbean.setNomeFile("test");
            afbean.setDataImport(new java.sql.Timestamp(System.currentTimeMillis()));
            afbean.setTipoFile("M");
            afbean.setAfStatoFlusso("I");

            _entityManagerAfFile.save(afbean);

            long pkfile = afbean.getId();
            System.out.println("pkfile: " + pkfile);

            int i = 1; VincEntity vincBean = new VincEntity(); 
            System.out.println(csvData.size());
            for (List<String> rows : csvData){

                ..  
                    _entityManagerVINC.save(..);
                }   

                    throw new FileNotEvaluableException("Il file non è nè una ...");

            }

        }

    }

}

save方法循环并继续在db上保存数据。怎么了?

非常感谢。

EN

回答 2

Stack Overflow用户

发布于 2017-08-24 20:02:19

在您的代码中,不能有from In另一个from。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from("direct:csvprocessor")
.streamCaching()
.from("file:src/main/resources/data?move=OUT/VB/")

您的第二个from("file:...")应该使用enricher。http://camel.apache.org/content-enricher.html

不确定,但在您的doHandleCsvDataVB()方法中,我没有看到try() catch()块。您将直接从for循环到抛出异常。

票数 0
EN

Stack Overflow用户

发布于 2020-06-04 13:03:53

我按照下面的方法将文件从一个文件夹移动到另一个文件夹。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Autowired
FileProcessor fileProcessor;

@Component
public class FileRouteBuilder extends RouteBuilder {
    @Override
    public void configure() throws Exception {
        from("file://{{dir.in}}?readLock=changed&include=.*.csv"&preMove={{dir.progress}}&move={{dir.out}}&moveFailed={{dir.error}}")
                    .process(fileProcessor).setId("Poller");
    }
}

polling

  • dir.progress文件的-Source -File目录将从正在进行中移动到正在进行中process

  • readLock=changed -在process

  • readLock=changed期间发生任何错误时,文件将移动到此处-这将在reading

  • include期间锁定文件-这将只读取源目录中的csv文件,即在文件夹中

根据您的需要,您可能有也可能没有处理器。如果你不想要处理器,那么使用下面的代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from("file://{{dir.in}}?readLock=changed&include=.*.csv"&preMove={{dir.progress}}&move={{dir.out}}&moveFailed={{dir.error}}")
                        .setId("Poller");

请注意,如果您不使用preMove,则会在“in”文件夹中创建默认的.camel文件夹,并将文件的一个副本移动到.camel文件夹中。除非我们手动删除,否则文件将始终存在于目录中。

因此,我建议您在路由中使用preMove。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45864600

复制
相关文章
jquery根据属性选择
有信仰的人不会孤独。——阿列克谢耶维奇 分享一个jquery选择器的小技巧 我们可以通过自定义属性键值选中一个元素 例如如下元素: <div ruben="vampire">阿超</div> 然后我们通过ruben=vampire选中这个div 就可以如下写法: let vampire = $('div[ruben="vampire"]') 我们可以简单测试一下输出里面的内容 <div ruben="vampire">阿超</div> <script type="text/javascript">
阿超
2022/08/17
1.9K0
jquery根据属性选择
【Java】根据程序,写输出结果
一、根据程序,写输出结果: 根据程序,写输出结果: 根据程序,写输出结果:
陶然同学
2023/02/24
7440
【Java】根据程序,写输出结果
Jenkins读取Allure结果出报告
http://updates.jenkins-ci.org/download/plugins/
清菡
2020/12/02
1.4K0
Jenkins读取Allure结果出报告
node.js 读取文件目录下的所有文件,JS读取文件目录
 文件目录结构如下图: 代码1.js: 进入test目录: 进入ch目录: 1.js: var fs = require('fs'); var join = require('path').join;
acoolgiser
2019/01/17
14.2K0
Python读取结果写入Excel中
列表嵌套字典。Excel中的url,test_method,data,title等都是一个键,url,test_method,data,title下面的数据就是要取的值,也就是Key和value的形式。
清菡
2020/12/02
2.3K0
Python读取结果写入Excel中
Python3 将源目录中的图片根据设定最长边参数保存到目标目录脚本(Image 的使用)
如果我们给客户制作网站,客户会发送过来一堆的图片,这些图片一般都是通过手机或者数码相机拍摄的。有一个问题就是这些图片会比较大。那我们就需要对这些图片进行压缩的处理,这就是我写的这个脚本的实际用途。
FungLeo
2019/05/27
1.2K0
Excel 根据sheet生成目录和链接
Sub createmulu() For i = 1 To Sheets.Count Cells(i, 1) = Sheets(i).Name Next End Sub
用户5640963
2019/07/27
1.6K0
Maven根据Profiled读取不同配置文件
在日常开发中,我们大多都会有开发环境(dev)、测试环境(test)、生产环境(prod),不同环境的参数肯定不一样,我们需要在打包的时候,不同环境打不同当包,如果手动改,一方面效率低,容易出错,而且每次打包都改动,非常麻烦,所以Maven给我们提供了profile的配置。
全栈程序员站长
2022/08/13
4910
Maven根据Profiled读取不同配置文件
使用Dapper读取Oracle多个结果集
Dapper对SQL Server支持很好,但对于Oracle有些用法不一样,需要自己进行特殊处理。
跟着阿笨一起玩NET
2022/05/10
1.2K0
Flowable实战-Camel使用「建议收藏」
本博客将讨论了如何在Flowable 6.4.1中安装和使用Camel。 希望在阅读此博客后,您将能够设置Flowable Task应用程序,以允许用户运行可以通过Camel路由与其他应用程序集成Flowable。 此博客使用Flowable Camel模块中的示例。
全栈程序员站长
2022/08/31
2.8K0
Flowable实战-Camel使用「建议收藏」
springboo根据目录结构自动生成路由前缀
配置文件中配置api的根目录 missyou: api-package: com.lin.missyou.api 重写getMappingForMethod方法 import org.springframework.beans.factory.annotation.Value; import org.springframework.web.servlet.mvc.method.RequestMappingInfo; import org.springframework.web.servlet.mvc.m
听城
2020/05/09
5920
如何根据目标表格式进行整理数据?
最近因为有在准备替拉美最大电商平台Mercadolibre在国内招商,所以需要把商家提交的资料进行整理,达到给国外要求的目标格式。因为渠道来源有多种多样,怎么快速统一并汇总是个问题,这就产生了本次案例的需求来源。
逍遥之
2020/03/24
7440
如何根据目标表格式进行整理数据?
python 根据csv表头、列号读取数据
设置index_col=0,目的是设置第一列name为index(索引),方便下面示例演示
lovelife110
2021/01/14
3.9K0
python 根据csv表头、列号读取数据
Linux下目录编程(读取、创建、拷贝)
之前有几篇文章介绍了Linux下文件编程,那么目录和文件编程类似,也有一套函数,可以打开,读取、创建目录等。创建目录、文件除了命令以外(mkdir、touch),都有对应的函数实现相同功能。 使用较多的就是遍历目录的功能,比如: 音乐播放器需要循环播放指定目录下所有音频文件,视频播放器需要遍历指定目录查找所有的视频文件加入到播放列表等等。
DS小龙哥
2022/01/10
5.4K0
Linux系统读取目录内文件顺序
在上一篇应用依赖不同的Netty版本引发的错误文章中, 在WEB-INF/lib目录下存在多个版本的Netty, 应用加载jar包的顺序颠倒, 导致应用启动报错. 而重点就在于加载jar包顺序.
书唐瑞
2022/06/02
3.5K0
Linux系统读取目录内文件顺序
SpringBoot 根据不同profile选择不同配置
参考 :https://blog.csdn.net/top_code/article/details/78570047
石臻臻的杂货铺[同名公众号]
2021/07/14
3820
HLAminer:根据NGS数据确定HLA分型结果
PCR-SBT方法是世界卫生组织WHO推崇的HLA 分型的金标准,其实就是指的直接测序,无论是WGS, WES, RNA_seq 数据都可以。近几年来涌现了很多的软件,支持从NGS测序数据直接确定HLA Allel, HLAminer 就是其中之一。
生信修炼手册
2020/05/11
1.4K0
【说站】Python如何根据输入参数计算结果
define function,calculate the input parameters and return the result.
很酷的站长
2022/11/24
5760
【说站】Python如何根据输入参数计算结果
Springboot项目读取resources目录下的文件
以下这种方式只适合本地启动获取,打成jar包后不能用: File file = ResourceUtils.getFile("classpath:template/test.xlsx"); 可以通过一下两种方式解决,获取不到文件得情况: 方法1: InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("template/test.xlsx"); 方法2: InputStream
时光_赌徒
2021/12/29
1.5K0
点击加载更多

相似问题

根据目标目录中的名称和标记文件选择目录

13

如何使用Apache Camel读取OneDrive目录?

11

Apache camel读取目录并获取文件内容。

16

Make:根据目录状态运行目标

22

Camel SQL组件-简单选择查询结果

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文