Tag: http

如何确保我的HttpClient 4.1不会泄漏套接字?

我的服务器使用来自内部Web服务的数据来构建其响应,基于每个请求。 我正在使用Apache HttpClient 4.1来发出请求。 每个初始请求将导致对Web服务的大约30个请求。 其中,4 – 8最终将插入CLOSE_WAIT中的套接字,而这些套接字永远不会被释放。 最终这些卡住的套接字超过了我的ulimit,我的进程耗尽了文件描述符。 我不想只提高我的ulimit(1024),因为这只会掩盖问题。 我转移到HttpClient的原因是java.net.HttpUrlConnection的行为方式相同。 我已尝试按请求移动到SingleClientConnManager,并在其上调用client.getConnectionManager()。shutdown(),但套接字仍然卡住了。 我是否应该尝试解决这个问题,以便在没有正在运行的请求时最终得到0个开放套接字,或者我应该专注于请求持久性和池化? 为清楚起见,我提供了一些可能相关的细节: 操作系统:Ubuntu 10.10 JRE:1.6.0_22 语言:Scala 2.8 示例代码: val cleaner = Executors.newScheduledThreadPool(1) private val client = { val ssl_ctx = SSLContext.getInstance(“TLS”) val managers = Array[TrustManager](TrustingTrustManager) ssl_ctx.init(null, managers, new java.security.SecureRandom()) val sslSf = new org.apache.http.conn.ssl.SSLSocketFactory(ssl_ctx, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER) val schemeRegistry = new SchemeRegistry() schemeRegistry.register(new Scheme(“https”, 443, […]

什么可以导致TCP / IP丢弃数据包而不丢弃连接?

我有一个基于Web的应用程序和一个客户端,都是用Java编写的。 对于它的价值,客户端和服务器都在Windows上。 客户端通过Apache HttpClient发出HTTP GET。 服务器阻塞最多一分钟,如果在该分钟内没有消息到达客户端,则服务器返回HTTP 204 No Content。 否则,只要为客户端准备好消息,就会返回HTTP 200正文的正文。 这让我感到困惑:间歇性地为特定的客户端子集 – 总是客户端具有明显不稳定的网络连接 – 客户端发出GET,服务器接收并处理GET,但客户端永远坐着。 启用客户端的调试日志,我看到HttpClient仍在等待响应的第一行。 服务器上没有抛出exception,至少没有任何记录,不是由Tomcat,而是由我的webapp。 根据调试日志,服务器成功响应客户端的每一个迹象都表明。 但是,客户没有显示收到任何东西的迹象。 客户端无限期挂起在HttpClient.executeMethod中 。 在会话超时并且客户端采取导致另一个线程发出HTTP POST的操作后,这变得很明显。 当然,POST失败,因为会话已过期。 在某些情况下,会话到期和客户端发出POST并发现此事实之间已经过了几个小时 。 在整个时间里, executeMethod仍在等待HTTP响应行。 当我使用WireShark查看线路级别的实际情况时,不会发生此故障。 也就是说,对于特定客户端,这种故障将在几个小时内发生,但是当WireShark在两端运行时,这些相同的客户端将在一夜之间运行14小时,而不会出现故障。 还有其他人遇到过这样的事吗? 世界上有什么可以导致它? 我认为即使在短期网络故障中,TCP / IP也可以保证数据包传输。 如果我设置SO_TIMEOUT并在超时后立即重试请求,则重试始终成功。 (当然,我首先中止超时请求并释放连接以确保将使用新的套接字。) 思考? 想法? 是否有一些TCP / IP设置可用于Java或Windows中的注册表设置,以便在丢失的数据包上启用更积极的TCP / IP重试?

如何将EJB 3.1公开为REST Web服务?

在Adam Bien的博客上阅读文章时,我在使用EJB 3.1时发现了java restful中的一个新function。 问题是Stateless和Singleton bean可以作为root资源公开。 但是怎么样? 我试着这样做: @Stateless @LocalBean @Path(“Hybrid”) public class RESTEJBSample { @GET @Path(“/demo”) @Produces(MediaType.TEXT_PLAIN) public String something() { return “I am a Hybrid!!!”; } } 当我调用URL http:// localhost:8080 / HybridSample / resources / Hybrid / demo时,我收到404错误。 为了确保JAXRS正在我的项目中工作,我创建了一个简单的pojo资源,以测试它是否正常工作。 @Path(“/genericresource”) public class GenericResource { @GET @Path(“/samplemethod”) @Produces(MediaType.TEXT_PLAIN) public String saySomething() { return “Something!”; […]

如何在Jersey ContainerResponseFilter中获取资源注释

Jersey提供两个类来与资源上的注释进行交互: ResourceFilterFactory ,一个类可以inheritance它,以便在应用程序启动时触发一次 ContainerRequestFilter , ContainerResponseFilter ,几个类可以inheritance它们以在每个请求/响应上触发它们 ResourceFilterFactory定义了一个create方法(实现),它采用AbstractMethod来提供对方法和类注释的访问。 ContainerRequestFilter和ContainerResponseFilter定义了一个filter方法(实现),它接受请求/响应,但那些只能访问被调用的方法注释,而不是第一类。 我正在尝试实现一个CacheControl注释,它以下列方式定义HTTP缓存头。 @Path(“/path”) @CacheControl(maxAge = 172800) public class Resource { @GET @Path(“/{id}”) @CacheControl(mustRevalidate = true) public Response get(@PathParam(“id”) Long id) { … } } 我的问题是我不想为我的应用程序中定义的每个REST方法创建一个新的CacheControlFilter 。 public class FilterFactory implements ResourceFilterFactory { @Override public List create(AbstractMethod method) { List filters = newArrayList(); if (isAnnotationPresent(method, CacheControl.class)) filters.add(new CacheControlFilter(method)); […]

从HttpUrlConnection对象获取头

我想向servlet发送请求并从响应中读取标头。 所以我尝试使用它: URL url = new URL(contextPath + “file_operations”); HttpURLConnection conn = null; try { conn = (HttpURLConnection) url.openConnection(); conn.setDoOutput(true); conn.setDoInput(true); conn.setRequestMethod(“POST”); conn.setRequestProperty(“charset”, “utf-8”); conn.setUseCaches(false); conn.setConnectTimeout(1000 * 5); conn.connect(); conn.getHeaderField(“MyHeader”) ….. 但收到的标题始终为null 。 Servlet运行正常(我尝试使用独立的HTTP客户端使用servlet)

从J2ME客户端轮询HTTP服务器

我有一个在我的手机(客户端)上运行的J2ME应用程序, 我想打开与服务器的HTTP连接,并继续轮询服务器上的更新信息。 由于GPRS计费基于发送和接收的数据包,因此每次执行的轮询都会耗尽GPRS字节并且从长远来看会变得昂贵。 是否有一种使用HTTP协议进行轮询的字节有效方法? 我也听说过长时间的民意调查,但我不确定它是如何运作的,效率如何。 实际上,优先选择的方式是服务器告诉手机应用程序新数据已准备好使用,这样就不需要进行轮询,但是我不知道这些技术,特别是在J2ME中。

发出http请求的测试方法

我的应用程序中有一些方法可以发出http请求。 有没有一种很好的方法来模拟网络故障和unit testing的错误响应?

使Java servlet充当代理的代码?

我有两个Java Web应用程序,它们有一个servlet,它被映射到一个特定的URL: red.war/ WEB-INF/classes com.me.myorg.red.RedServlet (maps to http://red.example.com/doStuff) blue.war/ WEB-INF/classes com.me.myorg.blue.BlueServlet (maps to http://blue.example.com/doStuff) 我想把这些应用程序(我称之为“后端应用程序”)放在“代理应用程序”(servlet)后面,这将决定这两个应用程序中的哪一个最终将服务于客户端请求。 此代理Web应用程序将接收传入的HTTP请求,并确定将请求转发到的2个“后端应用程序”(红色或蓝色)中的哪一个。 然后,请求将转发到http://red.example.com/doStuff (然后由RedServlet#doGet(…) )或http://blue.example.com/doStuff (然后处理)通过BlueServlet#doGet(…) )。 然后,后端应用程序返回的响应(同样, RedServlet#doGet(…)或BlueServlet#doGet(…) )将返回到代理Servlet,最终返回给客户端。 换句话说,在伪代码中: public class ProxyServlet extends HttpServlet { @Override public doGet(HttpServletRequest request, HttpServletResponse response) { String forwardingAddress; if(shouldBeRed(request)) forwardingAddress = “http://red.example.com/doStuff”; else forwardingAddress = “http://blue.example.com/doStuff”; PrintWriter writer = response.getWriter(); writer.write(getResponseFromBackend(forwardingAddress, request)); } […]

用于HTTP错误的Javaexception类是什么?

我正在使用Apache HttpClient,并希望通过Javaexception机制将HTTP错误(400 Bad Request,404 Not Found,500 Server Error等)传达给调用代码。 Java标准库或广泛使用的库中是否存在适合使用或子类用于此目的的exception? 另一种方法是检查状态返回码。 这似乎是HttpClient设计理念,但由于这些错误在我的应用程序中确实非常特殊,我希望在它们发生时为我设置堆栈跟踪和其他好的exception事项。

如何解码Java中的http POST数据?

我正在使用Netty,我必须接受并解析http POST请求。 据我所知,Netty没有内置的POST支持,只有GET。 (这是一个处理原始网络操作的相当低级的库。使用servlet容器,它可以完成所有这些开箱即用的操作。) 如果我将POST请求的内容作为字节数组,那么将它解析为参数Map的最快且最无错误的方法是什么? 我自己可以写这个,但是JDK中必须有一些方法可以使这更容易。 而且我敢打赌,还有一些问题需要处理。