簡體   English   中英

為什么我的球衣方法會被叫兩次?

[英]Why does my method in jersey get called twice?

我有HomeService.java,當我去/test url時它打印HomeService::test一次,但是當我去/play url時它會打印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

這是因為客戶要求了兩次。 您可能期望在媒體(音頻/視頻)請求上出現此行為。 大多數媒體播放器會測試服務器是否支持范圍請求,以便通過多個HTTP連接更有效地緩沖它。 如果仔細查看請求標頭,可能會看到RangeIf-Range標頭。 如果您的服務器支持它,則客戶端將發送多個范圍請求,請求在指定范圍內開始和結束的較小媒體文件塊。 此外,如果客戶端快進到特定時刻(例如1分鍾后),則媒體播放器可以中止該請求並發送新請求,請求從該位置開始的范圍。

您無法阻止客戶多次請求它。 如果您的服務不支持范圍請求,您可能最好將其設置為一個。 servletcontainer的內置默認servlet支持它。 因此,如果您將媒體文件放在公共Web內容中並讓客戶端直接請求它而不是通過Web服務,那么它會擔心這一點。

請注意,這個問題與Jersey完全無關,盡管我有點認為這是媒體流特定工作的錯誤工具。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM