3

HomeService.java があり、/testURLに移動するHomeService::testと 1 回印刷されますが、/playURL に移動すると 2 回印刷HomeService::playされます。/playメソッドを 1 回だけ呼び出すにはどうすればよいですか?

私が行くURLは

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
4

1 に答える 1

4

クライアントが2回リクエストしたためです。メディア(オーディオ/ビデオ)リクエストでこの動作が予想される場合があります。ほとんどのメディアプレーヤーは、サーバーが範囲要求をサポートしているかどうかをテストするため、複数のHTTP接続を介してサーバーをより効率的にバッファリングできます。リクエストヘッダーをよく見るRangeと、If-Rangeヘッダーが表示される場合があります。サーバーがそれをサポートしている場合、クライアントは、指定された範囲で開始および終了するメディアファイルのより小さなチャンクを要求する複数の範囲要求を送信します。また、クライアントが特定の瞬間(たとえば、1分後)に早送りした場合、メディアプレーヤーは要求を中止し、正確にその位置から始まる範囲を要求する新しい要求を送信できます。

クライアントがそれを複数回要求するのを止めることはできません。サービスが範囲要求をサポートしていない場合は、おそらく1つにする方がよいでしょう。サーブレットコンテナの組み込みのデフォルトサーブレットがそれをサポートします。したがって、メディアファイルをパブリックWebコンテンツに配置し、クライアントにWebサービス経由ではなく直接要求させると、それが心配になります。

この問題はジャージーとはまったく関係がないことに注意してください。ただし、メディアストリーミングの特定の仕事には間違ったツールであるという印象があります。

于 2013-02-15T18:57:32.917 に答える