ハイブリッドのための Runtime Manager エージェントの拡張

このトピックでは、Runtime Manager エージェントを拡張する方法の概要を説明します。文字列を元に戻すメソッドを使用して、完全なサービス、外部ハンドラ、内部ハンドラの実装手順を説明します。

Runtime Manager エージェントの拡張可能なコンポーネント

Runtime Manager エージェントには、次の拡張可能なコンポーネントが含まれています。

  • サービス

  • 外部メッセージハンドラ

  • 内部メッセージハンドラ

Runtime Manager エージェントのカスタムコンポーネントの構造

Runtime Manager エージェントのカスタムコンポーネントは、次の構造に従う必要があります。

  • /lib にはコンポーネントの連動関係を含めます。

  • /classes にはコンパイルされたクラスを含めます。

カスタムコンポーネントも Java 1.7 でコンパイルする必要があります。それよりも新しいバージョンでコンパイルされたコンポーネントはエージェントによって読み込まれません。

この例では、エージェントを拡張するために必要なライブラリを取得するために、pom.xml に次の連動関係を追加します。

<properties>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
    <mule.agent.version>1.6.4-mule-3.x</mule.agent.version>
    <jersey.core.version>2.11</jersey.core.version>
    <commons.lang.version>2.4</commons.lang.version>
</properties>

<dependencies>
        <dependency>
            <groupId>com.mulesoft.agent</groupId>
            <artifactId>mule-agent-api</artifactId>
            <version>${mule.agent.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.core</groupId>
            <artifactId>jersey-client</artifactId>
            <version>${jersey.core.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <scope>provided</scope>
            <version>${commons.lang.version}</version>
        </dependency>
</dependencies>

<repositories>
    <repository>
        <id>mulesoft-ci-releases</id>
        <name>ci releases</name>
        <url>https://repository-master.mulesoft.org/nexus/content/repositories/releases-ee/<url>
    </repository>
</repositories>

<build>
    <plugins>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
        </plugin>
    </plugins>
</build>

対応する JAR は、Mule インスタンスの plugins フォルダにある mule-agent プラグイン内の lib フォルダに追加します。例: $MULE_HOME/plugins/mule-agent/lib/<component name>.jar

新しいサービスの追加

新しいサービスを追加するには、MuleAgentService インターフェースを実装します。

カスタムサービスに関する考慮事項

  • サービスは、@Inject アノテーションを使用することによって、Runtime Manager エージェント環境に登録されている任意の内部ハンドラを実行できます。

  • 新しいサービスを作成するために Runtime Manager エージェントアーキテクチャに従う必要はありません。

サービスの記述

MuleAgentService の実装

@Named("my.company.service")
@Singleton
public class MyService implements MuleAgentService
{

    @Inject
    private Map<String, InternalMessageHandler<List<T>>> handlers;

    @Override
    public java.util.List<com.mulesoft.agent.handlers.InternalMessageHandler> getInternalHandlers()
    {
        // TODO: return List of Internal Handlers
    }

    @Override
    public void enable(boolean state) throws AgentEnableOperationException {
        // TODO: enable the Service
    }

    @Override
    public boolean isEnabled() {
        // TODO: return Service status
    }
}

新しいサービスを追加するには、クラスを含む JAR を mule-agent プラグインフォルダ内の lib フォルダ ($MULE_HOME/mule-agent/lib など) に置きます。

文字列復元サービスの例

上で説明したように、このドキュメントでは簡単な例を使用して、文字列を元に戻すための完全な拡張を記述する方法を説明します。最初のステップは、この目的のためのサービスを追加することです。

@Named("com.company.service.reverse")
@Singleton
public class ReverseService implements MuleAgentService
{

    @Inject
    List<InternalMessageHandler<String>> messageHandlerList;

    @Override
    public List<InternalMessageHandler> getInternalHandlers()
    {
        return new ArrayList<InternalMessageHandler>(messageHandlerList);
    }

    @Override
    public void enable(boolean b) throws AgentEnableOperationException
    {

    }

    @Override
    public boolean isEnabled()
    {
        return true;
    }

    public String getConvertedString(String origString)
    {
        String reverted = StringUtils.reverse(origString);
        for (InternalMessageHandler<String> internalMessageHandler : messageHandlerList)
        {
            internalMessageHandler.handle(reverted);
        }

        return reverted;
    }
}

新しい外部メッセージハンドラの追加

新しい外部メッセージハンドラを追加するには、Runtime Manager エージェントの文字列復元の外部メッセージハンドラインターフェースを実装する必要があります。

カスタム外部メッセージハンドラに関する考慮事項

  • 外部メッセージハンドラは、トランスポートに挿入されます。

  • 外部メッセージハンドラは、スレッドセーフである必要があります。

  • 外部メッセージハンドラは、トランスポートによって実行され、Mule とやりとりすることはできません。サービスのみが Mule とやりとりできます。

外部メッセージハンドラの記述

REST

@Named("my.external.handler")
@Path("somePath")
@Singleton
public class MyRequestHandler implements ExternalMessageHandler
{
    @Inject
    private MuleService muleServiceInTheAPIModule;

    @Override
    public void enable(boolean state) throws AgentEnableOperationException {
        // TODO: enable the Handler
    }

    @Override
    public boolean isEnabled() {
        // TODO: return Handler status
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public List<Component> someRequest()
    {

    }
}

WebSockets

@Named("TYPE_OF_MESSAGE_THAT_MUST_DISPATCH")
@Singleton
public class MyRequestHandler implements ExternalMessageHandler
{
    @Inject
    private MuleService muleServiceInTheAPIModule;

    @Override
    public void enable(boolean state) throws AgentEnableOperationException {
        // TODO: enable the Handler
    }

    @Override
    public boolean isEnabled() {
        // TODO: return Handler status
    }

}

新しい外部メッセージハンドラを追加するには、クラスを含む JAR を mule-agent プラグインフォルダ内の lib フォルダ ($MULE_HOME/mule-agent/lib など) に置きます。

文字列復元の外部メッセージハンドラ

文字列復元の例に従った外部ハンドラの例を次に示します。

@Named("com.company.externalhandler.reverse")
@Path("revert")
@Singleton
public class ReverseExternalHandler implements ExternalMessageHandler
{

    @Inject
    private ReverseService reverseService;

    @Override
    public void enable(boolean b) throws AgentEnableOperationException
    {

    }

    @Override
    public boolean isEnabled()
    {
        return true;
    }

    @GET
    public String getReversedString(@QueryParam("string") String string)
    {
        return reverseService.getConvertedString(string);
    }
}

上記のコードは、<your REST transport host>/mule/revert でリソースを公開します。

新しい内部メッセージハンドラの追加

新しい内部メッセージハンドラを追加するには、内部メッセージハンドラインターフェースを実装する必要があります。

カスタム内部メッセージハンドラに関する考慮事項

  • 内部メッセージハンドラは、処理するメッセージ種別に基づいてサービスに挿入されます。

  • 内部メッセージハンドラは、スレッドセーフである必要があります。

  • 内部メッセージハンドラは、サービスによって実行され、Mule とやりとりすることはできません。サービスのみが Mule とやりとりできます。

内部メッセージハンドラの記述

@Named("my.company.internal.handler")
@Singleton
public class MyInternalMessageHandler<T> implements InternalMessageHandler<T>{

    boolean handle(T t){
          // TODO handle message
    }

    @Override
    public void enable(boolean state) throws AgentEnableOperationException {
        // TODO: enable the Handler
    }

    @Override
    public boolean isEnabled() {
        // TODO: return Handler status
    }
}

新しい内部メッセージハンドラを追加するには、クラスを含む JAR を mule-agent プラグインフォルダ内の lib フォルダ ($MULE_HOME/mule-agent/lib など) に置きます。

文字列復元の内部メッセージハンドラ

次のコードは、文字列復元の例の内部メッセージハンドラを示しています。

@Named("com.mulesoft.agent.test.extension.internalHandler")
@Singleton
public class ReverseInternalHandler extends BufferedHandler<String>
{

    @Configurable("true")
    protected boolean enabled;

    @Configurable
    public String host;

    @Configurable
    public String port;

    @Inject
    public ReverseInternalHandler()
    {
        super();
    }

    @Override
    protected boolean canHandle(String t)
    {
        return true;
    }

    @Override
protected boolean flush(Collection<String> ts)
    {
        String tempDir = System.getProperty("java.io.tmpdir");
        File revertedStringFile = new File(tempDir, "revertedString.txt");

        FileOutputStream fos = null;

        BufferedWriter bw = null;

        try
        {
            fos = new FileOutputStream(revertedStringFile);

            bw = new BufferedWriter(new OutputStreamWriter(fos));

            for (String string : ts)
            {
                bw.write(string);
                bw.newLine();
            }
        }
        catch (IOException e)
        {
            System.out.println("Error writing reversed string");
            return false;
        } finally {
          if (bw != null){
            try {
                bw.close();
            } catch(IOException x) {

            }
          }
          if (fos != null){
            try{
                fos.close();
            } catch(IOException x) {

            }
          }
        }
        return true;
    }
    @PostConfigure
    public void postConfigure()
    {
    }

    @Override
    public void enable(boolean b) throws AgentEnableOperationException
    {
      enabled = b;
    }

    @Override
    public boolean isEnabled()
    {
        return enabled;
    }
}

内部メッセージハンドラは、サービスによって処理されたメッセージを revertedString.txt というファイルに書き込みます。

Runtime Manager エージェント API インターフェース

Mule サービス

**
 * <p>
 * Implementations of this interface provides new functionality to the Runtime Manager agent. These services handle data from the
 * Mule server and interact with mule.
 * </p>
 *
 * @see com.mulesoft.agent.handlers.ExternalMessageHandler , InternalMessageHandler
 * @since 1.0
 */
public interface MuleAgentService extends Switcher
{

    public List<InternalMessageHandler> getInternalHandlers();

}

外部メッセージハンドラ

/**
 * <p>
 * Gets  messages coming from an external system and executes {@link com.mulesoft.agent.services.MuleAgentService} based
 * the request.
 * </p>
 * <p>
 * This is just a marker interface for the communication layer to recognize the interface as a External message receiver
 * </p>
 *
 * @since 1.0
 */
public interface ExternalMessageHandler extends Switcher
{

}

内部メッセージハンドラ

/**
 * <p>
 * Internal messages come generally from mule side. {@link InternalMessageHandler} are use to handle those messages depending on,
 * for example, the transport.
 * </p>
 *
 * @param <Rq> is the type of the message it must handle
 * @since 1.0
 */
public interface InternalMessageHandler<Rq> extends Switcher
{

    /**
     * <p>
     * Process an internal message
     * </p>
     *
     * @param message The message to be processed
     * @return true if the message could be processed
     */
    boolean handle(@NotNull Rq message);

}

スイッチャ

/**
 * <p>
 * All the classes implementing this interface will be able to enable/disable themselves
 * </p>
 *
 * @since 1.0
 */
public interface Switcher
{
    /**
     * <p>
     * Turn the feature on, the class will be behave as expected
     * <br/>
     * If the feature is being disabled, any resources it has allocated should be freed and taken again when it is reenabled
     * </p>
     * @param state true if enabled, false otherwise
     * @throws AgentEnableOperationException if the end state is not the requested one
     */
    void enable(boolean state) throws AgentEnableOperationException;

    /**
     * <p>
     * Check the state of the class
     * </p>
     *
     * @return true if it is on, false otherwise
     */
    boolean isEnabled();

}

Was this article helpful?

💙 Thanks for your feedback!

Edit on GitHub