【问题标题】:Failed to publish TcpConnectionOpenEvent Or TcpConnectionOpenEvent, Dispatcher failed to deliver Message发布 TcpConnectionOpenEvent 或 TcpConnectionOpenEvent 失败,Dispatcher 传递消息失败
【发布时间】:2020-08-11 08:24:17
【问题描述】:

在 spring 集成中,我使用事件监听器来处理 TcpConnectionOpenEvent 或 TcpConnectionCloseEvent。

当我使用下面的代码博客时,我可以处理连接打开关闭应用程序事件,但我收到类似警告日志

2020-08-11 11:15:46.857 WARN 7104 --- [XNIO-1 task-1] o.s.i.i.tcp.connection.TcpNetConnection :无法发布 TcpConnectionOpenEvent [一些细节] 已打开: Dispatcher 无法传递消息;嵌套异常是 java.lang.NullPointerException

@Bean
public MessageChannel connectionStatusChannel() {
    DirectChannel directChannel = new DirectChannel();
    directChannel.subscribe(new ServerConnectionStatusHandler());
    return directChannel;
}

@EventListener
public void listen(TcpConnectionOpenEvent event) {
    String eventName = "TcpConnectionOpenEvent";
    String destination = event.getConnectionFactoryName();
    connectionStatusChannel().send(new GenericMessage<>(eventName + "-" + destination));
}

@Component
public class ServerConnectionStatusHandler implements MessageHandler {

    private final Logger log = LoggerFactory.getLogger(ServerConnectionStatusHandler.class);

    @Autowired
    private SimpMessageSendingOperations messagingTemplate;

    public ServerConnectionStatusHandler() {
    }

    @Override
    public void handleMessage(Message<?> message) throws MessagingException {
        log.debug("ServerConnectionStatusHandler # handleMessage message : {} ", message.getPayload());
        messagingTemplate.convertAndSend("/topic/agent/connection/tracker", message.getPayload());
    }
}

这不会破坏我的流程,但我想了解我为什么要接受此警告以及如何清除它。没有@EventListener,它就会消失......

感谢您的帮助

【问题讨论】:

    标签: java spring spring-boot tcp spring-integration


    【解决方案1】:

    如果您想访问应用程序上下文中的某个 bean,则不能说 new。

    我的意思是:

    directChannel.subscribe(new ServerConnectionStatusHandler());
    

    因此,如果您的班级,您将创建一个非托管实例。同时你需要自动连接现有的bean:

    @Bean
    public MessageChannel connectionStatusChannel(ServerConnectionStatusHandler handler) {
        DirectChannel directChannel = new DirectChannel();
        directChannel.subscribe(handler);
        return directChannel;
    }
    

    【讨论】:

    • 您好 Artem,感谢您的回复,是的,现在警告已清除,但我还需要了解该警告的原因。是不是因为我自己创建了对象?
    • 由于您不是通过控制容器的 Spring 反转,而是通过普通的 new 手动获取该对象的实例,因此该对象不会发生依赖注入。
    【解决方案2】:

    在我看来,listen(...) event.getConnectionFactoryName() 为 null,或者 connectionStatusHandler() 可能返回 null

    【讨论】:

    • İn 日志行,我可以看到 connectionFactoryName...它可能与不同的东西有关...
    • 这不是我的区域。尽管似乎没有目的地调用该事件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-08
    • 2023-03-10
    相关资源
    最近更新 更多