solr学习(七)org.apache.http.ParseException: Invalid content type:

最近部署后,导入数据到索引库突然出现了这样一个异常,但是在我本地却没有任何问题,别人的环境我也不能用,只能先用本机测试下:


类型异常,但是显然这个类型异常并不是所谓的插入数据和solr中定义的field的类型不一致。

网上资料很少,只能根据日志翻翻源码看下:

看日志是在这一行出错的:


这是HttpSolrServer添加SolrInputDocument。再往里看看:


调用add方法,再调用process方法。

再进去看看这个方法:


在进去看看:


看看这个方法:



这个方法很长,也不知道是干嘛的,但是根据方法名称createMethod,应该是生成method,而solr底层使用的是httpclient,而在httpclient中method是发送请求的报文封装。这个方法就直接跳过了。

看看executeMethod这个方法:


这里httpclient执行了method,获取到了response,再往下看:

日志显示是496行报错,这个方法会传入一个contentType:


进去看看这个方法:

咦,看到熟悉的味道了,如果elements.length小于等于0,就会抛出这个异常,而且在异常后面会输出这个s参数,而这个s参数就是上面传入的contentType:


思路重新理一理,这个contentType是哪里来得呢?再重新调试看看:


原来这个contentType是httpclient执行了method之后获取的response中获取的content-type,但是为什么在别人的环境中response返回出来的content-type是空的呢,这个不可能啊。

没有什么好办法,突然想到,可以先看下httpclient是不是执行成功了,没办法,只能先在本机上看看:

我先把索引库数据全部清空:


一路debug直到httpclient执行method之前:


这时候服务器没有任何solr有关的update日志,索引库现在也还没数据:



httpclient执行method:

过了几秒钟之后出现了update的日志:


索引库也有数据了:


这个说明了一个什么问题呢,在httpclient执行method之后,会有数据导入到索引库,而现在的那个异常的出现时在httpclient执行method方法之后由于要用response搞些事情的时候出错了,也就是说至少httpclient执行method是没有问题的(无论响应回来什么),为什么这么说呢,看代码:


httpclient执行method在try-catch里面,再看看catch:


catch只会catch着三种异常,而这三种异常都不是我们出现的那个异常,也就是说代码直到response搞事情的时候都是正常走的。

这时候我就去找别的公司的开发确认了,执行报错之后索引库是没有数据的。那就是他的solr部署的有问题了,后来看了下,还真是。


猜你喜欢

转载自blog.csdn.net/dongguabai/article/details/80522454