Skip to content

Commit

Permalink
加锁,防止重复启动 synchronized (waitLock)
Browse files Browse the repository at this point in the history
  • Loading branch information
noseparte committed Aug 28, 2019
1 parent 9a97a20 commit c074a31
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 47 deletions.
25 changes: 13 additions & 12 deletions src/main/java/com/github/unclecatmyself/auto/InitServer.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,42 +4,43 @@
import com.github.unclecatmyself.bootstrap.BootstrapServer;
import com.github.unclecatmyself.bootstrap.NettyBootstrapServer;
import com.github.unclecatmyself.common.bean.InitNetty;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* InChat项目启动服务
* Create by UncleCatMySelf in 2018/12/06
**/
public abstract class InitServer {

// private InitNetty serverBean;

/** 静态化处理,保证唯一,确保用户启动的是他自己指定的,不是框架的
* 一个数据配置集合
/**
* 静态化处理,保证唯一,确保用户启动的是他自己指定的,不是框架的
* 一个数据配置集合
*/
private static InitNetty serverBean = ConfigFactory.initNetty;

// public InitServer(InitNetty serverBean) {
// this.serverBean = serverBean;
// }
/** netty服务器启动切面 */
/**
* netty服务器启动切面
*/
static BootstrapServer bootstrapServer;

/**
* 主要还是这个{@link NettyBootstrapServer},实例化想要的netty配置服务
*/
public static void open(){
if(serverBean!=null){
public static void open() {
if (serverBean != null) {
bootstrapServer = new NettyBootstrapServer();
bootstrapServer.setServerBean(serverBean);
int port = serverBean.getWebport();
bootstrapServer.start();
}
}

/**
* 关闭服务
*/
public void close(){
if(bootstrapServer!=null){
public void close() {
if (bootstrapServer != null) {
bootstrapServer.shutdown();
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,65 +40,74 @@ public void setServerBean(InitNetty serverBean) {

private EventLoopGroup workGroup;

ServerBootstrap bootstrap=null ;// 启动辅助类
ServerBootstrap bootstrap = null;// 启动辅助类

Object waitLock = new Object(); //加锁,防止重复启动

/**
* 服务开启
*/
public void start() {
initEventPool();
bootstrap.group(bossGroup, workGroup)
.channel(useEpoll()?EpollServerSocketChannel.class:NioServerSocketChannel.class)
.option(ChannelOption.SO_REUSEADDR, serverBean.isReuseaddr())
.option(ChannelOption.SO_BACKLOG, serverBean.getBacklog())
.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT)
.option(ChannelOption.SO_RCVBUF, serverBean.getRevbuf())
.childHandler(new ChannelInitializer<SocketChannel>() {
protected void initChannel(SocketChannel ch) throws Exception {
initHandler(ch.pipeline(),serverBean);
}
})
.childOption(ChannelOption.TCP_NODELAY, serverBean.isNodelay())
.childOption(ChannelOption.SO_KEEPALIVE, serverBean.isKeepalive())
.childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT);
bootstrap.bind(IpUtils.getHost(),serverBean.getWebport()).addListener((ChannelFutureListener) channelFuture -> {
if (channelFuture.isSuccess()) {
log.info("服务端启动成功【" + IpUtils.getHost() + ":" + serverBean.getWebport() + "】");
AutoConfig.address = IpUtils.getHost()+":"+serverBean.getWebport();
RedisConfig.getInstance();
}else{
log.info("服务端启动失败【" + IpUtils.getHost() + ":" + serverBean.getWebport() + "】");}
});
synchronized (waitLock) {
initEventPool();
bootstrap.group(bossGroup, workGroup)
.channel(useEpoll() ? EpollServerSocketChannel.class : NioServerSocketChannel.class)
.option(ChannelOption.SO_REUSEADDR, serverBean.isReuseaddr())
.option(ChannelOption.SO_BACKLOG, serverBean.getBacklog())
.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT)
.option(ChannelOption.SO_RCVBUF, serverBean.getRevbuf())
.childHandler(new ChannelInitializer<SocketChannel>() {
protected void initChannel(SocketChannel ch) throws Exception {
initHandler(ch.pipeline(), serverBean);
}
})
.childOption(ChannelOption.TCP_NODELAY, serverBean.isNodelay())
.childOption(ChannelOption.SO_KEEPALIVE, serverBean.isKeepalive())
.childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT);
bootstrap.bind(IpUtils.getHost(), serverBean.getWebport()).addListener((ChannelFutureListener) channelFuture -> {
if (channelFuture.isSuccess()) {
log.info("服务端启动成功【" + IpUtils.getHost() + ":" + serverBean.getWebport() + "】");
AutoConfig.address = IpUtils.getHost() + ":" + serverBean.getWebport();
RedisConfig.getInstance();
} else {
log.info("服务端启动失败【" + IpUtils.getHost() + ":" + serverBean.getWebport() + "】");
}
});
}
}

/**
* 初始化EnentPool 参数
*/
private void initEventPool(){
bootstrap= new ServerBootstrap();
if(useEpoll()){
private void initEventPool() {
bootstrap = new ServerBootstrap();
if (useEpoll()) {
bossGroup = new EpollEventLoopGroup(serverBean.getBossThread(), new ThreadFactory() {
private AtomicInteger index = new AtomicInteger(0);

public Thread newThread(Runnable r) {
return new Thread(r, "LINUX_BOSS_" + index.incrementAndGet());
}
});
workGroup = new EpollEventLoopGroup(serverBean.getWorkerThread(), new ThreadFactory() {
private AtomicInteger index = new AtomicInteger(0);

public Thread newThread(Runnable r) {
return new Thread(r, "LINUX_WORK_" + index.incrementAndGet());
}
});

}
else {
} else {
bossGroup = new NioEventLoopGroup(serverBean.getBossThread(), new ThreadFactory() {
private AtomicInteger index = new AtomicInteger(0);

public Thread newThread(Runnable r) {
return new Thread(r, "BOSS_" + index.incrementAndGet());
}
});
workGroup = new NioEventLoopGroup(serverBean.getWorkerThread(), new ThreadFactory() {
private AtomicInteger index = new AtomicInteger(0);

public Thread newThread(Runnable r) {
return new Thread(r, "WORK_" + index.incrementAndGet());
}
Expand All @@ -110,12 +119,14 @@ public Thread newThread(Runnable r) {
* 关闭资源
*/
public void shutdown() {
if(workGroup!=null && bossGroup!=null ){
try {
bossGroup.shutdownGracefully().sync();// 优雅关闭
workGroup.shutdownGracefully().sync();
} catch (InterruptedException e) {
log.error("服务端关闭资源失败【" + IpUtils.getHost() + ":" + serverBean.getWebport() + "】");
synchronized (waitLock) {
if (workGroup != null && bossGroup != null) {
try {
bossGroup.shutdownGracefully().sync();// 优雅关闭
workGroup.shutdownGracefully().sync();
} catch (InterruptedException e) {
log.error("服务端关闭资源失败【" + IpUtils.getHost() + ":" + serverBean.getWebport() + "】");
}
}
}
}
Expand Down

0 comments on commit c074a31

Please sign in to comment.