Spring Integration是否提供了类似于可以在流中记录的metric-channel-interceptor

时间:2014-12-12 20:38:24

标签: spring spring-integration

我正在寻找一些简单的方法,可以在某些"事件"发生。
在我的简单案例中,"事件"可能是当任何消息沿着频道向下流动时,或者当某个消息流向某个频道时,我想将一些信息打印到日志文件中。

我知道目前有一个logging-channel-adapter,但在刚刚描述的情况下,我需要能够定制自己的日志消息,而且我还需要某种计数器或跟踪事物的度量标准(因此适配器上的expression不足以支持访问payload但不授予对信道或流的信息。

我知道Spring Integration已经通过ManagedResourcesMetricType以及ManagedMetric向JMX公开了很多指标。 我还看过Russell"管理和监控Spring Integration Applications" YouTube视频多次:https://www.youtube.com/watch?v=TetfR7ULnA8
我意识到可以通过jmx-attribute-polling-channel-adapter

轮询Spring Integration组件指标

肯定有很多方法可以获得我所追求的目标。 几个例子:

  • ServiceAdapter中包含一个计数器,该计数器还具有对记录器的引用
  • 进入投票人的建议链
  • 通过jmx-attribute-polling-channel-adapter
  • 轮询JMX

然而,提供一些用户可以进入流程的组件可能会很有用,这些组件可以提供一些基本功能,以轻松满足我所描述的用例。
样本流程可能如下:
inbound-channel-adapter -> metric-logging-channel-interceptor -> componentY -> outbound-channel-adapter

非常高级别的此类组件可能看起来像logging-channel-adapterChannelInterceptor的混合,还有一些其他字段:

    <int:metric-logging-channel-interceptor>
        id=""
        order="" 
        phase=""
        auto-startup=""
        ref=""
        method=""
        channel=""
        outchannel=""
        log-trigger-expression="(SendCount % 10) = 0"
        level=""
        logger-name=""
        log-full-message=""
        expression="" 
         />

在实现需要保留一些基本统计数据的类中,我认为在messageChannel上公开的那些将是一个好的(即SendCount,MaxSendDuration等)。 log-trigger-expressionexpression属性也需要访问内部计数器。

如果我已经描述过某些内容,或者我是否过于复杂,请告诉我。如果它当前不存在虽然我认为能够快速将组件放入流中而不必仅为了记录目的而编写自定义ServiceActivator会带来好处。

1 个答案:

答案 0 :(得分:0)

有趣的问题。您已经可以使用选择性线控器做类似的事情...

<si:publish-subscribe-channel id="seconds">
    <si:interceptors>
        <si:wire-tap channel="thresholdLogger" selector="selector" />
    </si:interceptors>
</si:publish-subscribe-channel>

<bean id="selector" class="org.springframework.integration.filter.ExpressionEvaluatingSelector">
    <constructor-arg 
        value="@mbeanServer.getAttribute('org.springframework.integration:type=MessageChannel,name=seconds', 'SendCount') > 5" />
</bean>

<si:logging-channel-adapter id="thresholdLogger" />

这里有几件事情......

  1. 统计信息实际上保存在通道的MBean中,而不是通道本身,因此表达式必须通过MBean服务器获取值。
  2. 现在,点按线不支持selector-expression,只支持selector,所以我不得不使用对表达式评估选择器的引用。直接支持selector-expression将是一项有用的改进。
  3. 即使此示例中的选择器作用于tapped频道的统计信息,它实际上也可以引用任何MBean。
  4. 我可以在这看到一些潜在的改进。

    1. 支持selector-expression
    2. 维护渠道本身的统计数据而不是MBean,因此我们可以使用@channelName.sendCount > 5
    3. 随意打开JIRA'改进'问题。

      希望有所帮助。