前のトピック: トランザクション フレームへのタグの追加次のトピック: Java VSE の拡張


ブローカの拡張

ブローカ拡張は、トランザクション フラグメントがエージェントから受信された後、ブローカによってロードおよび呼び出されます。

ブローカ拡張によって、以下のタスクを実行できます。

ブローカを拡張するには、com.itko.lisa.remote.plumbing.IAssemblyExtension インターフェースを実装します。 このインターフェースは、onTransactionReceived() メソッドを定義します。 詳細については、インストール ディレクトリの doc フォルダで、JavaDocs を参照してください。

public interface IAssemblyExtension {
     /**
      * アセンブリの前に呼び出されるメソッド
      * @param frame: エージェントから受信される部分的なトランザクション ルート
      * @return: 標準のアセンブリをバイパスする(拡張によってアセンブリを処理する)場合は true
      */
     public boolean onTransactionReceived(TransactionFrame frame);
 }

ブローカ拡張を展開するには、拡張をコンパイルして、以下のエントリを含むマニフェストと共に JAR ファイルにパッケージ化します。

Broker-Extension: extension class name 

ブローカ(レジストリ)ディレクトリにこの JAR を配置すると、ブローカは自動的にそれを取得します。 ブローカ(レジストリ)が起動した後にファイルを追加した場合、ホット ロード メカニズムによってファイルが確実に適用されます。 ブローカ(レジストリ)の実行中に拡張 JAR を更新した場合、JAR クラスが動的に再ロードされます。 動的な再ロードにより、ブローカ(レジストリ)を再起動せずに、拡張コードをすばやく簡単にテストできます。

 

典型的な使用例は、TCP/IP およびポートを使用する通常のステッチング アルゴリズムが、エージェント間に配置された仮想 IP が割り当てられているロード バランサによって混乱する場合、またはエージェントがネイティブ ライブラリを使用して IO を実行し、使用中の IP およびポートに直接アクセスできない場合です。 その場合、フレームのアドレスおよびポートのフィールドが空白のままか、正しくありません。このため、拡張でフレームをアセンブルする必要があります。

import com.itko.lisa.remote.plumbing.IAssemblyExtension;
import com.itko.lisa.remote.transactions.TransactionFrame;
import com.itko.lisa.remote.utils.Log;
import com.itko.lisa.remote.utils.UUID;
 
public class LoadBalancerExtension implements IAssemblyExtension {
 
    private TransactionFrame m_lastAgent1Frame;
    private TransactionFrame m_lastAgent2Frame;
 
    public boolean onTransactionReceived(TransactionFrame frame) {
 
    if (frame.getClassName().equals("Class1") && frame.getMethod().equals("method1")) {
        m_lastAgent2Frame = frame;
        if (m_lastAgent1Frame.getFrameId() == m_lastAgent2Frame.getParentId()) {
            stitch(m_lastAgent1Frame, m_lastAgent2Frame);
        }
    }
 
    if (frame.getClassName().equals("Class2") && frame.getMethod().equals("method2")) {
        m_lastAgent1Frame = frame;
        if (m_lastAgent1Frame.getFrameId() == m_lastAgent2Frame.getParentId()) {
            stitch(m_lastAgent1Frame, m_lastAgent2Frame);
        }
    }
 
        return false;
    }
 
    private void stitch(TransactionFrame parent, TransactionFrame child) {
    String newFrameId = UUID.newUUID();
    parent.setFrameId(newFrameId);
    child.setParent(parent);
    parent.getChildren().add(child);
}
}