Menu Close

21.4. ランタイム制御

概要

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

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

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

キー説明

WSRM_VERSION_PROPERTY

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

WSRM_WSA_VERSION_PROPERTY

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

WSRM_LAST_MESSAGE_PROPERTY

最後のメッセージが送信されていることを WS-RM コードに通知するブール値 true より、コードは WS-RM シーケンスを終了し、リソースを解放することができます (CXF バージョン 3.0.0 の場合、クライアントを終了すると、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
...