如何让基于Apache Camel Jetty的最简SpringBoot服务正常运行?
如何让基于Apache Camel Jetty的最简SpringBoot服务正常运行?
嘿,我来帮你梳理下问题所在,其实你现在的代码有几个关键小错误,调整一下就能正常跑起来了:
首先,先揪出核心问题
- RouteBuilder写法错了:你直接把
from(...)写在类体里,这根本不会被执行!Camel的路由必须定义在configure()方法里,而且要重写这个方法才行。 - 依赖冗余且冲突:你同时加了
spring-boot-starter-web(默认带Tomcat)和Camel Jetty组件,这俩会抢Web容器的控制权;而且camel-servlet-starter、camel-jetty这些都是多余的,和camel-jetty-starter功能重叠。 - 启动类配置不对:你把
myRouteBuilder直接传给SpringApplication,这不是正确的启动姿势——应该启动你自己的RestServiceApplication类,它才是Spring Boot的入口。
接下来一步步修正
1. 修复你的RouteBuilder类
把路由逻辑移到configure()方法里,同时类名要符合Java规范(首字母大写):
@Component public class MyRouteBuilder extends RouteBuilder { @Override public void configure() throws Exception { // 定义Jetty端点和路由逻辑 from("jetty:http://0.0.0.0:8080/") .log("Request received.") .setBody(simple("Huhu y'all!")); } }
2. 清理POM依赖
删掉冲突和冗余的依赖,只保留最必要的:
<dependencies> <!-- Camel嵌入式Jetty的Starter,已经包含所有Jetty相关功能 --> <dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-jetty-starter</artifactId> <!-- 注意:这里要填和你Spring Boot版本匹配的Camel版本,比如Spring Boot 2.7.x对应Camel 3.20.x --> <version>3.20.2</version> </dependency> <!-- Spring Boot核心Starter,不需要带web的版本(避免引入Tomcat) --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> </dependencies>
为什么删掉
spring-boot-starter-web?因为它默认会引入Tomcat,和我们要用的Camel Jetty嵌入式容器冲突,我们完全可以靠Camel自己的Jetty来处理HTTP请求。
3. 修正Spring Boot启动类
启动入口要指向你自己的RestServiceApplication,同时设置WebApplicationType.NONE告诉Spring不要启动自带的Web容器:
@SpringBootApplication public class RestServiceApplication { private static CountDownLatch stopLatch = null; public static void main(String[] args) { // 启动自己的Spring Boot应用类,而不是RouteBuilder SpringApplication theApp = new SpringApplication(RestServiceApplication.class); // 禁用Spring自带的Web容器,因为我们用Camel的Jetty theApp.setWebApplicationType(WebApplicationType.NONE); try { ConfigurableApplicationContext appContext = theApp.run(args); appContext.registerShutdownHook(); } catch (Exception e) { e.printStackTrace(); return; } stopLatch = new CountDownLatch(1); try { stopLatch.await(); } catch (InterruptedException e) { // 处理中断信号 Thread.currentThread().interrupt(); } } }
最后测试
启动应用后,在终端执行curl http://localhost:8080/,你应该能收到返回的Huhu y'all!,同时控制台会打印Request received.的日志,完美运行~
额外注意点
- 一定要保证Camel和Spring Boot的版本兼容,比如Camel 3.x对应Spring Boot 2.x,Camel 4.x对应Spring Boot 3.x,版本不匹配容易出奇怪的问题。
- 不要同时混用Spring的Web容器和Camel的Jetty容器,二选一就行。
备注:内容来源于stack exchange,提问作者WolfiG
相关产品推荐
相关产品推荐

