Apache Camel是一个功能强大的开源集成框架,基于已知的企业集成模式和强大的Bean集成
Apache Camel:如何并行发送两个http请求并等待响应?
在 Apache Camel 中,我定义了一个路由,如何并行发送两个或多个 http 请求并等待它们的“未来”以获取响应以进行进一步处理,就像在 Java 中使用 AsyncHttp...
Apache Camel:如何获取从 Rest API 返回的消息?
我有一条带有错误处理程序的路线: ... 我有一条带有错误处理程序的路线: <route errorHandlerRef="magentoCustomerErrorHandler" id="customers.route2"> ... <to id="_to1" uri="http4://{{magento.api.url}}customer/"/> </route> 在我的错误处理程序中,我在 onRedelivery 中调用处理器 <bean class="br.com.company.ProcessorError" id="myErrorProcessor"/> <bean class="org.apache.camel.builder.DeadLetterChannelBuilder" id="magentoCustomerErrorHandler"> <property name="deadLetterUri" value="activemq:magento:customers:DQL"/> <property name="onRedelivery" ref="myErrorProcessor"/> <property name="redeliveryPolicy" ref="myRedeliveryPolicyConfig"/> </bean> 在错误处理器中,我尝试获取 API 返回的消息,但我只获取骆驼生成的消息。 ErrorProcessor 类: public void process(Exchange exchange) throws Exception { Exception cause = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Exception.class); exchange.getIn().setHeader("FailedBecause", cause.getMessage()); } API 响应: {"messages":{"error":[{"code":500,"message":"Token doesn't exist or is expired."}]}} 预期消息: Token doesn't exist or is expired 返回信息: HTTP operation failed invoking http://myurl.com/api/rest/customer/ with statusCode: 500 我的错误是我使用的异常类型。 要获取 REST 返回的正文,我需要使用 HttpOperationFailedException。 ErrorProcessor 类 public void process(Exchange exchange) throws Exception { HttpOperationFailedException cause = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, HttpOperationFailedException.class); exchange.getIn().setHeader("FailedBecause", cause.getMessage()); exchange.getIn().setHeader("ResponseBody", cause.getResponseBody()); } 尝试启用 useOriginalMessage 选项: <bean class="org.apache.camel.builder.DeadLetterChannelBuilder" id="magentoCustomerErrorHandler"> <property name="deadLetterUri" value="activemq:magento:customers:DQL"/> <property name="onRedelivery" ref="myErrorProcessor"/> <property name="useOriginalMessage" value="true"/> <property name="redeliveryPolicy" ref="myRedeliveryPolicyConfig"/> Camel 在进行 http 调用时将任何除 200 之外的 HTTP 响应代码视为失败,因此您需要 setThrowExceptionOnFailure 设置为 false 来指示 Camel 路由忽略 http 响应代码并仅返回它收到的任何正文。 这是 Java DSL 示例: getContext().getEndpoint(endpoint, HttpEndpoint.class).setThrowExceptionOnFailure(false); 确保端点是主机:端口,仅不带任何http路径,它完全匹配。 参考:http://camel.apache.org/http.html,寻找throwExceptionOnFailure 请注意,如果设置为 false,则camel不会走异常处理路由,正常返回,需要在camel路由之外处理错误响应。我认为这种方式更好,因为您可以从所调用的服务获得完整的响应,并且您可以根据响应中的实际失败代码/原因进行错误处理。
我们正在 Quarkus 环境中运行 apache-camel,一旦该过程完成,我们希望删除以“camelLock”结尾的文件。我们只是对&qu...
我使用 Apache Camel 的 Spring Main 来启动我的 Camel 应用程序。我需要我的应用程序读取命令行参数来设置一些参数。因此,我无法使用属性文件。 此刻,我可以...
在camel-spring boot应用程序中getObject操作返回元数据而不是来自GCP的对象内容
我有一个 Spring Boot 应用程序,使用 Camel 连接到 google 对象存储以获取对象(文本或照片)。 这是我正在运行的代码: 封装 FootballRestAPI; 导入 org.apache.camel.b...
Camel 重试 - 使用 MockEndpoint 进行单元测试重新交付尝试计数
我正在尝试编写简单的单元测试来验证Camel路由是否配置正确以及是否真正进行了重新传递尝试。我有这个路线构建器实现: LocalEndpoint 类扩展
我们开发了基于Karaf和Apache Camel的应用程序。虽然我们的应用程序完全基于捆绑包(OSGI),但我们还在星上加载 Camel 上下文(及其“路由上下文”)...
无法创建CamelSalesforcesourceSourceConnector:ResolveEndpointFailedException
背景:我是一名Python开发人员,从未使用过Java。 Camel Salesforce Source Connector:v3.20.6(我尝试过 3.21.0 和 4.0.0,但遇到了同样的问题) 卡夫卡:v3.6.1 问题: 尝试...
Apache Camel 将 XML DSL 中每个路由的日志记录到专用目录
如何在 XML DSL 中将每个 Apache Camel 路由定义为单独的专用目录/文件夹的日志记录?我们希望保留现有的记录器。 非常感谢您对前任的清晰而详尽的答复...
如何在quartz.properties文件中动态设置jobstore数据源
我正在使用 Apache Camel 的 Quartz 组件来运行一些预定路线。我想为调度程序配置 JDBC JobStore,并且能够在quartz 中设置必要的属性。
使用 Apache Camel 公开 Rest API - 收到 404
我尝试了非常简单的路线: 休息配置() .component("servlet"); 休息().get(“/你好”) .to(“直接:你好”); 来自(“直接...
从 Camel Rest DSL 生成 OpenAPI 时出错
我们最近将 apache Camel 从 3.x 升级到 4.x。从那时起 swagger 就不再工作了。请参阅 swagger ui 的附图。 启动应用程序时我们收到以下警告。 20...
上下文:我目前正在使用 Apache Camel 执行一些集成任务。我使用 Maven 编译代码,它为我提供了安装在 Apache Karaf 实例(v. 4.4.1)中的捆绑包。在...之上
camel-jms:共享持久订阅:参数subscriptionName转义点(.)
阿帕奇阿耳忒弥斯:2.31.2 弹簧启动:2.7.18 阿帕奇骆驼:3.22.0 我有一个关于 ActiveMQ Artemis 中 Camel 共享持久订阅的问题。 我已从 ActiveMQ Classic VirtualTopics 迁移,...
我正在尝试使用“camel-azure-storage-datalake-kafka-connector”从 Kafka 连接到 Azure ADLS Gen2 我有一个运行 Docker 的 Linux 机器,其中包含 debezium/zookeeper、debezium/kafka 和 debe...
将 CachedOutputStream 转换为字符串。 将camel从2.12升级到2.23后,我的路线出现问题,相同的代码相同的路线。 调用端点后的响应是 org.apache.camel 类型。
Camel/Quarkus - AdviceWith 无法通过 id 找到路线
我有以下路线: 来自(“直接:某些路线”) .id("一些路线") 。日志(...) .to("sql-stored:someProcedure(BIGINT ${exchangeProperty.someVal})") .id("someCall&...
我正在尝试构建一个 Java 应用程序,该应用程序从外部源(最好是数据库)加载 YAML DSL Camel 路由。这个想法是提供在外部编辑这些路线的可能性,刷新
使用 Apache Camel Servlet 组件获取状态为 404 的白标签页面
我正在使用 Camel 向其他系统提供 Web 服务。我编写了一个简单的 Camel 消耗路由来接受 http 请求。我可以使用 Springboot 成功启动 Camel 应用程序。但是...
Quartz 组件未在 Spring Boot 应用程序上调用驼峰处理器
我创建了具有以下依赖项的简单 JBossFUSE spring boot 应用程序 我创建了具有以下依赖项的简单 JBossFUSE spring boot 应用程序 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>sample.fuse</groupId> <artifactId>sample-FUSE</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>springboot-camel-restdsl-api</name> <description>Camel SpringBoot REST API Example with REST DSL</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <start-class>sample.fuse.UrarepSpringBootApplication</start-class> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-websocket</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-spring-boot-starter</artifactId> <version>2.19.0</version> </dependency> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-servlet-starter</artifactId> <version>2.19.0</version> </dependency> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-jackson</artifactId> <version>2.19.0</version> </dependency> <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>7.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> <dependency> <groupId>com.ibm.mq</groupId> <artifactId>mq-jms-spring-boot-starter</artifactId> <version>2.3.2</version> </dependency> <dependency> <groupId>com.ibm.mq</groupId> <artifactId>com.ibm.mq.allclient</artifactId> <version>9.2.0.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-artemis</artifactId> </dependency> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-quartz</artifactId> <version>2.13.0</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> 然后我使用以下内容创建了简单的 RouteBuilder package sample.fuse.routebuilder; import com.fasterxml.jackson.core.JsonProcessingException; import org.apache.camel.Exchange; import org.apache.camel.LoggingLevel; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.model.rest.RestBindingMode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import sample.fuse.process.*; import javax.ws.rs.core.MediaType; @Component public class MyRouteBuilder extends RouteBuilder { static Logger LOG = LoggerFactory.getLogger(MyRouteBuilder.class); @Autowired TestProcessor testProcessor; @Override public void configure() throws Exception { from("quartz://seasonParkingProcessorCron?cron=10+*+*+*+*+?&trigger.timeZone=America/Chicago&job.name=seasonParkingProcessorCron") .log(LoggingLevel.INFO, "seasonParkingProcessorCron job kicked off") .process(testProcessor); } } 示例处理器有以下内容。 package sample.fuse.process; import org.apache.camel.Exchange; import org.apache.camel.Processor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import sample.fuse.repository.MevEhtVideoImagesRepository; import java.util.Calendar; @Service @Component public class TestProcessor implements Processor { static Logger LOG = LoggerFactory.getLogger(TestProcessor.class); @Autowired Environment environment; @Autowired private MevEhtVideoImagesRepository mevEhtVideoImagesRepository; public TestProcessor(){ } @Override public void process(Exchange exchange) throws Exception { String body= (String) exchange.getIn().getBody(); LOG.info("TestProcessor Called with exchange: " + body); System.out.println("AAAAAAAAAAAAAa"); exchange.getOut().setBody(body+" "+ Calendar.getInstance().getTime()); } } 我希望每 10 秒调用一次 Processor 方法并打印日志。然而,它在日志上给出以下错误。 11:58:10,013警告[org.apache.camel.component.quartz.QuartzEndpoint](DefaultQuartzScheduler-camel-1_Worker-1)无法使用上下文执行Quartz作业:JobExecutionContext:触发器:'Camel.seasonParkingProcessorCron作业:DEFAULT.seasonParkingProcessorCron fireTime : 'Thu Dec 21 11:58:10 SGT 2023 ScheduleFireTime: Thu Dec 21 11:58:10 SGT 2023 previousFireTime: 'null nextFireTime: Thu Dec 21 11:59:10 SGT 2023 isRecovering: false refireCount: 0 因为处理器不是开始:RoundRobinLoadBalancer 还有其他人遇到过这种错误吗? 您必须为骆驼石英使用相同版本的骆驼核心版本。但是在你的pom文件中camel-core和camel-quartz版本应该匹配。 pom 文件中的camel-quartz 依赖项应更新如下 <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-quartz</artifactId> <version>2.19.0</version> </dependency> 然后你的MyRouteBuilder类配置方法内容需要更改如下。 from("quartz://seasonParkingProcessorCron?cron=10+*+*+*+*+?") .log(LoggingLevel.INFO, "seasonParkingProcessorCron job kicked off") .process(testProcessor); 希望这将有助于解决您的问题。