如何在Spring Integration中使用JAVA DSL基于模式进行通道拦截?

时间:2015-07-22 20:50:52

标签: spring-integration

我们计划将代码从Spring集成XML迁移到DSL。在XML Version中,我们使用通道名称模式来进行跟踪。

对于例如:如果频道名称为*_EL_*,我们会拦截频道并进行一些记录。

如何在Java dsl中使用此类或更简单的方法。

1 个答案:

答案 0 :(得分:1)

@GlobalChannelInterceptor适合您。它是Spring Integration Core的一部分。

所以,你必须做这样的事情:

@Bean
public MessageChannel bar() {
    return new DirectChannel();
}

@Bean
@GlobalChannelInterceptor(patterns = "*_EL_*")
public WireTap baz() {
    return new WireTap(this.bar());
}

我的意思是指定ChannelInterceptor @Bean并使用该注释标记它以进行基于模式的拦截。

<强>更新

示例测试用例,用于演示来自DSL流的@GlobalChannelInterceptor频道的auto-created工作:

@ContextConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@DirtiesContext
public class SO31573744Tests {

    @Autowired
    private TestGateway testGateway;

    @Autowired
    private PollableChannel intercepted;

    @Test
    public void testIt() {
        this.testGateway.testIt("foo");
        Message<?> receive = this.intercepted.receive(1000);
        assertNotNull(receive);
        assertEquals("foo", receive.getPayload());
    }


    @MessagingGateway
    public interface TestGateway {

        @Gateway(requestChannel = "testChannel")
        void testIt(String payload);

    }

    @Configuration
    @EnableIntegration
    @IntegrationComponentScan
    public static class ContextConfiguration {

        @Bean
        public IntegrationFlow testFlow() {
            return IntegrationFlows.from("testChannel")
                    .channel("nullChannel")
                    .get();
        }

        @Bean
        public PollableChannel intercepted() {
            return new QueueChannel();
        }

        @Bean
        @GlobalChannelInterceptor(patterns = "*Ch*")
        public WireTap wireTap() {
            return new WireTap(intercepted());
        }

    }

}