今日,博主遇到一个问题,就是在写项目的时候,用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();
}
就是利用类的构造方法,直接多开一个线程。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。