diff --git a/event/src/main/java/com/zfoo/event/model/event/AppStartBeforeEvent.java b/event/src/main/java/com/zfoo/event/model/event/AppStartBeforeEvent.java new file mode 100644 index 00000000..04519b01 --- /dev/null +++ b/event/src/main/java/com/zfoo/event/model/event/AppStartBeforeEvent.java @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2020 The zfoo Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and limitations under the License. + */ + +package com.zfoo.event.model.event; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.event.ApplicationContextEvent; + +/** + * 应用启动事件,这个使用spring自带的事件机制,自研的event事件仅用在业务逻辑 + * + * @author jaysunxiao + * @version 3.0 + */ +public class AppStartBeforeEvent extends ApplicationContextEvent { + + public AppStartBeforeEvent(ApplicationContext context) { + super(context); + } + +} diff --git a/net/src/main/java/com/zfoo/net/core/tcp/model/ClientSessionInactiveEvent.java b/net/src/main/java/com/zfoo/net/core/tcp/model/ClientSessionInactiveEvent.java new file mode 100644 index 00000000..ea067bc1 --- /dev/null +++ b/net/src/main/java/com/zfoo/net/core/tcp/model/ClientSessionInactiveEvent.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2020 The zfoo Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and limitations under the License. + */ + +package com.zfoo.net.core.tcp.model; + +import com.zfoo.event.model.event.IEvent; +import com.zfoo.net.session.model.Session; + +/** + * @author jaysunxiao + * @version 3.0 + */ +public class ClientSessionInactiveEvent implements IEvent { + + private Session session; + + public static ClientSessionInactiveEvent valueOf(Session session) { + var event = new ClientSessionInactiveEvent(); + event.session = session; + return event; + } + + public Session getSession() { + return session; + } + + public void setSession(Session session) { + this.session = session; + } +} diff --git a/net/src/main/java/com/zfoo/net/handler/ClientDispatcherHandler.java b/net/src/main/java/com/zfoo/net/handler/ClientDispatcherHandler.java index 79e16f54..4e024b30 100644 --- a/net/src/main/java/com/zfoo/net/handler/ClientDispatcherHandler.java +++ b/net/src/main/java/com/zfoo/net/handler/ClientDispatcherHandler.java @@ -13,7 +13,9 @@ package com.zfoo.net.handler; +import com.zfoo.event.manager.EventBus; import com.zfoo.net.NetContext; +import com.zfoo.net.core.tcp.model.ClientSessionInactiveEvent; import com.zfoo.net.session.model.AttributeType; import com.zfoo.net.util.SessionUtils; import io.netty.channel.ChannelHandler; @@ -41,15 +43,20 @@ public class ClientDispatcherHandler extends BaseDispatcherHandler { super.channelInactive(ctx); var session = SessionUtils.getSession(ctx); - if (session != null) { - var consumeAttribute = session.getAttribute(AttributeType.CONSUMER); - NetContext.getSessionManager().removeClientSession(session); - // 如果是消费者inactive,还需要触发客户端消费者检查事件,以便重新连接 - if (consumeAttribute != null) { - NetContext.getConfigManager().getRegistry().checkConsumer(); - } + if (session == null) { + return; } + + var consumeAttribute = session.getAttribute(AttributeType.CONSUMER); + NetContext.getSessionManager().removeClientSession(session); + EventBus.asyncSubmit(ClientSessionInactiveEvent.valueOf(session)); + + // 如果是消费者inactive,还需要触发客户端消费者检查事件,以便重新连接 + if (consumeAttribute != null) { + NetContext.getConfigManager().getRegistry().checkConsumer(); + } + logger.warn("[channel:{}] is inactive", SessionUtils.sessionInfo(ctx)); }