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

可能な場合は、Equality の会社の値に一致するように、含めない用語を変更しました。顧客の実装に対する影響を回避するために、一部の用語は変更されていません。

文字列を元に戻すメソッドを使用して、完全なサービス、外部メッセージハンドラー、内部メッセージハンドラーの実装など、Anypoint 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>

このリポジトリへのアクセスについては、MuleSoft サポートにお問い合わせください。

https://repository-master.mulesoft.org/nexus/content/repositories/releases-ee/

対応する 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
 * Mule 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();

}