问题标签 [apache-camel-3]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 如何让 @UseAdviceWith 在 Camel 3 中工作
我正在为 Spring Boot 应用程序中的生产 Camel 路由编写一些单元测试。为此,我使用adviceWith
技术并且不希望CamelContext
在建议完成之前开始。使用 Camel 2.24.2,我的测试类看起来像下面的一个片段,为了简洁起见,我省略了自动装配和测试期望等细节。
运行这个测试我得到了预期的日志
现在,是时候迁移到 Camel 3 了,建议部分必须重写如下,它工作得很好
除了 CamelContext 会自动启动,所以我们重新启动了建议的路线
这似乎是一个错误,或者我错过了什么?
PS
经过一番研究,我发现在 Camel 2.21 版本中已经修复了一个问题CamelSpringBootExecutionListener.java
,所以我检查了分支中的文件3.4.x
,它看起来不错,但是在仔细查看我的日志文件后,我注意到没有@RunWith(CamelSpringBootRunner.class)准备日志,这意味着该prepareTestInstance
方法从未被调用,但我想它应该
apache-camel - 使用骆驼中的XML DSL将Json字符串拆分并在正文中添加添加对象
在我的一个用例中,我需要根据消息中可用的数组列表将入站 json 消息拆分为多条消息。
例如,在下面的消息拆分中,基于“actualData”数组列表进行。
拆分完成后,需要在每条消息中添加“信息”对象,然后再将其发送到下一个路由。这项工作需要在 XML DSL 本身中完成,而不是使用任何 java 处理器或 java 代码。
预期的结果需要是这样的:
拆分消息:1
拆分消息:2
问题陈述:
我能够根据“actualData”数组对象拆分消息,但是当我尝试在最终交换正文中添加附加对象时,我遇到了一些问题,无法使用 jsonpath 将 json 对象转换为字符串。
下面是将为每条消息调用的路由。
我在这里尝试的方法是,在实际拆分发生之前,从原始消息中获取“信息”对象并以“信息”的名称存储到交换属性中,然后在拆分发生后,从交换中引用此属性并准备正文在其中创建一个包含“信息”+“实际数据”对象的 json。
一切都按预期工作,但这里的问题是,当“信息”对象存储在属性字段中时,它不会存储为字符串,而是存储如下。
预计存储如下。
由于这个问题,最终的正文消息不会变成 json 字符串。有人可以帮忙解决这个问题吗?提前致谢。我正在使用骆驼 3.4 版本。
apache-camel - Exchange.NOTIFY_EVENT 交换选项在骆驼 3.4 中已弃用并正在寻找替代方案
我一直在生产者模板中使用 Exchange.NOTIFY_EVENT 选项,如下所示在事件通知程序下的交换创建事件中不再调用交换创建事件,当我使用骆驼 2.24 核心时它工作正常,但现在自从我升级到骆驼3.4.0,它不再工作了。看起来 Exchange.NOTIFY_EVENT 选项已弃用。
有人可以让我知道骆驼 3.4 中有什么替代品,相当于 Exchange.NOTIFY_EVENT 吗?如果有人对此提供一些见解,将不胜感激!..
更新时间:2020 年 10 月 28 日:
我看到 Exchange.NOTIFY_EVENT 已被弃用,并将其移至名为ExtendedExchange的新交易所。现在这个exchange可以适配ExtendedExchange并且可以设置notifyEvent方法如下。
但问题还没有解决。这是当前代码。
我已经在使用 EventNotifierSupport 的 exchangeCreated 通知中,我想调用另一个不应再次创建通知的路由。这就是为什么我以前通过设置 exchange.NOTIFY_EVENT 属性来调用这种方式的原因。由于 sendBodyAndProperty 方法创建了新的交换并将属性设置为不通知。
但是现在文档说,我们需要使交换适应extendedExchange,并在其中将notifyEvent 设置为true。我的问题是,如果我们使用 sendBodyAndProperty 方法在内部创建交换,我们如何适应扩展交换。
我们该怎么做?有人可以帮我解决这个问题吗?我们有其他方法可以做到这一点吗?
apache-camel - 如何在仅限 Java 的 Camel Main 中配置 REST 属性?
我正在使用以下设置处理一个简单的“hello-world”Camel3(Camel 版本 3.4.3)REST API 示例:
- REST API 在 OpenAPI 规范 (Swagger v2.0) 中有描述
- API 规范使用camel-restdsl-swagger-plugin转换为 Java DSL
- 使用骆驼主
- 100% Java(即没有 XML)
下面的示例按预期工作,但我无法设置jetty
端口。因此,在每次运行时,Web 服务器都会在随机端口上运行。如何在 Java 代码中设置端口(例如设置为 8081)?似乎也可以在application.properties
文件中设置端口。该选项的示例也值得赞赏。
生成的Api101
代码:
编译&运行示例:
从上面可以看出,Web 服务器在端口 44267 中可用:
并且可以成功访问:
spring - 将xml骆驼上下文重新加载到已经注册的相同骆驼上下文中
要求是将表中可用的 spring xml 骆驼上下文加载到应用程序中(单个 XML 中有上下文和路由)。当应用程序启动时,需要从表中读取这个 xml 加载到应用程序中。
例如,假设以下 xml 在表中可用,并且需要在 sprint 启动应用程序启动时从表中读取并加载到应用程序中。
我能够从表中读取 xml 并使用下面的代码加载到应用程序中,并使用“myContext”的名称加载上下文,因为这是我从 xml 传递的名称。
现在第二个要求是,在运行时不关闭应用程序,我想刷新骆驼上下文。例如,如果我对表中的 XML 上下文进行了一些更改,并且如果我执行了一个 api(称为刷新 api),那么现有的骆驼上下文将被关闭并重新加载具有相同上下文名称的新数据。
例子:
我在 xml 中添加了另外一行。现在如果我执行刷新 api,它应该刷新现有的上下文并加载更新的上下文。但这里发生的是,它不会在骆驼上下文中取消注册现有上下文“myContex”,而是创建名为“myContext-1”的新上下文。我知道默认情况下它的一种模式骆驼用于在 Mbean 中注册上下文(如果已经注册)。但我正在寻找不使用新名称注册的选项。我希望取消注册现有名称并再次重新注册时使用相同的名称。我不确定我们如何取消注册。
我实际上正在使用下面的代码来刷新它。
我创建 GenericXmlApplicationContext() 的新实例的原因是,我无法多次使用 refresh() 方法,因为我收到错误消息,抛出“上下文不能多次刷新”的错误消息。
我尝试的其他替代方法是,从 GenericXmlApplicationContext() 实例中删除“myContext”bean 定义。是的,它是第一次工作,但是当我下次尝试使用相同的技术刷新时,“myContext”不在 GenericXmlApplicationContext 实例中。我认为问题是,当我创建新的 GenericXmlApplicationContext() 实例时,不确定它是否已在应用程序中注册。如何获取 GenericXmlApplicationContext() 的所有实例并删除其中的“myContext”bean 并重新创建具有相同名称的 bean。
以下是我之前尝试过的:
在此先感谢..如果有人可以提供有关此的一些信息..
java - CamelExecutionException:java.lang.NoClassDefFoundError:org/apache/camel/tooling/model/ComponentModel
我正在使用 JDK 11、apache camel 3.4.0 和 WildFly 20.0.1.Final,并且在 Wildfly 控制台中出现以下错误。
我已经在 pom.xml 中添加了以下依赖项,并且在将提取的 WildFly-Camel 12.0.0 复制到 WildFly 安装后,我尝试为 camel-tooling-model 依赖项“提供”范围。但我得到与上面相同的错误。
而且我发现(在调试时)以下行是发生异常的确切位置,并观察到ProducerTemplate接口中的requestBodyAndHeaders方法抛出了CamelExecutionException。
这是 ContentBasedRouter 类
非常感谢您提出解决此问题的建议!
error-handling - 带有 CircuitBreaker 的 Apache Camel 3.7.3 日志堆栈跟踪
我们在路由中添加了断路器(resilience4j),带有 inheritErrorHandler(true)(见下文)
我们希望当 CB 打开时,日志中不会显示任何堆栈跟踪,但是会打印出来:
在 3.7.0 中运行相同的示例时,不会打印堆栈跟踪。这是一个错误还是我们错误地使用了 onException 子句?
logging - Apache Camel 3.7.0 断路器和重新交付政策
我们正在尝试将断路器 (resilience4j) 与重新交付政策相结合(参见下面的路线)
我们注意到,如果在 CB 打开时交换处于重试过程中,则会继续调用 onRedelivery 处理器(请参阅日志)。但是,不会调用实际执行出站调用的处理器。
这真的很令人困惑,尤其是当我们增加 kafka 消费者时。这是这种方式吗?可以用其他方式处理吗?我们尝试了“retryUntil”,但这仅在合法重试期间调用(具有 RetryException 的那些 - 不是具有 CB 异常的那些)。
apache-camel - 如何在 Camel 3.XX 中修复每条路线的多个输入?
我有一条看起来像这样的路线:
这条路线在 Camel 2.XX 中完美运行,但在 3.7.X 中不适用
我得到的错误信息:
每条路由只允许一个输入。无法接受输入:From[direct:ABCD]
我检查了迁移指南,但我不知道如何迁移这种路线。
你知道如何进一步解决它吗?