perf[net]: use Objects requireNonNullElse method

This commit is contained in:
godotg
2022-12-20 23:14:40 +08:00
parent c8774def51
commit 34e6ec83bf
19 changed files with 84 additions and 122 deletions
@@ -22,9 +22,9 @@ import com.zfoo.protocol.IPacket;
import com.zfoo.util.net.HostAndPort;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.timeout.IdleStateHandler;
import org.apache.curator.shaded.com.google.common.base.MoreObjects;
import org.springframework.lang.Nullable;
import java.util.Objects;
import java.util.function.BiFunction;
/**
@@ -39,11 +39,9 @@ public class GatewayServer extends AbstractServer<SocketChannel> {
this(host, packetFilter, null);
}
public GatewayServer(HostAndPort host,
@Nullable BiFunction<Session, IPacket, Boolean> packetFilter,
GatewayRouteHandler gatewayRouteHandler) {
public GatewayServer(HostAndPort host, @Nullable BiFunction<Session, IPacket, Boolean> packetFilter, @Nullable GatewayRouteHandler gatewayRouteHandler) {
super(host);
this.gatewayRouteHandler = MoreObjects.firstNonNull(gatewayRouteHandler, new GatewayRouteHandler(packetFilter));
this.gatewayRouteHandler = Objects.requireNonNullElse(gatewayRouteHandler, new GatewayRouteHandler(packetFilter));
}
@Override
@@ -27,9 +27,9 @@ import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
import io.netty.handler.stream.ChunkedWriteHandler;
import io.netty.handler.timeout.IdleStateHandler;
import org.apache.curator.shaded.com.google.common.base.MoreObjects;
import org.springframework.lang.Nullable;
import java.util.Objects;
import java.util.function.BiFunction;
/**
@@ -44,11 +44,9 @@ public class WebsocketGatewayServer extends AbstractServer<SocketChannel> {
this(host, packetFilter, null);
}
public WebsocketGatewayServer(HostAndPort host,
@Nullable BiFunction<Session, IPacket, Boolean> packetFilter,
GatewayRouteHandler gatewayRouteHandler) {
public WebsocketGatewayServer(HostAndPort host, @Nullable BiFunction<Session, IPacket, Boolean> packetFilter, @Nullable GatewayRouteHandler gatewayRouteHandler) {
super(host);
this.gatewayRouteHandler = MoreObjects.firstNonNull(gatewayRouteHandler, new GatewayRouteHandler(packetFilter));
this.gatewayRouteHandler = Objects.requireNonNullElse(gatewayRouteHandler, new GatewayRouteHandler(packetFilter));
}
@@ -30,12 +30,13 @@ import io.netty.handler.ssl.SslContext;
import io.netty.handler.ssl.SslContextBuilder;
import io.netty.handler.stream.ChunkedWriteHandler;
import io.netty.handler.timeout.IdleStateHandler;
import org.apache.curator.shaded.com.google.common.base.MoreObjects;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.lang.Nullable;
import javax.net.ssl.SSLException;
import java.io.InputStream;
import java.util.Objects;
import java.util.function.BiFunction;
/**
@@ -50,25 +51,18 @@ public class WebsocketSslGatewayServer extends AbstractServer<SocketChannel> {
private final GatewayRouteHandler gatewayRouteHandler;
public WebsocketSslGatewayServer(HostAndPort host,
InputStream pem,
InputStream key,
BiFunction<Session, IPacket, Boolean> packetFilter) {
public WebsocketSslGatewayServer(HostAndPort host, InputStream pem, InputStream key, @Nullable BiFunction<Session, IPacket, Boolean> packetFilter) {
this(host, pem, key, packetFilter, null);
}
public WebsocketSslGatewayServer(HostAndPort host,
InputStream pem,
InputStream key,
BiFunction<Session, IPacket, Boolean> packetFilter,
GatewayRouteHandler gatewayRouteHandler) {
public WebsocketSslGatewayServer(HostAndPort host, InputStream pem, InputStream key, @Nullable BiFunction<Session, IPacket, Boolean> packetFilter, @Nullable GatewayRouteHandler gatewayRouteHandler) {
super(host);
try {
this.sslContext = SslContextBuilder.forServer(pem, key).build();
} catch (SSLException e) {
logger.error(ExceptionUtils.getMessage(e));
}
this.gatewayRouteHandler = MoreObjects.firstNonNull(gatewayRouteHandler, new GatewayRouteHandler(packetFilter));
this.gatewayRouteHandler = Objects.requireNonNullElse(gatewayRouteHandler, new GatewayRouteHandler(packetFilter));
}
@Override
@@ -24,8 +24,9 @@ import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.stream.ChunkedWriteHandler;
import org.apache.curator.shaded.com.google.common.base.MoreObjects;
import org.springframework.lang.Nullable;
import java.util.Objects;
import java.util.function.Function;
/**
@@ -46,12 +47,10 @@ public class HttpServer extends AbstractServer<SocketChannel> {
}
public HttpServer(HostAndPort host,
Function<FullHttpRequest, DecodedPacketInfo> uriResolver,
ServerRouteHandler serverRouteHandler) {
public HttpServer(HostAndPort host, Function<FullHttpRequest, DecodedPacketInfo> uriResolver, @Nullable ServerRouteHandler serverRouteHandler) {
super(host);
this.uriResolver = uriResolver;
this.serverRouteHandler = MoreObjects.firstNonNull(serverRouteHandler, new ServerRouteHandler());
this.serverRouteHandler = Objects.requireNonNullElse(serverRouteHandler, new ServerRouteHandler());
}
@Override
@@ -22,9 +22,9 @@ import com.zfoo.protocol.IPacket;
import com.zfoo.util.net.HostAndPort;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.timeout.IdleStateHandler;
import org.apache.curator.shaded.com.google.common.base.MoreObjects;
import org.springframework.lang.Nullable;
import java.util.Objects;
import java.util.function.BiFunction;
/**
@@ -40,11 +40,9 @@ public class JProtobufGatewayServer extends AbstractServer<SocketChannel> {
}
public JProtobufGatewayServer(HostAndPort host,
@Nullable BiFunction<Session, IPacket, Boolean> packetFilter,
GatewayRouteHandler gatewayRouteHandler) {
public JProtobufGatewayServer(HostAndPort host, @Nullable BiFunction<Session, IPacket, Boolean> packetFilter, @Nullable GatewayRouteHandler gatewayRouteHandler) {
super(host);
this.gatewayRouteHandler = MoreObjects.firstNonNull(gatewayRouteHandler, new GatewayRouteHandler(packetFilter));
this.gatewayRouteHandler = Objects.requireNonNullElse(gatewayRouteHandler, new GatewayRouteHandler(packetFilter));
}
@Override
@@ -18,11 +18,11 @@ import com.zfoo.net.handler.ClientRouteHandler;
import com.zfoo.net.handler.codec.jprotobuf.JProtobufTcpCodecHandler;
import com.zfoo.net.handler.idle.ClientIdleHandler;
import com.zfoo.util.net.HostAndPort;
import io.netty.channel.Channel;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.timeout.IdleStateHandler;
import org.apache.curator.shaded.com.google.common.base.MoreObjects;
import org.springframework.lang.Nullable;
import java.util.Objects;
/**
* @author godotg
@@ -36,9 +36,9 @@ public class JProtobufTcpClient extends AbstractClient<SocketChannel> {
this(host, null);
}
public JProtobufTcpClient(HostAndPort host, ClientRouteHandler clientRouteHandler) {
public JProtobufTcpClient(HostAndPort host, @Nullable ClientRouteHandler clientRouteHandler) {
super(host);
this.clientRouteHandler = MoreObjects.firstNonNull(clientRouteHandler, new ClientRouteHandler());
this.clientRouteHandler = Objects.requireNonNullElse(clientRouteHandler, new ClientRouteHandler());
}
@Override
@@ -20,7 +20,9 @@ import com.zfoo.net.handler.idle.ServerIdleHandler;
import com.zfoo.util.net.HostAndPort;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.timeout.IdleStateHandler;
import org.apache.curator.shaded.com.google.common.base.MoreObjects;
import org.springframework.lang.Nullable;
import java.util.Objects;
/**
* @author godotg
@@ -34,9 +36,9 @@ public class JProtobufTcpServer extends AbstractServer<SocketChannel> {
this(host, null);
}
public JProtobufTcpServer(HostAndPort host, ServerRouteHandler serverRouteHandler) {
public JProtobufTcpServer(HostAndPort host, @Nullable ServerRouteHandler serverRouteHandler) {
super(host);
this.serverRouteHandler = MoreObjects.firstNonNull(serverRouteHandler, new ServerRouteHandler());
this.serverRouteHandler = Objects.requireNonNullElse(serverRouteHandler, new ServerRouteHandler());
}
@Override
@@ -24,7 +24,9 @@ import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.websocketx.WebSocketClientProtocolConfig;
import io.netty.handler.codec.http.websocketx.WebSocketClientProtocolHandler;
import io.netty.handler.stream.ChunkedWriteHandler;
import org.apache.curator.shaded.com.google.common.base.MoreObjects;
import org.springframework.lang.Nullable;
import java.util.Objects;
/**
* @author godotg
@@ -39,11 +41,10 @@ public class JsonWebsocketClient extends AbstractClient<SocketChannel> {
this(host, webSocketClientProtocolConfig, null);
}
public JsonWebsocketClient(HostAndPort host, WebSocketClientProtocolConfig webSocketClientProtocolConfig,
ClientRouteHandler clientRouteHandler) {
public JsonWebsocketClient(HostAndPort host, WebSocketClientProtocolConfig webSocketClientProtocolConfig, @Nullable ClientRouteHandler clientRouteHandler) {
super(host);
this.webSocketClientProtocolConfig = webSocketClientProtocolConfig;
this.clientRouteHandler = MoreObjects.firstNonNull(clientRouteHandler, new ClientRouteHandler());
this.clientRouteHandler = Objects.requireNonNullElse(clientRouteHandler, new ClientRouteHandler());
}
@@ -23,7 +23,9 @@ import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
import io.netty.handler.stream.ChunkedWriteHandler;
import org.apache.curator.shaded.com.google.common.base.MoreObjects;
import org.springframework.lang.Nullable;
import java.util.Objects;
/**
* @author godotg
@@ -37,9 +39,9 @@ public class JsonWebsocketServer extends AbstractServer<SocketChannel> {
this(host, null);
}
public JsonWebsocketServer(HostAndPort host, ServerRouteHandler serverRouteHandler) {
public JsonWebsocketServer(HostAndPort host, @Nullable ServerRouteHandler serverRouteHandler) {
super(host);
this.serverRouteHandler = MoreObjects.firstNonNull(serverRouteHandler, new ServerRouteHandler());
this.serverRouteHandler = Objects.requireNonNullElse(serverRouteHandler, new ServerRouteHandler());
}
@Override
@@ -20,7 +20,9 @@ import com.zfoo.net.handler.idle.ClientIdleHandler;
import com.zfoo.util.net.HostAndPort;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.timeout.IdleStateHandler;
import org.apache.curator.shaded.com.google.common.base.MoreObjects;
import org.springframework.lang.Nullable;
import java.util.Objects;
/**
* @author godotg
@@ -34,9 +36,9 @@ public class TcpClient extends AbstractClient<SocketChannel> {
this(host, null);
}
public TcpClient(HostAndPort host, ClientRouteHandler clientRouteHandler) {
public TcpClient(HostAndPort host, @Nullable ClientRouteHandler clientRouteHandler) {
super(host);
this.clientRouteHandler = MoreObjects.firstNonNull(clientRouteHandler, new ClientRouteHandler());
this.clientRouteHandler = Objects.requireNonNullElse(clientRouteHandler, new ClientRouteHandler());
}
@Override
@@ -20,7 +20,9 @@ import com.zfoo.net.handler.idle.ServerIdleHandler;
import com.zfoo.util.net.HostAndPort;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.timeout.IdleStateHandler;
import org.apache.curator.shaded.com.google.common.base.MoreObjects;
import org.springframework.lang.Nullable;
import java.util.Objects;
/**
* @author godotg
@@ -34,9 +36,9 @@ public class TcpServer extends AbstractServer<SocketChannel> {
this(host, null);
}
public TcpServer(HostAndPort host, ServerRouteHandler serverRouteHandler) {
public TcpServer(HostAndPort host, @Nullable ServerRouteHandler serverRouteHandler) {
super(host);
this.routeHandler = MoreObjects.firstNonNull(serverRouteHandler, new ServerRouteHandler());
this.routeHandler = Objects.requireNonNullElse(serverRouteHandler, new ServerRouteHandler());
}
@Override
@@ -27,9 +27,9 @@ import io.netty.channel.ChannelOption;
import io.netty.channel.epoll.Epoll;
import io.netty.channel.epoll.EpollDatagramChannel;
import io.netty.channel.socket.nio.NioDatagramChannel;
import org.apache.curator.shaded.com.google.common.base.MoreObjects;
import org.springframework.lang.Nullable;
import java.util.function.Consumer;
import java.util.Objects;
/**
* @author godotg
@@ -43,9 +43,9 @@ public class UdpClient extends AbstractClient<Channel> {
this(host, null);
}
public UdpClient(HostAndPort host, ClientRouteHandler clientRouteHandler) {
public UdpClient(HostAndPort host, @Nullable ClientRouteHandler clientRouteHandler) {
super(host);
this.clientRouteHandler = MoreObjects.firstNonNull(clientRouteHandler, new ClientRouteHandler());
this.clientRouteHandler = Objects.requireNonNullElse(clientRouteHandler, new ClientRouteHandler());
}
@Override
@@ -25,9 +25,11 @@ import io.netty.channel.epoll.EpollEventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioDatagramChannel;
import io.netty.util.concurrent.DefaultThreadFactory;
import org.apache.curator.shaded.com.google.common.base.MoreObjects;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.lang.Nullable;
import java.util.Objects;
/**
* @author godotg
@@ -43,9 +45,9 @@ public class UdpServer extends AbstractServer<Channel> {
this(host, null);
}
public UdpServer(HostAndPort host, ServerRouteHandler serverRouteHandler) {
public UdpServer(HostAndPort host, @Nullable ServerRouteHandler serverRouteHandler) {
super(host);
this.serverRouteHandler = MoreObjects.firstNonNull(serverRouteHandler, new ServerRouteHandler());
this.serverRouteHandler = Objects.requireNonNullElse(serverRouteHandler, new ServerRouteHandler());
}
@Override
@@ -24,7 +24,9 @@ import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.websocketx.WebSocketClientProtocolConfig;
import io.netty.handler.codec.http.websocketx.WebSocketClientProtocolHandler;
import io.netty.handler.stream.ChunkedWriteHandler;
import org.apache.curator.shaded.com.google.common.base.MoreObjects;
import org.springframework.lang.Nullable;
import java.util.Objects;
/**
@@ -41,11 +43,10 @@ public class WebsocketClient extends AbstractClient<SocketChannel> {
this(host, webSocketClientProtocolConfig, null);
}
public WebsocketClient(HostAndPort host, WebSocketClientProtocolConfig webSocketClientProtocolConfig,
ClientRouteHandler clientRouteHandler) {
public WebsocketClient(HostAndPort host, WebSocketClientProtocolConfig webSocketClientProtocolConfig, @Nullable ClientRouteHandler clientRouteHandler) {
super(host);
this.webSocketClientProtocolConfig = webSocketClientProtocolConfig;
this.clientRouteHandler = MoreObjects.firstNonNull(clientRouteHandler, new ClientRouteHandler());
this.clientRouteHandler = Objects.requireNonNullElse(clientRouteHandler, new ClientRouteHandler());
}
@Override
@@ -23,7 +23,9 @@ import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
import io.netty.handler.stream.ChunkedWriteHandler;
import org.apache.curator.shaded.com.google.common.base.MoreObjects;
import org.springframework.lang.Nullable;
import java.util.Objects;
/**
* @author godotg
@@ -37,9 +39,9 @@ public class WebsocketServer extends AbstractServer<SocketChannel> {
this(host, null);
}
public WebsocketServer(HostAndPort host, ServerRouteHandler serverRouteHandler) {
public WebsocketServer(HostAndPort host, @Nullable ServerRouteHandler serverRouteHandler) {
super(host);
this.serverRouteHandler = MoreObjects.firstNonNull(serverRouteHandler, new ServerRouteHandler());
this.serverRouteHandler = Objects.requireNonNullElse(serverRouteHandler, new ServerRouteHandler());
}
@@ -26,7 +26,6 @@ import io.netty.util.AttributeKey;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Objects;
import java.util.function.Consumer;
/**
@@ -40,13 +39,9 @@ public abstract class BaseRouteHandler extends ChannelInboundHandlerAdapter {
public static final AttributeKey<Session> SESSION_KEY = AttributeKey.valueOf("session");
protected final Consumer<Session> sessionActiveConsumer;
protected final Consumer<Session> sessionInactiveConsumer;
public Consumer<Session> sessionActiveConsumer;
public Consumer<Session> sessionInactiveConsumer;
protected BaseRouteHandler(Consumer<Session> sessionActiveConsumer, Consumer<Session> sessionInactiveConsumer) {
this.sessionActiveConsumer = Objects.requireNonNull(sessionActiveConsumer);
this.sessionInactiveConsumer = Objects.requireNonNull(sessionInactiveConsumer);
}
public static Session initChannel(Channel channel) {
var sessionAttr = channel.attr(SESSION_KEY);
@@ -60,18 +55,14 @@ public abstract class BaseRouteHandler extends ChannelInboundHandlerAdapter {
}
protected void onSessionActive(Session session) {
try {
this.sessionActiveConsumer.accept(session);
} catch (Throwable ignored) {
if (sessionActiveConsumer != null) {
sessionActiveConsumer.accept(session);
}
}
protected void onSessionInavtive(Session session) {
try {
this.sessionInactiveConsumer.accept(session);
} catch (Throwable ignored) {
protected void onSessionInactive(Session session) {
if (sessionInactiveConsumer != null) {
sessionInactiveConsumer.accept(session);
}
}
@@ -17,16 +17,12 @@ import com.zfoo.event.manager.EventBus;
import com.zfoo.net.NetContext;
import com.zfoo.net.core.event.ClientSessionActiveEvent;
import com.zfoo.net.core.event.ClientSessionInactiveEvent;
import com.zfoo.net.session.Session;
import com.zfoo.net.util.SessionUtils;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import org.apache.curator.shaded.com.google.common.base.MoreObjects;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.function.Consumer;
/**
* @author godotg
* @version 3.0
@@ -36,20 +32,13 @@ public class ClientRouteHandler extends BaseRouteHandler {
private static final Logger logger = LoggerFactory.getLogger(ClientRouteHandler.class);
public ClientRouteHandler() {
this(null, null);
}
public ClientRouteHandler(Consumer<Session> sessionActiveConsumer, Consumer<Session> sessionInactiveConsumer) {
super(MoreObjects.firstNonNull(sessionActiveConsumer,
(session) -> EventBus.submit(ClientSessionActiveEvent.valueOf(session)))
, MoreObjects.firstNonNull(sessionInactiveConsumer,
(session) -> EventBus.submit(ClientSessionInactiveEvent.valueOf(session))));
}
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
super.channelActive(ctx);
// 客户端的session初始化在启动的时候已经做了,这边直接获取session
var session = SessionUtils.getSession(ctx);
onSessionActive(session);
EventBus.submit(ClientSessionActiveEvent.valueOf(session));
logger.info("client channel is active {}", SessionUtils.sessionInfo(ctx));
}
@@ -64,7 +53,8 @@ public class ClientRouteHandler extends BaseRouteHandler {
}
NetContext.getSessionManager().removeClientSession(session);
onSessionInavtive(session);
onSessionInactive(session);
EventBus.submit(ClientSessionInactiveEvent.valueOf(session));
// 如果是消费者inactive,还需要触发客户端消费者检查事件,以便重新连接
if (session.getConsumerAttribute() != null) {
@@ -37,7 +37,6 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.function.BiFunction;
import java.util.function.Consumer;
/**
* @author godotg
@@ -51,16 +50,10 @@ public class GatewayRouteHandler extends ServerRouteHandler {
private final BiFunction<Session, IPacket, Boolean> packetFilter;
public GatewayRouteHandler(BiFunction<Session, IPacket, Boolean> packetFilter) {
this(packetFilter, null, null);
}
public GatewayRouteHandler(BiFunction<Session, IPacket, Boolean> packetFilter,
Consumer<Session> sessionActiveConsumer,
Consumer<Session> sessionInactiveConsumer) {
super(sessionActiveConsumer, sessionInactiveConsumer);
this.packetFilter = packetFilter;
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
// 请求者的session,一般是serverSession
@@ -17,16 +17,12 @@ import com.zfoo.event.manager.EventBus;
import com.zfoo.net.NetContext;
import com.zfoo.net.core.event.ServerSessionActiveEvent;
import com.zfoo.net.core.event.ServerSessionInactiveEvent;
import com.zfoo.net.session.Session;
import com.zfoo.net.util.SessionUtils;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import org.apache.curator.shaded.com.google.common.base.MoreObjects;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.function.Consumer;
/**
* @author godotg
* @version 3.0
@@ -36,17 +32,6 @@ public class ServerRouteHandler extends BaseRouteHandler {
private static final Logger logger = LoggerFactory.getLogger(ServerRouteHandler.class);
public ServerRouteHandler() {
this(null, null);
}
public ServerRouteHandler(Consumer<Session> sessionActiveConsumer, Consumer<Session> sessionInactiveConsumer) {
super(MoreObjects.firstNonNull(sessionActiveConsumer,
(session) -> EventBus.submit(ServerSessionActiveEvent.valueOf(session)))
, MoreObjects.firstNonNull(sessionInactiveConsumer,
(session) -> EventBus.submit(ServerSessionInactiveEvent.valueOf(session))));
}
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
super.channelActive(ctx);
@@ -54,6 +39,7 @@ public class ServerRouteHandler extends BaseRouteHandler {
NetContext.getSessionManager().addServerSession(session);
logger.info("server channel is active {}", SessionUtils.sessionInfo(ctx));
onSessionActive(session);
EventBus.submit(ServerSessionActiveEvent.valueOf(session));
}
@Override
@@ -66,6 +52,7 @@ public class ServerRouteHandler extends BaseRouteHandler {
}
NetContext.getSessionManager().removeServerSession(session);
logger.warn("server channel is inactive {}", SessionUtils.sessionSimpleInfo(ctx));
onSessionInavtive(session);
onSessionInactive(session);
EventBus.submit(ServerSessionInactiveEvent.valueOf(session));
}
}