Apache Tika检测URL的MIME类型时无限挂起问题咨询
Apache Tika检测URL MIME类型的阻塞问题及解决
问题背景
尝试使用Apache Tika的detect方法检测https://www.futureelectronics.com/fr/search/?text=something的MIME类型时,程序始终无响应,代码如下:
package mypacakge; import java.io.IOException; import java.net.URL; import org.apache.tika.Tika; public class ExampleApp { public static void main(String[] args) throws IOException { URL url = new URL("https://www.futureelectronics.com/fr/search/?text=something"); Tika tika = new Tika(); String mimeType = tika.detect(url); System.out.println(mimeType); } }
排查发现,detect方法依赖java.net.URLConnection的getContentType方法,正是该方法导致了阻塞。使用的Tika版本依赖:
<dependency> <groupId>org.apache.tika</groupId> <artifactId>tika-core</artifactId> <version>2.6.0</version> </dependency>
问题解答
1. 为何该特定URL会导致Tika的detect方法挂起?
- 网站反爬拦截:目标网站可能针对非浏览器发起的请求采取限流、延迟响应或故意挂起连接的策略,而
URLConnection默认无超时配置,会一直等待服务器返回响应。 - 连接/握手阻塞:HTTPS握手过程中可能出现网络异常,或服务器未完成TCP连接的握手、数据传输流程,导致客户端持续等待。
- 响应头读取阻塞:
getContentType方法需要读取服务器响应头,若服务器迟迟不返回响应头,该方法会一直阻塞。
2. 如何在Tika库层面控制URLConnection的超时配置?
Tika的detect(URL)高层API未直接暴露超时配置,需手动控制URLConnection的超时参数,再将输入流传递给Tika的detect(InputStream)方法实现,示例代码如下:
package mypacakge; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import org.apache.tika.Tika; public class ExampleApp { public static void main(String[] args) throws IOException { // 设置超时时间(单位:毫秒) int connectTimeout = 5000; int readTimeout = 5000; URL url = new URL("https://www.futureelectronics.com/fr/search/?text=something"); URLConnection connection = url.openConnection(); // 配置连接超时和读取超时 connection.setConnectTimeout(connectTimeout); connection.setReadTimeout(readTimeout); try (InputStream inputStream = connection.getInputStream()) { Tika tika = new Tika(); String mimeType = tika.detect(inputStream); System.out.println(mimeType); } } }
若需在多个场景复用超时配置,可封装自定义连接工具类,统一创建带超时的URLConnection后再传递给Tika处理。Tika-core本身未提供直接配置超时的入口,手动控制连接是最直接的解决方案。
内容的提问来源于stack exchange,提问作者Martin Tovmassian
相关产品推荐
相关产品推荐

