You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 15:57:32