■ 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>