【Java】【JAX-WS】 Webサービス / Metro [5] ~応用編 / あれこれ ~

JAX-WS / Metro で、Webサービス終了時のイベントを拾いたい

解決案

 * @PreDestroy を付加したメソッドを実装

サンプル

import javax.annotation.PreDestroy;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.xml.bind.annotation.XmlElement;

@WebService(name = "SampleWebService")
public class SampleWebService {

  @PreDestroy
  protected void close() {
    // ★ここに処理を書く★
  }

ポイント

 * public ではなく、 protected の方がいい
  => 自動生成でコード生成する際に、Webサービスとして認識してしまうため

補足:@PostConstructについて

 * 初期化時に実行させたいメソッドに付加するアノテーションとして、@PostConstructがあるが
   Tomcat8.5で実験してみたら2回呼ばれてしまう。

【例】
@WebService(name = "SampleWebService")
public class SampleWebService {

  @PostConstruct
  protected void init() {
    System.out.println("init...");
  }

【出力結果】
・・・略・・・
情報: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
7 20, 2016 10:51:28 午後 com.sun.xml.ws.server.MonitorBase createRoot
情報: Metro monitoring rootname successfully set to: com.sun.metro:pp=/,type=WSEndpoint,name=/SampleService-SampleWebServiceService-SampleWebServicePort
init...
init...
7 20, 2016 10:51:28 午後 com.sun.xml.ws.transport.http.servlet.WSServletDelegate <init>
情報: WSSERVLET14: JAX-WSサーブレットを初期化しています
・・・略・・・

WSDLファイルのURLを変更するには...

例えば、以下のように、WSDLファイルのURLを変更する方法を考える

■修正前
http://localhost:8080/SampleWebService/service/SampleWebService.ws?wsdl

■修正後
http://localhost:8080/SampleWebService/sample/web/services/SampleWebService.ws?wsdl

解決策

 * sun-jaxws.xml の url-pattern を修正する

サンプル・抜粋

http://blogs.yahoo.co.jp/dk521123/36139336.html
をベースに...
<?xml version="1.0" encoding="UTF-8"?>
<endpoints version="2.0"
  xmlns="">http://java.sun.com/xml/ns/jax-ws/ri/runtime">
  <endpoint implementation="com.sample.webservice.SampleWebService"
    name="SampleWebService" url-pattern="/sample/web/services/SampleWebService.ws" /> <!-- ★はじめに「/」が必要★ -->
</endpoints>


タイムアウトの設定を行うには...

 * 以下の関連記事を参照のこと
http://blogs.yahoo.co.jp/dk521123/36559479.html

関連記事

Webサービス / Metro [1] ~入門編 / サーバサイドの構築 ~

http://blogs.yahoo.co.jp/dk521123/36139336.html

Webサービス / Metro [2] ~入門編 / クライアントサイドの構築 ~

http://blogs.yahoo.co.jp/dk521123/36140561.html

Webサービス / Metro [9] ~ タイムアウトを設定する / クライアントサイド ~

http://blogs.yahoo.co.jp/dk521123/36559479.html