private void login(ChannelHandlerContext ctx, int messageId, User user, Version version) {
var pipeline = (DefaultChannelPipeline) ctx.pipeline();
cleanPipeline(pipeline);
var appStateHolder = new MobileStateHolder(user, version);
pipeline.addLast("AAppHandler", new MobileHandler(holder, appStateHolder));
var channel = ctx.channel();
if (user.region == null || user.region.isEmpty()) {
user.region = holder.props.region;
}
var session = holder.sessionDao.getOrCreateSessionByUser(appStateHolder.userKey, channel.eventLoop());
if (session.isSameEventLoop(channel)) {
completeLogin(channel, session, user, messageId, version);
} else {
log.debug("Re registering app channel. {}", ctx.channel());
ReregisterChannelUtil.reRegisterChannel(ctx, session, channelFuture ->
completeLogin(channelFuture.channel(), session, user, messageId, version));
}
}