我开发了一个 Java Camel 项目,可以将文件从resources/data/inboxSFTP 服务器移动到 SFTP 服务器。
当我运行它时,我收到此消息:
/usr/lib/jvm/jdk1.8.0_144/bin/java... log4j:WARN 找不到记录器的附加程序(org.apache.camel.impl.DefaultCamelContext)。log4j:WARN 请正确初始化 log4j 系统。log4j:WARN 有关更多信息,请参阅 http://logging.apache.org/log4j/1.2/faq.html#noconfig。进程以退出代码 0 结束
我真的不明白该警告消息的含义。谁能解释我如何处理它?
我必须将请求 xml 存储到数据库中。我正在使用标头变量来做到这一点。
exchange.getIn().setHeader("inputRequestXml", body);
Run Code Online (Sandbox Code Playgroud)
它适用于某些文件而且我在某些文件中遇到了异常,这似乎是因为文件大小。
413 Request entity too large
Run Code Online (Sandbox Code Playgroud)
所以我通过使用骆驼属性改变了实现,如下所示
exchange.setProperty("inputRequestXml", body);
Run Code Online (Sandbox Code Playgroud)
现在我没有得到例外。但恐怕它会在实际的 PROD 环境中处理更大的文件。所以我想知道,标头变量和属性的大小限制是多少?
过去两天我一直在研究 Apache Camel 和 Kafka,希望能了解消息传递框架/代理。Camel/Kafka 的一个可能用例是使用 Kafka 作为消息代理,同时使用 Camel 实现生产者和消费者吗?我看到了一个类似的简短示例,但似乎无法再次找到它。如果不是,Camel:Kafka 组件的意义何在?
是否有使用自定义聚合策略将 JSON 解组为 Apache Camel 中的 POJO 的优雅方法?
我的简单路由从 SQS 获取一条消息,该消息是 JSON。此消息用作另一个服务的输入,而后者又根据消息内容让我知道原始消息应发布到的服务的 URL 是什么。
使用 AggregationStrategy 丰富 EIP 非常适合这一点。但是,我无法弄清楚如何在路由中优雅地将 JSON 解组为 POJO。我可以通过 ObjectMapper 做到这一点,但这看起来很难看。有没有更好的处理方法?一些我还没见过的神奇骆驼酱?
public RouteBuilder route() {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
from("aws-sqs://" + sqsName + "?amazonSQSClient")
.setHeader("Content-Type",simple("application/json"))
.enrich()
.simple("http4://localhost:8080/getUrl")
.aggregationStrategy(new AggregationStrategy() {
@Override
public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
String aPojoStr = newExchange.getIn().getBody(String.class);
ObjectMapper mapper = new ObjectMapper();
RestAnswererResponse responosePojo;
try {
responosePojo = mapper.readValue(aPojoStr, RestAnswererResponse.class);
} catch (JsonParseException e) { …Run Code Online (Sandbox Code Playgroud) 我有一个使用 Spring Boot 和 Apache Camel 构建的 Web 应用程序,我正在实现一个 REST 接口。目前,使用 Camel 默认Servlet或Restlet组件,我没有在响应中获得 HTTP 状态代码原因。
这是我在将 HTTP 状态代码设置为 403 时得到的示例响应:
< HTTP/1.1 403
< Date: Mon, 19 Feb 2018 10:01:21 GMT
< Server: Restlet-Framework/2.4.0
< Content-Type: application/json
< Content-Length: 75
Run Code Online (Sandbox Code Playgroud)
应该如何:
< HTTP/1.1 403 Forbidden
< Date: Mon, 19 Feb 2018 10:01:21 GMT
< Server: Restlet-Framework/2.4.0
< Content-Type: application/json
< Content-Length: 75
Run Code Online (Sandbox Code Playgroud)
如何配置 Camel/Restlet/Servlet 以在 HTTP 状态代码中包含原因?
我目前的配置:
应用程序.java
@SpringBootApplication
public class Application extends SpringBootServletInitializer { …Run Code Online (Sandbox Code Playgroud) 我是骆驼新手,正在编写一个小型 POC 以在现有应用程序中实现。应用程序将 xml 请求作为输入,其中包含请求的服务和相关数据。然后它会一一调用这些服务。当服务被成功调用时,我会在处理器中检索 http 响应代码,如下所示,并执行进一步的逻辑:
Object code = exchange.getIn().getHeader(Exchange.HTTP_RESPONSE_CODE);
if(null!=code && code instanceof Integer)
{
responseCode = (Integer) code;
}
Run Code Online (Sandbox Code Playgroud)
在成功的情况下,收到的 responseCode = 201
根据responseCode,我知道服务调用是否成功,然后继续下一个。
但是,我试图通过使服务 url 不正确来产生负面情况,并且再也看不到 http 响应代码:
原始服务网址 - http://xxx:0000/.../.../.../.../...
修改后的服务网址 - http://xxx:0000/.../.../.../.../abc/...
在失败的情况下,收到的 responseCode = null
在邮递员中,我收到以下错误:
org.apache.camel.http.common.HttpOperationFailedException:HTTP 操作失败调用
http://xxx:0000/.../.../.../.../abc/...statusCode: 404 at org.apache.camel.component.http.HttpProducer.populateHttpOperationFailedException(HttpProducer.java:274) at org.apache.camel.component。 http.HttpProducer.process(HttpProducer.java:183)
我不知道为什么当邮递员的错误消息中出现 http 响应代码时,Exchange 不包含它。
我使用 onException 来处理任何异常,然后调用处理器来进一步处理流程:
<camel:onException>
<camel:exception>java.lang.Exception</camel:exception>
<camel:process ref="xxxProcessor" />
</camel:onException>
Run Code Online (Sandbox Code Playgroud)
我想我可以将 responseCode=null 视为失败并继续我的逻辑,但想了解为什么响应代码被返回为 null。
提前致谢!
现有应用程序使用 Camel 日志记录(陷入“log()”DSL,以及 Log 组件。
我们希望拦截或覆盖,以便每条日志消息也记录出特定的 Header 值(例如 x-correlation-id=ABC-123)
实现这一目标的好的惯用方法是什么?
我试图通过阅读这篇文章来解决何时使用 Apache Camel 是合适的还是不合适的 - https://dzone.com/articles/when-use-apache-camel。文章中提到,在服务数量较少的情况下,使用Camel这样的集成框架可能会有些矫枉过正,这是有道理的。但是我被这句话搞糊涂了
尽管 FuseSource 提供商业支持,但我不会将 Apache Camel 用于非常大的集成项目。在大多数情况下,ESB 是完成这项工作的正确工具。它提供了许多附加功能,例如 BPM 或 BAM。当然,您也可以使用多个单一的框架或产品并“创建”您自己的 ESB,但这是浪费时间和金钱(在我看来)。
这是因为集成框架缺少 ESB 提供的组件吗?如果有,那些是什么?
在 Camel 2.x 中,我可以向消息添加附件,例如:
exchange.getOut().addAttachment("LogFile.log.gz", new DataHandler(Base64.decodeBase64(FileContentBase64),"application/x-gzip"));
Run Code Online (Sandbox Code Playgroud)
但在 Camel 3.0 中这是不可能的。我像迁移指南所说的那样更改我的代码:
exchange.getMessage().addAttachment("LogFile.log.gz", new DataHandler(Base64.decodeBase64(FileContentBase64),"application/x-gzip"));
Run Code Online (Sandbox Code Playgroud)
但它不起作用。这也不是:
exchange.getIn().addAttachment("LogFile.log.gz", new DataHandler(Base64.decodeBase64(FileContentBase64),"application/x-gzip"));
Run Code Online (Sandbox Code Playgroud)
有一个想法,来解决这个问题。
我想通过电子邮件发送此附件。
我正在升级到骆驼 3.x 并且在寻找方法时遇到了一些麻烦。他们的迁移指南并没有完全涵盖所有内容。具体来说,我正在寻找替代品:
camelContext.addRouteDefinitions(...)
...
camelContext.getRouteDefinitions()
Run Code Online (Sandbox Code Playgroud)
我无法在文档中找到任何这些内容。
编辑:
我可以用这个直接打电话给他们:
camelContext.getExtension(Model.class).getRouteDefinitions()
Run Code Online (Sandbox Code Playgroud)
但这似乎不太合适……
apache-camel ×10
java ×5
apache-kafka ×1
esb ×1
fuseesb ×1
json ×1
messaging ×1
rest ×1
restlet ×1
spring ×1
spring-boot ×1
xml ×1