Flex Gateway新着情報
Governance新着情報
Monitoring API Manager| 
 可能な場合は、Equality の会社の値に一致するように、含めない用語を変更しました。顧客の実装に対する影響を回避するために、一部の用語は変更されていません。  | 
文字列を元に戻すメソッドを使用して、完全なサービス、外部メッセージハンドラー、内部メッセージハンドラーの実装など、Anypoint 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 サポートにお問い合わせください。 
 | 
対応する JAR は、Mule インスタンスの plugins フォルダーにある mule-agent プラグイン内の lib フォルダーに追加します。例: $MULE_HOME/plugins/mule-agent/lib/<component name>.jar。
新しいサービスを追加するには、MuleAgentService インターフェースを実装します。
カスタムサービスに関する考慮事項
サービスは、@Inject アノテーションを使用することによって、Runtime Manager エージェント環境に登録されている任意の内部ハンドラーを実行できます。
新しいサービスを作成するために Runtime Manager エージェントアーキテクチャに従う必要はありません。
@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 とやりとりできます。
@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()
    {
    }
}
@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 というファイルに書き込みます。
**
 * <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();
}