2013-02-15 251 views
3

我有HomeService.java,当我去/test的网址,它打印HomeService::test一次,但当我去/play网址它打印HomeService::play两次。我怎样才能让我的/play方法只被调用一次?为什么我的球衣方法会被调用两次?

我去的网址是

http://127.0.0.1:8080/Home/rest/main/test 
http://127.0.0.1:8080/Home/rest/main/play 

HomeService.java:

@Path("/main") 
public class HomeService 
{ 

    @GET 
    @Path("/test") 
    @Produces("text/plain") 
    public String test() 
    { 
    System.out.println("HomeService::test"); 
    return "Running..."; 
    } 

    @GET 
    @Path("/play") 
    @Produces("video/mpeg") 
    public StreamingOutput play() 
    { 
    System.out.println("HomeService::play"); 
    return new StreamingOutput() 
    { 

    @Override 
    public void write(java.io.OutputStream outputStream) {} 
    } 
} 

的web.xml

<?xml version="1.0" encoding="UTF-8"?><web-app id="WebApp_ID" version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 
    <display-name>Home</display-name> 

    <servlet> 
     <servlet-name>jersey-servlet</servlet-name> 
     <servlet-class> 
         com.sun.jersey.spi.container.servlet.ServletContainer 
     </servlet-class> 
     <init-param> 
      <param-name>com.sun.jersey.config.property.packages</param-name> 
      <param-value>com.home</param-value> 
     </init-param> 
     <init-param> 
      <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> 
      <param-value>true</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>jersey-servlet</servlet-name> 
     <url-pattern>/rest/*</url-pattern> 
    </servlet-mapping> 

</web-app> 

如果有更多的信息需要让我知道。

编辑:所以,我跑了tcpdump的,这是输出:

# ./tcpdump -s 128 -A -v -i any port 8080|grep 'play' 
tcpdump: listening on any, link-type LINUX_SLL (Linux cooked), capture size 128 bytes 
...u...uGET /Home/rest/main/play HTTP/1.1 
.. ... .GET /Home/rest/main/play HTTP/1.1 

,然后再

........GET /Home/rest/main/play HTTP/1.1 
........GET /Home/rest/main/play HTTP/1.1 
+1

你对客户使用什么?你是否100%确定客户只发送一个请求?你有一个简单的方法来监视HTTP请求来验证这一点(HTTP日志,或Wirshark/HTTP嗅探器)。我只问这个,因为没有别的东西会跳出来作为一个可能的原因。 – EJK 2013-02-15 17:22:14

+0

@EJK我已经用tcpdump输出更新了我的问题,wget也只能击中它一次 – Grammin 2013-02-15 17:36:34

回答

4

这是因为客户端请求两次。您可能会期望在媒体(音频/视频)请求上出现这种情况。大多数媒体播放器会测试服务器是否支持范围请求,以便通过多个HTTP连接更有效地进行缓冲。如果您仔细查看请求标题,可能会看到RangeIf-Range标题。如果您的服务器支持它,则客户端将发送多个范围请求,请求在指定范围内开始和结束的媒体文件的较小块。另外,如果客户端快进到特定时刻(例如1分钟后),则媒体播放器可以放弃请求并发送新请求,请求从该位置开始的范围。

您无法阻止客户端多次请求它。如果你的服务不支持范围请求,你最好把它做成一个。 servletcontainer的内置默认servlet支持它。因此,如果您将媒体文件放在公共Web内容中,并让客户端直接请求而不是通过Web服务,那么它会担心这一点。

请注意,这个问题与泽西岛完全无关,尽管我有些印象是它是媒体流特定工作的错误工具。

相关问题