使用Apache Camel获取网页HTML并保存本地失败,求排查问题
问题分析与解决方案
嘿,我一眼就瞅出核心问题啦!你这是把Apache Camel组件的用途搞反了~jetty:是用来监听HTTP请求当服务端的,不是用来主动发起请求抓网页的!这就是为什么你的process逻辑没触发、文件也没生成的原因。下面给你一步步拆解问题和修正方案:
核心错误:Jetty组件的用途搞反了
Camel的jetty:组件是消费者组件,它会启动一个HTTP服务器监听指定端口/地址,等待外部请求进来。而你要的是主动发起HTTP请求抓取网页,这得用专门的HTTP客户端组件,比如camel-http4(推荐,基于Apache HttpClient 4.x)或者camel-http。
其他需要修正的细节
除了组件用错,还有几个小坑需要注意:
- IPv6地址格式:URL里的IPv6地址需要用方括号包裹,比如
https4://[2001:4998:124:1507::f001],不过更稳妥的是直接用域名https://www.yahoo.com,避免IP变动的问题。 - 路由触发源:HTTP客户端组件是生产者,需要一个触发点来发起请求,你可以用
timer:组件触发一次路由(比如timer:start?repeatCount=1)。 - 目标目录存在性:Camel默认不会自动创建文件目录,所以要给
file:组件加mkdir=true参数,确保目录不存在时自动生成。 - 等待时间不足:5秒的休眠可能不足以完成HTTP请求和文件写入,尤其是网络慢的时候,可以适当延长,或者用更优雅的方式等待路由完成。
修正后的完整代码
import org.apache.camel.CamelContext; import org.apache.camel.Exchange; import org.apache.camel.Processor; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.impl.DefaultCamelContext; public class WebPageFetcher { public static void main(String[] args) throws Exception { CamelContext context = new DefaultCamelContext(); context.addRoutes(new RouteBuilder() { @Override public void configure() { // 用timer触发一次路由,发起HTTP请求 from("timer:start?repeatCount=1") // 使用http4组件主动请求网页(支持HTTPS) .to("https4://www.yahoo.com") .process(new Processor() { @Override public void process(Exchange exchange) throws Exception { String htmlContent = exchange.getIn().getBody(String.class); System.out.println("成功获取网页,内容长度:" + htmlContent.length()); } }) // 写入本地文件,mkdir=true确保目录存在 .to("file:C:\\temp\\folder2?fileName=web.txt&mkdir=true"); } }); context.start(); // 延长等待时间,确保请求和写入完成 Thread.sleep(10000); context.stop(); System.out.println("Done"); } }
更优雅的等待方式(替代固定休眠)
如果你不想用固定的Thread.sleep,可以添加关闭钩子,让程序等待路由完成后再退出:
// 替换Thread.sleep部分的代码 Runtime.getRuntime().addShutdownHook(new Thread(() -> { try { context.stop(); } catch (Exception e) { e.printStackTrace(); } })); context.start(); context.join(); // 等待Camel上下文完成所有任务
依赖说明(Maven为例)
确保你的项目里添加了Camel核心和http4组件的依赖:
<dependencies> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-core</artifactId> <version>3.20.2</version> <!-- 替换成你使用的Camel版本 --> </dependency> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-http4</artifactId> <version>3.20.2</version> </dependency> </dependencies>
内容的提问来源于stack exchange,提问作者toronaga07
相关产品推荐
相关产品推荐

