今日,博主遇到一个问题,就是在写项目的时候,用springboot启动项目时要启动另外一个udp服务,结合我同事的代码,因为他以前是部署在tomcat下运行的,但是我不想那么麻烦,想直接jar包运行,所以只得重新想办法。现在把这2种方式都贴出来,相当于做一个笔记。

tomcat启动:

/**
 * Spring Boot核心启动类
 */
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@Slf4j
public class CoreApplication extends SpringBootServletInitializer implements CommandLineRunner {

    @Value("${udp.port}")
    private int udpPort;

    public static Thread thread;

    public static void main(String[] args)
    {
        SpringApplication sa = new SpringApplication(CoreApplication.class);
        sa.addListeners(new CloseListener());
        sa.run(args);
        //SpringApplication.run(Application.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        // 注意这里要指向原先用main方法执行的Application启动类
        builder.listeners(new CloseListener());
        return builder.sources(CoreApplication.class);
    }

    @Override
    public void run(String... args) {
        //新开线程避免阻塞Tomcat的启动
        thread = new Thread(){
            public void run(){
                Common.udpProverbServer = new UdpProverbServer();
                try {
                    log.info("smartHomeCore UDP"+udpPort+"启动成功");
                    Common.udpProverbServer.run(udpPort);
                    //new UdpProverbServer().run(udpPort);
                }catch (Exception e){
                    log.error("smartHomeCore UDP启动失败");
                    Common.udpProverbServer.stop();
                    //new UdpProverbServer().stop();
                }
            }
        };
        thread.start();
    }

    /**
     * 程序停止事件监听器
     */
    public static class CloseListener implements ApplicationListener<ContextClosedEvent> {
        @Override
        public void onApplicationEvent(ContextClosedEvent event) {
            thread.interrupt();
            //Common.udpProverbServer.stop();
            log.info("程序和UDP服务停止");
        }
    }

上面的方法就是改装的SpringApplication,直接在这里面新增一个线程,然后运行相关的代码。

我的做法,就是改变原来需要多开的那个类。

/**
 * Netty实现UDP通信核心-服务端
 */
@Component
@Slf4j
@Configuration
public class UdpServer implements DisposableBean, Runnable {

    @Value("${udp.server.port}")
    public  int udpPort;

    public EventLoopGroup group;

    private Thread thread;
    private volatile boolean someCondition = true;

    UdpServer() {
        this.thread = new Thread(this);
        this.thread.start();
    }

    private void udpRun() throws Exception{

        group = new NioEventLoopGroup();
        Bootstrap b = new Bootstrap();
        log.info("udp服务开始启动:启动端口为 {}",udpPort);
        //由于我们用的是UDP协议,所以要用NioDatagramChannel来创建
        b.group(group).channel(NioDatagramChannel.class)
                //支持广播
                .option(ChannelOption.SO_BROADCAST, true)
                //ChineseProverbServerHandler是业务处理类
                .handler(new UdpProverbServerHandler());
        b.bind(udpPort).sync().channel().closeFuture().await();
    }

    private void stop() {
        group.shutdownGracefully();
        group.shutdown();
    }



    @Override
    public void destroy() throws Exception {
        someCondition =false;
    }


    @Override
    public void run() {
        try {
            while (someCondition){
                udpRun();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String [] args) throws Exception{
        new UdpServer().run();
    }

就是利用类的构造方法,直接多开一个线程。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。

最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。 若排除这种情况,可在对应资源底部留言,或联络我们。

对于会员专享、整站源码、程序插件、网站模板、网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。

如果您已经成功付款但是网站没有弹出成功提示,请联系站长提供付款信息为您处理

源码素材属于虚拟商品,具有可复制性,可传播性,一旦授予,不接受任何形式的退款、换货要求。请您在购买获取之前确认好 是您所需要的资源