我们计划将代码从Spring集成XML迁移到DSL。在XML Version中,我们使用通道名称模式来进行跟踪。
对于例如:如果频道名称为*_EL_*
,我们会拦截频道并进行一些记录。
如何在Java dsl中使用此类或更简单的方法。
答案 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());
}
}
}