21.4. ランタイム制御

概要

org.apache.cxf.ws.rm.RMManager クラスのパブリック定数で定義されたキー値を使用して、クライアントコードで複数のメッセージコンテキストプロパティー値を設定して WS-RM を制御できます。

ランタイム制御オプション

以下の表は、org.apache.cxf.ws.rm.RMManager クラスによって定義されるキーの一覧です。

キー説明

WSRM_VERSION_PROPERTY

文字列の WS-RM バージョン名前空間 (http://schemas.xmlsoap.org/ws/2005/02/rm/ または http://docs.oasis-open.org/ws-rx/wsrm/200702)。

WSRM_WSA_VERSION_PROPERTY

String WS-Addressing バージョンネームスペース (http://schemas.xmlsoap.org/ws/2004/08/addressing または http://www.w3.org/2005/08/addressing) - このプロパティーは、http://schemas.xmlsoap.org/ws/2005/02/rm/ RM ネームスペースを使用していない限りは無視されます)。

WSRM_LAST_MESSAGE_PROPERTY

ブール値 true で、最後のメッセージが送信されたことを WS-RM コードに指示し、コードが WS-RM シーケンスおよびリリースリソースを表示できるようにします (C 3.0.0 バージョンの CXF より、クライアントを閉じると WS-RM はデフォルトで RM シーケンスを閉じます)。

WSRM_INACTIVITY_TIMEOUT_PROPERTY

ミリ秒単位の長い非アクティブタイムアウト。

WSRM_RETRANSMISSION_INTERVAL_PROPERTY

ミリ秒単位の長いベース再送信間隔。

WSRM_EXPONENTIAL_BACKOFF_PROPERTY

ブール値バックオフフラグ。

WSRM_ACKNOWLEDGEMENT_INTERVAL_PROPERTY

ミリ秒単位の長い確認応答間隔。

JMX を介した WS-RM の制御

Apache CXF の JMX 管理機能を使用して、WS-RM の多くの側面を監視および制御することもできます。JMX 操作の完全な一覧は org.apache.cxf.ws.rm.ManagedRMManager および org.apache.cxf.ws.rm.ManagedRMEndpoint で定義されますが、これらの操作には現在の RM 状態を表示することが含まれます。JXM を使用して、WS-RM シーケンスを閉じたり終了したり、以前に送信されたメッセージがリモート RM エンドポイントによって確認されたときに通知を受信したりすることもできます。

JMX 制御の例

たとえば、クライアント設定で JMX サーバーを有効にしている場合は、次のコードを使用して、最後に受信した確認応答番号を追跡できます。

// Java
private static class AcknowledgementListener implements NotificationListener {
    private volatile long lastAcknowledgement;

    @Override
    public void handleNotification(Notification notification, Object handback) {
        if (notification instanceof AcknowledgementNotification) {
            AcknowledgementNotification ack = (AcknowledgementNotification)notification;
            lastAcknowledgement = ack.getMessageNumber();
        }
    }

    // initialize client
...
    // attach to JMX bean for notifications
    //  NOTE: you must have sent at least one message to initialize RM before executing this code
    Endpoint ep = ClientProxy.getClient(client).getEndpoint();
    InstrumentationManager im = bus.getExtension(InstrumentationManager.class);
    MBeanServer mbs = im.getMBeanServer();
    RMManager clientManager = bus.getExtension(RMManager.class);
    ObjectName name = RMUtils.getManagedObjectName(clientManager, ep);
    System.out.println("Looking for endpoint name " + name);
    AcknowledgementListener listener = new AcknowledgementListener();
    mbs.addNotificationListener(name, listener, null, null);

    // send messages using RM with acknowledgement status reported to listener
...