1

Spring 統合を使用していますが、jmxtrans-agent を使用してスプリッターを監視したいと考えています。次の簡単な例のように、スプリッターに到着するリクエストの数をカウントしようとします。

@ManagedResource
public class Splitter {
    private final AtomicInteger count = new AtomicInteger();

    @ManagedAttribute
    public int getCount(){
        return this.count.get();
    }

    public List<JsonNode> split(Message<ArrayNode> message) {
        count.incrementAndGet();
        ...
    }
}

// spring integration workflow
<int:gateway id="myGateway" service-interface="someGateway" default-request-channel="splitChannel" error-channel="errorChannel"  default-reply-channel="replyChannel" async-executor="MyThreadPoolTaskExecutor"/>

<int:splitter id="mySplitter" input-channel="splitChannel" output-channel="transformChannel" method="split">
    <bean class="Splitter" />
</int:splitter>

// in MBeanExporter, I added
<entry key="myApplication:type=Splitter,name=splitter" value-ref="mySplitter" />

// query
<query
    objectName='myApplication:type=Splitter,name=splitter'
    attribute='Count'
    resultAlias='myApplication.Splitter.count'/>
<collectIntervalInSeconds>20</collectIntervalInSeconds>

このエラーが発生して、データを照会できません。

javax.management.AttributeNotFoundException: getAttribute failed: ModelMBeanAttributeInfo not found for number
    at javax.management.modelmbean.RequiredModelMBean.getAttribute(RequiredModelMBean.java:1524)
    at org.springframework.jmx.export.SpringModelMBean.getAttribute(SpringModelMBean.java:109)
  • このスプリッターは、リソースを管理するクラスを実装する必要がありますか?
  • Spring Integration Bean のスコープはリクエストごとだと思っていましたが、jmxtrans-agent が 20 秒ごとに情報を収集すると、データが失われるのでしょうか?
4

1 に答える 1

1

おー!見逃してすみません。今私はあなたのコードを見ます:

<int:splitter id="mySplitter" input-channel="splitChannel" output-channel="transformChannel" method="split">
    <bean class="Splitter" />
</int:splitter>

つまり、これ<bean class="Splitter" />は内部 Bean であり、他の環境では表示されません。

それを機能させるには、その Bean 定義を最上位に移動し、次から参照する必要があります<splitter>

<bean id="mySplitter" class="Splitter" />

<int:splitter id="mySplitter" input-channel="splitChannel" output-channel="transformChannel" ref="mySplitter" method="split"/>

<splitter>実際には内部 Bean を公開せず、独自の管理対象属性/操作のみを公開する JMX エクスポート用のコンポーネントを使用しました。

于 2016-10-11T12:54:35.930 に答える