从多线程接收的消息的日志计数

时间:2014-03-14 10:41:12

标签: mule

我正在寻找一些方法来记录我在udp多线程的几个界面中收到的消息数量:

<flow name="transaccion" doc:name="transaccion">
    <set-variable variableName="#[count]" value="#[0]" />
    <composite-source>
        <udp:inbound-endpoint host="127.0.0.1" port="3001" connector-ref="udpConnector" doc:name="3001"/>
        <udp:inbound-endpoint host="127.0.0.1" port="3002" responseTimeout="10000" doc:name="3002"/>
        <udp:inbound-endpoint host="127.0.0.1" port="3003" responseTimeout="10000" doc:name="3003"/>
        <udp:inbound-endpoint host="127.0.0.1" port="3004" responseTimeout="10000" doc:name="3004"/>
        <udp:inbound-endpoint host="127.0.0.1" port="3005" responseTimeout="10000" doc:name="3005"/>
        <udp:inbound-endpoint host="127.0.0.1" port="3006" responseTimeout="10000" doc:name="3006"/>
        <udp:inbound-endpoint host="127.0.0.1" port="3007" responseTimeout="10000" doc:name="3007"/>
        <udp:inbound-endpoint host="127.0.0.1" port="3008" responseTimeout="10000" doc:name="3008"/>
        <udp:inbound-endpoint host="127.0.0.1" port="3009" responseTimeout="10000" doc:name="3009"/>
        <udp:inbound-endpoint host="127.0.0.1" port="3010" responseTimeout="10000" doc:name="3010"/>
    </composite-source>
    <set-variable variableName="#[counter]" value="#[count]+1" /> 
    <byte-array-to-string-transformer doc:name="Byte Array to String"/>
    <set-payload value="#['Hello, ' + message.payload + '. Today is the end of the world. ']" doc:name="Set Payload"/>

    <logger message="message #[payload:java.lang.String] received from #[function:hostname] #[function:ip] #[function:count]  count: #[variable:counter]   "    level="INFO" doc:name="Logger"/>

</flow>

这是一个例子,我尝试了一些方法,或者得到null,或者不起作用。

2 个答案:

答案 0 :(得分:1)

您需要在app注册表中使用计数器,而不是流的本地计数器。一种方法是使用简单的单例范围的Spring bean。

流量:

<spring:beans>
  <spring:bean id="counterBean" class="my.test.Counter" />
</spring:beans>

<logger message="message count: #[app.registry.counterBean.count()] " level="INFO"/>

类:

public class Counter {

    private int count = 0;
    public synchronized int count() {
       count++;
       return count;
    }
}

答案 1 :(得分:0)

您可以将Spring bean创建为AtomicInteger

<bean id="messageCounter" class="java.util.concurrent.atomic.AtomicInteger" scope="singleton">
    <constructor-arg type="int" value="0"/>
</bean>

然后像这样增加流量

<expression-component doc:name="messageCounter plus plus">
    app.registry.messageCounter.incrementAndGet();
</expression-component>

这里遇到同样的问题:Count the requests processed by a Mule flow