侦听 Spring 集成 TCP 连接事件
Listen for Spring Integration TCP Connection events
我的 objective 是监听特定的 tcp 连接事件并用它执行一些任务。
通过实施 ApplicationEventPublisher
,我可以看到事件触发。
@Component
public class TestEventPublisher implements ApplicationEventPublisher {
@Override
public void publishEvent(Object event) {
LOG.info("Event Fired - {}", event.getClass());
}
}
INFO [globalTaskExecutor-2] logger - Event Fired - class org.springframework.integration.ip.tcp.connection.TcpConnectionOpenEvent
INFO [ThreadPoolTaskExecutor-3] logger - Event Fired - class org.springframework.integration.ip.tcp.connection.TcpConnectionCloseEvent
所以我为它添加了监听器,但它们没有被执行。
@Component
public class TestListeners {
@EventListener(TcpConnectionOpenEvent.class)
public void doSomethingWhenConnectionIsOpen() {
LOG.info("----------------**************** CONNECTION OPEN EVENT FIRED ****************** -----------------------"); // No log shows up
}
@EventListener(TcpConnectionFailedEvent.class)
public void doSomethingElseWhenConnectionFails() {
LOG.info("----------------**************** CONNECTION ATTEMPT FAILED EVENT FIRED ****************** -----------------------"); // No Log shows up
}
}
我做错了什么?
您的发布者实际上并未发布任何内容,它只是记录事件。
为了使用 @EventListener
,您必须使用 Spring 提供的内置 ApplicationEventPublisher
(实际上是应用程序上下文)。
TCP 组件实现 ApplicationEventPublisherAware
,因此 Spring 将自动注入内置发布者(只要组件由 Spring 管理)。如果你想拦截发布,你的发布者必须实现 ApplicationEventPublisherAware
,记录事件,然后调用 Spring 提供的真实发布者。
您还应该将事件参数添加到侦听器中。
我的 objective 是监听特定的 tcp 连接事件并用它执行一些任务。
通过实施 ApplicationEventPublisher
,我可以看到事件触发。
@Component
public class TestEventPublisher implements ApplicationEventPublisher {
@Override
public void publishEvent(Object event) {
LOG.info("Event Fired - {}", event.getClass());
}
}
INFO [globalTaskExecutor-2] logger - Event Fired - class org.springframework.integration.ip.tcp.connection.TcpConnectionOpenEvent
INFO [ThreadPoolTaskExecutor-3] logger - Event Fired - class org.springframework.integration.ip.tcp.connection.TcpConnectionCloseEvent
所以我为它添加了监听器,但它们没有被执行。
@Component
public class TestListeners {
@EventListener(TcpConnectionOpenEvent.class)
public void doSomethingWhenConnectionIsOpen() {
LOG.info("----------------**************** CONNECTION OPEN EVENT FIRED ****************** -----------------------"); // No log shows up
}
@EventListener(TcpConnectionFailedEvent.class)
public void doSomethingElseWhenConnectionFails() {
LOG.info("----------------**************** CONNECTION ATTEMPT FAILED EVENT FIRED ****************** -----------------------"); // No Log shows up
}
}
我做错了什么?
您的发布者实际上并未发布任何内容,它只是记录事件。
为了使用 @EventListener
,您必须使用 Spring 提供的内置 ApplicationEventPublisher
(实际上是应用程序上下文)。
TCP 组件实现 ApplicationEventPublisherAware
,因此 Spring 将自动注入内置发布者(只要组件由 Spring 管理)。如果你想拦截发布,你的发布者必须实现 ApplicationEventPublisherAware
,记录事件,然后调用 Spring 提供的真实发布者。
您还应该将事件参数添加到侦听器中。