Multithreading netty EventExecutor组线程重复执行
最近,我使用netty构建了一个服务器程序,但遇到了一个难题, 有时,当我的程序收到一个连接时,它会使用多个线程来处理同一个连接 例如,当客户端连接到服务器时,客户端给服务器端数据A,然后将有多个不同的线程接收数据A并对其进行处理,这使得我的数据库经常插入相同的数据 我怎样才能解决这个问题 我的代码:Multithreading netty EventExecutor组线程重复执行,multithreading,netty,Multithreading,Netty,最近,我使用netty构建了一个服务器程序,但遇到了一个难题, 有时,当我的程序收到一个连接时,它会使用多个线程来处理同一个连接 例如,当客户端连接到服务器时,客户端给服务器端数据A,然后将有多个不同的线程接收数据A并对其进行处理,这使得我的数据库经常插入相同的数据 我怎样才能解决这个问题 我的代码: private int port; private Conf MyConf; public static String Path; public ChiconyServerBootstrap(S
private int port;
private Conf MyConf;
public static String Path;
public ChiconyServerBootstrap(String Path)
{
try
{
MyConf = new Conf(Path);
port = MyConf.getPort();
}
catch(Exception e)
{
e.printStackTrace();
}
}
public void start()
{
ServerBootstrap serverbootstrap = new ServerBootstrap();
NioEventLoopGroup connect_group = new NioEventLoopGroup();
NioEventLoopGroup io_group = new NioEventLoopGroup();
final EventExecutorGroup work_group = new DefaultEventExecutorGroup(10);
try
{
serverbootstrap.group(connect_group, io_group);
serverbootstrap.channel(NioServerSocketChannel.class);
serverbootstrap.childHandler(new ChannelInitializer<SocketChannel>()
{
@Override
public void initChannel(SocketChannel ch) throws Exception
{
ch.pipeline().addLast(new ByteArrayDecoder());
ch.pipeline().addLast(work_group, new WorkHandler());
}
});
serverbootstrap.childOption(ChannelOption.CONNECT_TIMEOUT_MILLIS, 60);
serverbootstrap.childOption(ChannelOption.SO_KEEPALIVE, true);
ChannelFuture future = serverbootstrap.bind(new InetSocketAddress(port)).sync();
future.channel().closeFuture().sync();
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
connect_group.shutdownGracefully();
io_group.shutdownGracefully();
work_group.shutdownGracefully();
}
}
public static void main(String[] args)
{
ChiconyServerBootstrap server;
Path = "./Conf/config.properties";
server = new ChiconyServerBootstrap(Path);
server.start();
}
Netty设计用于多线程,这也是从NIO环境中获得最大性能所必需的,因为从其他方面来说,大多数核心线程都不做任何事情。您可以使用
新的NioEventLoopGroup(1)使其成为单线程代码>构造函数然而,请展示您的“完整”WorkHandlerNetty设计用于多线程,这也是从NIO环境中获得最大性能所必需的,因为其他大多数内核线程什么都不做。您可以使用新的NioEventLoopGroup(1)使其成为单线程代码>构造函数但是请显示您的“完整”工作处理程序
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception
{
//Initialization parameter
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception
{
//Accept the parameters from the client
}
@Override
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception
{
//Perform business logic, data insert into database
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
{
}