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

Java 将非线程安全类(FileBody)发送到多线程容器,java,tomcat,servlets,apache-httpclient-4.x,Java,Tomcat,Servlets,Apache Httpclient 4.x,Apache的org.Apache.http.entity.mime.content.FileBody是@NotThreadSafe。我可以通过网络安全地传递具有此类文件体的多个post请求吗。示例是通过org.apache.http.impl.client.DefaultHttpClient,其中接收servlet是javax.servlet.http.HttpServlet?我想知道在通过org.apache.commons.fileupload.servlet.ServletFileUpl

Apache的
org.Apache.http.entity.mime.content.FileBody
是@NotThreadSafe。我可以通过网络安全地传递具有此类文件体的多个post请求吗。示例是通过
org.apache.http.impl.client.DefaultHttpClient
,其中接收servlet是
javax.servlet.http.HttpServlet
?我想知道在通过
org.apache.commons.fileupload.servlet.ServletFileUpload
处理文件体的过程中,接收servlet是否会混淆请求内容

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);

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

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

另外,文件体的哪一部分可以是@NotThreadSafe?我没有看到任何相关的静态方法

我不确定您使用的是哪个版本的HttpClient。库的版本4.3.5没有用
@NotThreadSafe
注释的
文件体
类型。在任何情况下,线程安全性与
静态方法之间都没有关系。类型可能是线程不安全的,并且没有任何
静态方法



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

我认为您应该阅读@SotiriosDelimanolis,为什么这样认为?无论如何,有些容器在不同的线程上处理每个请求,所以…因为您似乎不理解什么是线程安全。您还应该了解什么是HTTP以及网络的传输层是如何工作的。@SotiriosDelimanolis我对线程安全的了解是,它在多线程环境中理想地安全运行。我会错过定义吗?如果我所问的服务器是多线程的,那么使用NotThreadSafe组件处理HttpRequest是否会错误地运行?我仍然很好奇。我在想如果请求被序列化了该怎么办。无论如何,apache httpclient不会序列化其HTTP请求,不是吗?@bimboxX序列化其HTTP请求是什么意思?我添加了一个编辑来解释
FileBody
用于什么以及如何使用。我的意思是,当客户机对象实现Serializable或其他东西时,其状态可以传递到另一端。因此,我再次通过
org.apache.commons.fileupload.servlet.ServletFileUpload
@bimboxX确认了在服务器处理过程中文件体的字节是否不会受到影响,即使它是可序列化的,但它不是,线程安全也适用于单个进程。您的客户端位于进程中运行的一台物理计算机上。您的服务器位于另一个进程中运行的一台物理计算机上。