Commit bcc32f52 authored by zengtianlai3's avatar zengtianlai3

Merge branch 'for-yx' of http://120.77.240.215:9701/tianlai3/ioc_sixiang_license into for-yx

parents 869793d3 3969ca4c
...@@ -4,11 +4,12 @@ import org.mybatis.spring.annotation.MapperScan; ...@@ -4,11 +4,12 @@ import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@EnableAsync
@ServletComponentScan(basePackages ="iot.sixiang.license") @ServletComponentScan(basePackages ="iot.sixiang.license")
@SpringBootApplication @SpringBootApplication
@EnableScheduling @EnableScheduling
......
package iot.sixiang.license.config;
/**
* Title: ThreadPoolConfig
* Description: TODO
*
* @author tianlai3
* @date 2022-07-16 20:05:38
*/
import lombok.Data;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
@Data
@Configuration
@EnableAsync
public class ThreadPoolConfig {
private static final int corePoolSize = 1; // 核心线程数(默认线程数)
private static final int maxPoolSize = 2; // 最大线程数
private static final int keepAliveTime = 10; // 允许线程空闲时间(单位:默认为秒)
private static final int queueCapacity = 2; // 缓冲队列数
/**
* 默认异步线程池
* @return
*/
@Bean("taskExecutor")
public Executor taskExecutor(){
ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor();
pool.setThreadNamePrefix("threadPoll-");
pool.setCorePoolSize(corePoolSize);
pool.setMaxPoolSize(maxPoolSize);
pool.setKeepAliveSeconds(keepAliveTime);
pool.setQueueCapacity(queueCapacity);
pool.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 初始化
pool.initialize();
return pool;
}
}
package iot.sixiang.license.device;
import iot.sixiang.license.net.TcpServer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
/**
* Title: AsyncTcpServer
* Description: TODO
*
* @author tianlai3
* @date 2022-07-16 20:30:51
*/
@Component
@Slf4j
public class AsyncTcpServer {
@Async("taskExecutor")
public void start(int port, DeviceChannelInitializer channelInitializer) {
TcpServer server = new TcpServer(port, channelInitializer);
server.start();
}
}
...@@ -5,7 +5,6 @@ import iot.sixiang.license.model.PageInfoModel; ...@@ -5,7 +5,6 @@ import iot.sixiang.license.model.PageInfoModel;
import iot.sixiang.license.model.SessionContext; import iot.sixiang.license.model.SessionContext;
import iot.sixiang.license.model.vo.DeviceDetailVo; import iot.sixiang.license.model.vo.DeviceDetailVo;
import iot.sixiang.license.model.vo.DeviceVo; import iot.sixiang.license.model.vo.DeviceVo;
import iot.sixiang.license.net.TcpServer;
import iot.sixiang.license.service.DeviceService; import iot.sixiang.license.service.DeviceService;
import iot.sixiang.license.util.CommonUtil; import iot.sixiang.license.util.CommonUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
...@@ -15,7 +14,6 @@ import org.springframework.stereotype.Component; ...@@ -15,7 +14,6 @@ import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import java.util.*; import java.util.*;
@Component @Component
@Slf4j @Slf4j
public class DeviceManager { public class DeviceManager {
...@@ -23,13 +21,15 @@ public class DeviceManager { ...@@ -23,13 +21,15 @@ public class DeviceManager {
private Map<String, SessionContext> sessionContexts = null; private Map<String, SessionContext> sessionContexts = null;
private DeviceChannelInitializer channelInitializer; private DeviceChannelInitializer channelInitializer;
private TcpServer server = null; // private TcpServer server = null;
private int port = 18889; private int port = 18889;
private Map<String, DeviceVo> allDevice = null; private Map<String, DeviceVo> allDevice = null;
@Autowired @Autowired
private DeviceService deviceService; private DeviceService deviceService;
@Autowired @Autowired
private DeviceServerHandler handler; private DeviceServerHandler handler;
@Autowired
private AsyncTcpServer asyncTcpServer;
public DeviceManager() { public DeviceManager() {
sessionContexts = new HashMap<String, SessionContext>(); sessionContexts = new HashMap<String, SessionContext>();
...@@ -42,11 +42,11 @@ public class DeviceManager { ...@@ -42,11 +42,11 @@ public class DeviceManager {
initDevices(); initDevices();
} }
private void startTcpService() { private void startTcpService() {
sessionContexts = new HashMap<String, SessionContext>(); sessionContexts = new HashMap<String, SessionContext>();
channelInitializer = new DeviceChannelInitializer(handler); channelInitializer = new DeviceChannelInitializer(handler);
server = new TcpServer(port, channelInitializer); asyncTcpServer.start(port, channelInitializer);
server.start();
} }
public void initDevices() { public void initDevices() {
......
...@@ -33,17 +33,16 @@ public class ForwardClient { ...@@ -33,17 +33,16 @@ public class ForwardClient {
channelInitializer = new ForwardChannelInitializer(handler); channelInitializer = new ForwardChannelInitializer(handler);
EventLoopGroup eventLoopGroup = new NioEventLoopGroup(); EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
bootstrap = new Bootstrap(); bootstrap = new Bootstrap();
if (bootstrap != null) { try {
try { bootstrap
bootstrap .channel(NioSocketChannel.class)
.channel(NioSocketChannel.class) .option(ChannelOption.SO_KEEPALIVE, true)
.option(ChannelOption.SO_KEEPALIVE, true) .group(eventLoopGroup)
.group(eventLoopGroup) .handler(channelInitializer);
.handler(channelInitializer); } catch (IllegalStateException ex) {
} catch (IllegalStateException ex) { log.error(ex.getMessage());
log.error(ex.getMessage());
}
} }
} }
public void startTcp(String host, int port, String appId) { public void startTcp(String host, int port, String appId) {
......
...@@ -20,43 +20,38 @@ public class TcpServer { ...@@ -20,43 +20,38 @@ public class TcpServer {
} }
public void start() { public void start() {
Thread thread = new Thread(new Runnable() {
@Override //创建两个线程组 bossGroup、workerGroup
public void run() { EventLoopGroup bossGroup = new NioEventLoopGroup(4);
//创建两个线程组 bossGroup、workerGroup EventLoopGroup workerGroup = new NioEventLoopGroup(4);
EventLoopGroup bossGroup = new NioEventLoopGroup(4); log.debug("Tcp服务,开始监听端口:{}", port);
EventLoopGroup workerGroup = new NioEventLoopGroup(4); //创建服务端的启动对象,设置参数
log.debug("Tcp服务,开始监听端口:{}",port); ServerBootstrap b = new ServerBootstrap();
//创建服务端的启动对象,设置参数 //设置两个线程组boosGroup和workerGroup
ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup)
//设置两个线程组boosGroup和workerGroup //设置服务端通道实现类型
b.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class)
//设置服务端通道实现类型
.channel(NioServerSocketChannel.class)
// .handler(new LoggingHandler(LogLevel.INFO)) // .handler(new LoggingHandler(LogLevel.INFO))
.childHandler(channelInitializer) .childHandler(channelInitializer)
// 设置tcp缓冲区 // 设置tcp缓冲区
.option(ChannelOption.SO_BACKLOG, 1024) .option(ChannelOption.SO_BACKLOG, 1024)
//设置保持活动连接状态 //设置保持活动连接状态
.childOption(ChannelOption.SO_KEEPALIVE, true); .childOption(ChannelOption.SO_KEEPALIVE, true);
ChannelFuture f; ChannelFuture f;
try { try {
f = b.bind(port).sync(); f = b.bind(port).sync();
f.channel().closeFuture().sync(); f.channel().closeFuture().sync();
} catch (InterruptedException e) { } catch (InterruptedException e) {
// TODO Auto-generated catch block // TODO Auto-generated catch block
log.error("Tcp服务异常,端口:{}", port); log.error("Tcp服务异常,端口:{}", port);
} finally { } finally {
log.debug("Tcp服务,停止退出"); log.debug("Tcp服务,停止退出");
if (workerGroup != null) { if (workerGroup != null) {
workerGroup.shutdownGracefully(); workerGroup.shutdownGracefully();
} }
if (bossGroup != null) { if (bossGroup != null) {
bossGroup.shutdownGracefully(); bossGroup.shutdownGracefully();
}
}
} }
}); }
thread.start();
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment