---
schema_version: "1"
id: f735d6a97564c0302a537d4feda89ca07b98baec54cf1a59f694ed3f5d5a6ecc
title: ハイブリッドのための Runtime Manager エージェントの拡張
collection: mulesoft
version: current
locale: ja-jp
portal_url: https://docs.salesforce.com/mulesoft/current/ja-jp/runtime-manager/extending-the-runtime-manager-agent.md
canonical_url: https://docs.mulesoft.com/jp/runtime-manager/extending-the-runtime-manager-agent
source_site: docs.mulesoft.com
content_type: documentation
content_hash: 21351415e22b568c8fef212c055d4b5272f149b9791db61d1cab98dfbfe61d57
description: MuleSoft Documentation Site
latest: true
---
# ハイブリッドのための Runtime Manager エージェントの拡張

<table>
<tbody><tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
<div class="paragraph">
<p>可能な場合は、Equality の会社の値に一致するように、含めない用語を変更しました。顧客の実装に対する影響を回避するために、一部の用語は変更されていません。</p>
</div>
</td>
</tr>
</tbody></table>

文字列を元に戻すメソッドを使用して、完全なサービス、外部メッセージハンドラー、内部メッセージハンドラーの実装など、Anypoint Runtime Manager エージェントを拡張できます。

## [](#runtime-manager-エージェントの拡張可能なコンポーネント)Runtime Manager エージェントの拡張可能なコンポーネント

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

- サービス
- 外部メッセージハンドラー
- 内部メッセージハンドラー

## [](#runtime-manager-エージェントのカスタムコンポーネントの構造)Runtime Manager エージェントのカスタムコンポーネントの構造

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

- `/lib`​ にはコンポーネントの連動関係を含めます。
- `/classes`​ にはコンパイルされたクラスを含めます。

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

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

```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>
```

<table>
<tbody><tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
<div class="paragraph">
<p>このリポジトリへのアクセスについては、MuleSoft サポートにお問い合わせください。</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml">https://repository-master.mulesoft.org/nexus/content/repositories/releases-ee/</code></pre>
</div>
</div>
</td>
</tr>
</tbody></table>

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

## [](#addservice)新しいサービスの追加

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

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

- サービスは、​`@Inject`​ アノテーションを使用することによって、Runtime Manager エージェント環境に登録されている任意の内部ハンドラーを実行できます。
- 新しいサービスを作成するために Runtime Manager エージェントアーキテクチャに従う必要はありません。

### [](#サービスの記述)サービスの記述

#### [](#muleagentservice-の実装)MuleAgentService の実装

```java
@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`​ など) に置きます。

### [](#文字列復元サービスの例)文字列復元サービスの例

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

```java
@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;
    }
}
```

## [](#extmh)新しい外部メッセージハンドラーの追加

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

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

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

### [](#外部メッセージハンドラーの記述)外部メッセージハンドラーの記述

#### [](#rest)REST

```java
@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)WebSockets

```java
@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`​ など) に置きます。

### [](#文字列復元の外部メッセージハンドラー)文字列復元の外部メッセージハンドラー

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

```java
@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`​ でリソースを公開します。

## [](#intmh)新しい内部メッセージハンドラーの追加

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

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

- 内部メッセージハンドラーは、処理するメッセージ種別に基づいてサービスに挿入されます。
- 内部メッセージハンドラーは、スレッドセーフである必要があります。
- 内部メッセージハンドラーは、サービスによって実行され、Mule とやりとりすることはできません。 **サービスのみが Mule とやりとりできます。**

### [](#内部メッセージハンドラーの記述)内部メッセージハンドラーの記述

```java
@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`​ など) に置きます。

#### [](#文字列復元の内部メッセージハンドラー)文字列復元の内部メッセージハンドラー

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

```java
@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-インターフェース)Runtime Manager エージェント API インターフェース

### [](#mule-サービス)Mule サービス

```java
**
 * <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();

}
```

### [](#外部メッセージハンドラー)外部メッセージハンドラー

```java
/**
 * <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
{

}
```

### [](#内部メッセージハンドラー)内部メッセージハンドラー

```java
/**
 * <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);

}
```

### [](#スイッチャー)スイッチャー

```java
/**
 * <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();

}
```