【无标题】

2021SC@SDUSC

SolrIndexWriter::write->push->HttpSolrClient::request->executeMethod

protected NamedList executeMethod(HttpRequestBase method, final ResponseParser processor) throws SolrServerException {
method.addHeader(“User-Agent”, AGENT);

HttpEntity entity = null;
InputStream respBody = null;
boolean shouldClose = true;

final HttpResponse response = httpClient.execute(method);
int httpStatus = response.getStatusLine().getStatusCode();

entity = response.getEntity();
respBody = entity.getContent();
Header ctHeader = response.getLastHeader("content-type");
String contentType = ctHeader.getValue();

NamedList<Object> rsp = null;
String charset = EntityUtils.getContentCharSet(response.getEntity());
rsp = processor.processResponse(respBody, charset);
return rsp;

}

httpClient默认为SystemDefaultHttpClient,调用其execute函数向服务器执行请求并返回结果,httpStatus获得请求返回状态码,例如200、404,获得返回的头部ctHeader,和文档类型contentType,EntityUtils的getContentCharSet函数获取返回的编码类型,executeMethod函数最后调用BinaryResponseParser的processResponse处理返回结果。
processResponse函数最后调用JavaBinCodec的unmarshal函数进行处理。

SolrIndexWriter::write->push->HttpSolrClient::request->executeMethod->JavaBinCodec::unmarshal

public Object unmarshal(InputStream is) throws IOException {
FastInputStream dis = FastInputStream.wrap(is);
return readVal(dis);
}

public Object readVal(DataInputInputStream dis) throws IOException {
tagByte = dis.readByte();

switch (tagByte >>> 5) {
  case STR >>> 5:
    return readStr(dis);
  case SINT >>> 5:
    return readSmallInt(dis);
  case SLONG >>> 5:
    return readSmallLong(dis);
  case ARR >>> 5:
    return readArray(dis);
  case ORDERED_MAP >>> 5:
    return readOrderedMap(dis);
  case NAMED_LST >>> 5:
    return readNamedList(dis);
  case EXTERN_STRING >>> 5:
    return readExternString(dis);
}

switch (tagByte) {
  case NULL:
    return null;
  case DATE:
    return new Date(dis.readLong());
  case INT:
    return dis.readInt();
  case BOOL_TRUE:
    return Boolean.TRUE;
  case BOOL_FALSE:
    return Boolean.FALSE;
  case FLOAT:
    return dis.readFloat();
  case DOUBLE:
    return dis.readDouble();
  case LONG:
    return dis.readLong();
  case BYTE:
    return dis.readByte();
  case SHORT:
    return dis.readShort();
  case MAP:
    return readMap(dis);
  case SOLRDOC:
    return readSolrDocument(dis);
  case SOLRDOCLST:
    return readSolrDocumentList(dis);
  case BYTEARR:
    return readByteArray(dis);
  case ITERATOR:
    return readIterator(dis);
  case END:
    return END_OBJ;
  case SOLRINPUTDOC:
    return readSolrInputDocument(dis);
  case ENUM_FIELD_VALUE:
    return readEnumFieldValue(dis);
  case MAP_ENTRY:
    return readMapEntry(dis);
}

}

public SimpleOrderedMap readOrderedMap(DataInputInputStream dis) throws IOException {
int sz = readSize(dis);
SimpleOrderedMap nl = new SimpleOrderedMap<>();
for (int i = 0; i < sz; i++) {
String name = (String) readVal(dis);
Object val = readVal(dis);
nl.add(name, val);
}
return nl;
}

假设结果类型为ORDERED_MAP,则通过readOrderedMap函数处理http返回结果,该函数最终将结果封装成map。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值