运行在云服务器上的 springboot 项目, 无法启动 netty 服务

苍之弦 2019-11-14 06:47:16
我的项目是部署在云服务器上的一个Java服务器, 运行在Tomcat容器中, 然后当我运行项目的时候, springboot 项目启动, 但是 netty 并没有被启动, 请问是什么原因呢?
如果在本地的话, 我用 IDEA 启动项目的时候, netty 会启动, 但是到云服务器上, 通过 Tomcat 来运行项目的时候就没法启动 netty 了.
这是我启动项里的 netty , 我使用的是 netty 4.x

@SpringBootApplication
public class ServerApplication {
private static Logger LOGGER = LoggerFactory.getLogger(ServerApplication.class);

public static void main(String[] args) {
SpringApplication.run(ServerApplication.class, args);
try{
//开启 netty 服务
new Thread(() -> {
try {
LOGGER.info("启动");
new NettyServer().start(6666);
}catch(Exception ex) {
LOGGER.error(ex.getMessage(), ex);
}
}).start();
}catch (Exception ex){
LOGGER.error(ex.getMessage(), ex);
}
}
}

全部积分了, 请见谅
...全文
852 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
苍之弦 2019-11-15
  • 打赏
  • 举报
回复
引用 1 楼 huanqingdong 的回复:
你是war包部署到timcat?你的异常日志有输出吗
对啊, 是整个项目打成war包然后部署到Tomcat, 没有出现异常, 但是netty启动的提示没有出现, 客户端也连接不上 netty, Tomcat 和 netty 的端口不一样, 所以应该不存在占用, 可是在 IDEA 上那正常启动的, 很奇怪, 想不到解决的办法
苍之弦 2019-11-15
  • 打赏
  • 举报
回复
引用 9 楼 baiydn 的回复:
[quote=引用 7 楼 苍之弦 的回复:] [quote=引用 3 楼 郅嫣 的回复:] 启动改成用线程池来启动试试
问题解决了, 请问有没有什么方法长期保存 ctx 呢?[/quote]
public class Session {

    //SessionID
    private String id;
    //APP的openid
    private String openid;
    //设备的IMEI
    private String imei;
    //最后访问时间
    private Instant lastAccessTime;
    //连接通道
    private ChannelHandlerContext ctx;
......
public class SessionManager {

    private static final String TAG = SessionManager.class.getSimpleName();
    private static SessionManager instance;

    public static synchronized SessionManager getInstance() {
        if (instance == null) {
            instance = new SessionManager();
        }
        return instance;
    }

    private final Map<String, Session> sessionMap = new ConcurrentHashMap<String, Session>();

    public Map<String, Session> getAllSession() {
        return sessionMap;
    }

    public Session getSession(String sessionId) {
        return sessionMap.get(sessionId);
    }

    public void putSession(Session session) {
        sessionMap.put(session.getId(), session);
    }

    public void removeSession(Session session) {
        sessionMap.remove(session.getId());
    }

}
[/quote] 非常感谢, 原来还有这种方法啊, 我是用的 谷歌 的 cache 不过这个是由时间限制的
SZ深呼吸 2019-11-15
  • 打赏
  • 举报
回复
引用 7 楼 苍之弦 的回复:
[quote=引用 3 楼 郅嫣 的回复:] 启动改成用线程池来启动试试
问题解决了, 请问有没有什么方法长期保存 ctx 呢?[/quote]
public class Session {

    //SessionID
    private String id;
    //APP的openid
    private String openid;
    //设备的IMEI
    private String imei;
    //最后访问时间
    private Instant lastAccessTime;
    //连接通道
    private ChannelHandlerContext ctx;
......
public class SessionManager {

    private static final String TAG = SessionManager.class.getSimpleName();
    private static SessionManager instance;

    public static synchronized SessionManager getInstance() {
        if (instance == null) {
            instance = new SessionManager();
        }
        return instance;
    }

    private final Map<String, Session> sessionMap = new ConcurrentHashMap<String, Session>();

    public Map<String, Session> getAllSession() {
        return sessionMap;
    }

    public Session getSession(String sessionId) {
        return sessionMap.get(sessionId);
    }

    public void putSession(Session session) {
        sessionMap.put(session.getId(), session);
    }

    public void removeSession(Session session) {
        sessionMap.remove(session.getId());
    }

}
苍之弦 2019-11-15
  • 打赏
  • 举报
回复
引用 6 楼 maradona1984 的回复:
楼上说的应该是正解,整个spring的bean来启动netty呗

@Component
public class NettyListener implements ApplicationListener<ContextRefreshedEvent> {
    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {

        if (contextRefreshedEvent.getApplicationContext().getParent() == null){
            try {
                new NettyServer().start(6666);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }
}
我用了这段代码解决了问题, 感谢万能的开源社区
苍之弦 2019-11-15
  • 打赏
  • 举报
回复
引用 3 楼 郅嫣 的回复:
启动改成用线程池来启动试试
问题解决了, 请问有没有什么方法长期保存 ctx 呢?
maradona1984 2019-11-15
  • 打赏
  • 举报
回复
楼上说的应该是正解,整个spring的bean来启动netty呗
SZ深呼吸 2019-11-15
  • 打赏
  • 举报
回复
要继承SpringBootServletInitializer
package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

@SpringBootApplication
public class Application extends SpringBootServletInitializer {

  @Override
  protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    return application.sources(Application.class);
  }

  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
}
SZ深呼吸 2019-11-15
  • 打赏
  • 举报
回复
因为你在IDEA里是用Application的方式启动的,main是主方法,程序是在这里启动的。用tomcat启动,程序的启动方式不一样,入口应该不在main里,这里的代码估计没有执行。你需要配置web.xml和监听器启动。
郅嫣 2019-11-15
  • 打赏
  • 举报
回复
启动改成用线程池来启动试试
faith.huan 2019-11-14
  • 打赏
  • 举报
回复
你是war包部署到timcat?你的异常日志有输出吗

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧