将非线程安全类(FileBody)发送到多线程容器

时间:2014-08-14 04:27:43

标签: java tomcat servlets apache-httpclient-4.x

Apache的org.apache.http.entity.mime.content.FileBody是@NotThreadSafe。我可以安全地通过网络传递具有此类FileBody的多个帖子请求。样本将通过org.apache.http.impl.client.DefaultHttpClient,其中接收servlet是javax.servlet.http.HttpServlet?我想知道接收的servlet是否可能在org.apache.commons.fileupload.servlet.ServletFileUpload的FileBody处理期间混淆了请求内容。

import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.impl.client.DefaultHttpClient;
...//execute this multiple times in different jvm's 
MultipartEntity entity = new MultipartEntity();
... //add other entity parts here
FileBody body = new FileBody(new File(file));
entity.add("file", body);
HttpPost post = new HttpPost();
... //add other post elements here
post.setEntity(entity);
new DefaultHttpClient().execute(post);

另外,FileBody的哪个部分可以是@NotThreadSafe?我没有看到任何相关的静态方法。

1 个答案:

答案 0 :(得分:1)

多线程的概念适用于单个进程。以您的客户端应用程序为例。您在一个线程中创建一个FileBody对象。作为@NotThreadSafe类,如果它被传递并被其他线程使用,则无法预测其行为。 您的服务器不参与其中。

  

另外,FileBody的哪个部分可以是@NotThreadSafe?我没有看到任何相关的静态方法。

我不确定您使用的是哪个版本的HttpClient。该库的4.3.5版没有使用FileBody注释的@NotThreadSafe类型。无论如何,线程安全和static方法之间没有关系。类型可能是线程不安全的,没有任何static方法。


FileBody是HTTP请求正文的容器/描述符。当HttpClient准备好发送请求时,它将从InputStream获取FileBody并将其字节写入作为HTTP请求正文的底层TCP套接字/连接。这些只是字节。 HTTP服务器将接收字节。