Tag: apache camel

Apache Camel ftp使用者一次又一次地加载相同的文件

我有以下弹簧配置 在ftp方面,我有3个文件夹,包含我要下载的文件。 我想实现以下场景: 在ftp上,第一个数据拉消费者将固定数量的文件(对于isntance 5)加载到目标文件夹 在第二次尝试加载文件时,ftp状态仍然相同(5个文件)和驼峰ftp消费者什么都不做(除了检查新文件) 要ftp到达新的2个文件,并在此数据拉消费者只下载这两个新文件 目前我的当前解决方案每次运行dataload进程时都会下载所有文件,我如何管理有关下载文件的信息以防止重复下载(我的意思是已经从ftp复制了文件),我可以编写自己的filter来过滤掉已下载的文件,但我相信应该有内置function,这将给我控制这个(也许是idempotentRepository,实际上我不确定)…

如何使用Camel和Jackson库将嵌套的键,值对编组到JSON中?

我有一个Java项目,它当前将一个映射返回给Camel,没有任何嵌套的键,值对,并且Jackson库使用Jackson库将它编组到JSON中。 例如,如果我将以下两个键值放入demoMap中: Map demoMap = new TreeMap demoMap.put(“key1″,”5”); demoMap.put(“key2″,”10”); 我得到以下JSON: {“key1″:”5″,”key2″:”10”} 但是,现在我的一些键值条目将具有可选的可见性,我需要将其作为嵌套键值放在我的地图中。 任何没有可选可见性的键值都将使用默认值。 所以,例如,如果我为key1和key2指定了可见性,而不是key3,我希望得到JSON,如下所示: {“key1″:”5”, “key2″:”10”, “key3″:”17”, “visibility” : { “key1”: “a&b&!c”, “key2”: “a&b”, “_default”: “a” } } 如何让Camel使用嵌套键,值对来编组Java对象? 我是一个视觉学习者,所以一个简单的例子会有所帮助。 我尝试更改我的Map以将值作为对象,即: Map demoMap = new TreeMap 然后尝试使用http://examples.javacodegeeks.com/core-java/json/jackson/convert-java-map-to-from-json-using-jackson-example为ArrayList添加一些键的嵌套键值/供参考,但意识到这只是给了我一堆键下的嵌套值,而不是一堆嵌套键,值对。 即使我尝试使用grins,我也遇到了一个来自Camel处理器的错误,其中包含java.lang.ClassCastException,声明java.util.ArrayList无法转换为java.lang.String 同样,当我尝试在我的demoMap中嵌套Map时,我得到了这个ClassCastException: 3244 [hello.world.request.timer] ERROR org.apache.camel.processor.DefaultErrorHandler – Failed delivery for exchangeId: e6518e39-89b7-435e-96d9-ce26811ac67e. Exhausted after delivery attempt: 1 caught: […]

骆驼路线和终点

我一直在倾向于Apache Camel文档,试图对其最基本的两个概念(端点和路由)进行具体的理解,虽然这些术语在整个文档中随处可见,但我找不到实际定义它们的参考它们是用来做什么的。 尽管他们的名字听起来相当明显,而且我想我明白了它们是什么,但我现在已经被分配到了一项让我深入Apache Camel Land的任务,而且我理解这些机制至关重要是。 我的猜测是“端点”只是一个bean – 可以像配置文件一样配置在配置文件中 – 将名称映射到URI /端口组合(这取自W3C文档)。 在Apache Camel的上下文中,我的猜测是端点用于将组件连接在一起,因此可以在它们之间形成“路由”(连接/映射)。 因此,当生活在端点1的组件A想要与生活在端点2的组件B通信时,只要存在从1到2的映射,Camel就能够在这两者之间传输消息。 如果我错了,请阻止我并纠正我! 所以现在,我已经看到了可以在Java中配置路由的示例: from(“endpointA”).routeId(“someMessage”).to(“endpointB”); 我已经看到了可以在XML中配置路由的示例: 这两种方法是用于配置路由,还是它们是完全不同的概念? 最后, 端点之间可以路由的消息格式是什么? 例如,如果它必须是XML,那么这些路由消息的XSD /模式是什么? 如果它必须是Java对象,那么哪些边界/限制适用于Camel可以发送的对象? 提前感谢您对这些简单术语的任何清晰,我真的找不到简单的解释。

JDBC和JMS的Spring事务同步

我有一个在jboss上运行的spring web app,当前配置为使用HibernateTransactionManager进行db事务,JmsTransactionManager用于jms。 对于jms,我们使用Camel和ActiveMQ,我们的数据库是DB2。 在一个事务中,我需要将一些记录写入数据库并发送两个异步jms消息。 jms消息是事件通知,我只希望在数据库事务提交时发送它们。 我愿意接受在jdbc事务已经提交之后与代理通信失败的风险(因此没有发送消息但是db已经提交)所以我认为我不需要正确的XA。 我相信我需要的是使用spring transaction同步的“尽力而为”的事务管理。 Spring文档提示了spring将同步两个事务并仅在jdbc事务提交后提交jms事务这一事实 – 但我不认为它非常清楚。 这里的spring文档http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html#tx-resource-synchronization没有详细介绍它是如何工作的。 我发现了一些其他的消息来源说spring会做我想要的,包括下面的一些javadoc,我已经编写了一些集成测试,也显示了它。 http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/jms/support/JmsAccessor.html#setSessionTransacted%28boolean%29这里的setSessionTransacted上的javadoc听起来就像我想要的那样。 从我所看到的,我认为创建Camel JmsConfiguration并将事务处理设置为true就足够了: 然而,我需要说服我工作的人有点怀疑并且认为我的集成测试只能起作用,因为副作用很少而不是有意的弹簧特征。 所以我的问题是 – 我是否正确可以依赖Spring来同步事务并始终在jdbc事务之后提交jms事务,或者这不是我应该依赖的东西,你能否指出我所说的任何官方文档那清楚吗? 我想一般来说这是一个很好的方法,或者我们应该以不同的方式管理这些交易吗?

Camel保存完整的http请求,但我只想附加文件

我有以下代码库: @Component public class DummyRoute extends RouteBuilder { @Override public void configure() throws Exception { rest(“/upload”).post().to(“file://rest_files”); } @Bean public ServletRegistrationBean servletRegistrationBean() { SpringServerServlet serverServlet = new SpringServerServlet(); ServletRegistrationBean regBean = new ServletRegistrationBean( serverServlet, “/rest/*”); Map params = new HashMap(); params.put(“org.restlet.component”, “restletComponent”); regBean.setInitParameters(params); return regBean; } @Bean public org.restlet.Component restletComponent() { return new org.restlet.Component(); } @Bean […]

Camel发送multipart / form-data请求

我有一个应用程序,它发送一个multipart / form-data和一个收到multipart / form-data请求的应用程序。 收货人处理: InputStreamCache postBody = exchange.getIn().getBody(InputStreamCache.class); MultipartUploadContext mux = new MultipartUploadContext(postBody, exchange.getIn().getHeader(“Content-Type”,String.class)); Map params = mux.parseRequest(); 解析请求,从Postman / Swagger发送工作正常。 我把骆驼发送器和我的骆驼接收器集成在一起很麻烦。 这是发件人路线: from(“direct:uploadFileToRest”).routeId(“uploadFileToRest”). process(“uploadFileRequestProcessor”). setHeader(Exchange.HTTP_METHOD, simple(“POST”)). setHeader(Exchange.CONTENT_TYPE, constant(“multipart/form-data”)). to(“myrecieverapp/full_upload”). id(“fileUploadRestSending”). log(LoggingLevel.DEBUG, “RESPONSE BODY ${body}”). end(); 发件人处理器: MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder .create() .addTextBody(“name”, “SomeName”) .addBinaryBody(“content”, array_with_byte_content_here); exchange.getOut().setBody(multipartEntityBuilder.build()); 发生以下错误: No body available of type: […]

将文件拆分为多个文件

我想剪切一个文本文件。 我想将文件50行剪切50行。 例如,如果文件是1010行,我将恢复21个文件。 我知道如何计算文件的数量,行数,但是一旦我写,它就不起作用。 我使用Camel Simple(Talend),但它是Java代码。 private void ExtractOrderFromBAC02(ProducerTemplate producerTemplate, InputStream content, String endpoint, String fileName, HashMap headers){ ArrayList list = new ArrayList(); BufferedReader br = new BufferedReader(new InputStreamReader(content)); String line; long numSplits = 50; int sourcesize=0; int nof=0; int number = 800; try { while((line = br.readLine()) != null){ sourcesize++; list.add(line); } System.out.println(“Lines in […]

org.apache.camel.NoTypeConversionAvailableException:没有类型转换器可用于转换类型:

我首先有多部分文件,我想将它发送到camel管道并保存此文件的原始名称。 我的代码: @Autowired ProducerTemplate producerTemplate; … producerTemplate.sendBody(“seda:rest_upload”, multipartFile); 另一方面,我有: 从( “SEDA:rest_upload”).convertBodyTo(File.class)。为了( “文件:// rest_files”); 而且我也尝试注册转换器: @Converter public class MultiPartFileToFileConvertor { @Converter public static File toFile(MultipartFile multipartFile) throws IOException { File convFile = new File(multipartFile.getOriginalFilename()); multipartFile.transferTo(convFile); return convFile; } } 当我执行我的代码时,我看到以下stacktrace: Message History ————————————————————————————————————————————— RouteId ProcessorId Processor Elapsed (ms) [route2 ] [route2 ] [seda://rest_upload ] [ 3] […]

如何让Camel FTP只按需获取一次

我对Camel很新。 我一直试图让Camel按需只通过FTP获取一个文件。 我无法让它发挥作用。 这是我尝试过的。 让我知道什么是最好的方法和我的代码有什么问题。 1-在读取文件后发送空消息 ,当收到空消息时,停止路由。 from(“direct:myStart”) .routeId(“routeA”) .pollEnrich(“ftp:…disconnect=true&sendEmptyMessageWhenIdle=true”) .choice() .when(body().isNull()).process(RouteStopper(“routeA”)) .otherwise().to(“validator:file.xsd”) .to(“somewhere”) .end(); 还有我的RouteStopper public class RouteStopper implements Processor { private String routeId; private Thread stopper; public RouteStopper(String routeId) { this.routeId = routeId; } @Override public void process(Exchange exchange) throws Exception { if (stopper == null) { stopper = new Thread() { @Override […]

Camel DELETE方法不支持Content-Type?

如何在Camel DELETE方法中发送内容类型。 我添加了以下方式,但它无法正常工作。 from(“direct:start”) .setHeader(Exchange.HTTP_METHOD, simple(“DELETE”)) .setHeader(Exchange.CONTENT_TYPE, simple(“application/xml”)) .setHeader(Exchange.HTTP_URI, simple(“http://02.02.02.02:8080/rest/delete/student/688187”)) .to(“http://emptyhost”); 你能帮我解决这个问题吗?