标签: netty

java.lang.UnsupportedOperationException: 反射 setAccessible(true) 已禁用

当我运行我的 Ktor 应用程序时,gradle run我遇到了以下异常:

19:21:11.795 [main] DEBUG io.netty.util.internal.logging.InternalLoggerFactory - Using SLF4J as the default logging framework
19:21:11.810 [main] DEBUG io.netty.util.internal.PlatformDependent0 - -Dio.netty.noUnsafe: false
19:21:11.810 [main] DEBUG io.netty.util.internal.PlatformDependent0 - Java version: 11
19:21:11.811 [main] DEBUG io.netty.util.internal.PlatformDependent0 - sun.misc.Unsafe.theUnsafe: available
19:21:11.812 [main] DEBUG io.netty.util.internal.PlatformDependent0 - sun.misc.Unsafe.copyMemory: available
19:21:11.812 [main] DEBUG io.netty.util.internal.PlatformDependent0 - java.nio.Buffer.address: available
19:21:11.814 [main] DEBUG io.netty.util.internal.PlatformDependent0 - direct buffer constructor: unavailable
java.lang.UnsupportedOperationException: Reflective setAccessible(true) disabled
        at io.netty.util.internal.ReflectionUtil.trySetAccessible(ReflectionUtil.java:31)
        at io.netty.util.internal.PlatformDependent0$4.run(PlatformDependent0.java:225)
        at java.base/java.security.AccessController.doPrivileged(Native Method)
        at io.netty.util.internal.PlatformDependent0.<clinit>(PlatformDependent0.java:219)
        at io.netty.util.internal.PlatformDependent.isAndroid(PlatformDependent.java:273)
        at io.netty.util.internal.PlatformDependent.<clinit>(PlatformDependent.java:92) …
Run Code Online (Sandbox Code Playgroud)

java netty kotlin ktor

19
推荐指数
1
解决办法
3万
查看次数

Netty 4 - EventLoopGroup - EventLoop - EventExecutor - 线程关联

我正在研究Netty 4.0.0.Alpha5代码,以了解如何处理线程.我还在http://netty.io/wiki/new-and-noteworthy-in-4.0.html#wiki-h2-34上阅读了Netty 4新线程模型的介绍.

据我了解,目标是:

  • 线程关联,将Channel粘贴到单个线程(EventLoop).我想这种方法是为了减少缓存未命中并改善NUMA硬件的情况.

所以,我想知道我的解释是否正确.如果我是对的,那么出现以下问题:

  • ChannelPipeline中可能长时间运行的ChannelHandler(例如数据库操作)可能会阻塞EventLoop(Thread),因此会阻止分配给同一EventLoop(Thread)的所有其他Channel.这种解释是真的吗?
  • 试图避免这样的问题,我可以使用的长期运行的ChannelHandler一个EventExecutor,但根据的文件(见上面的链接),一个通道被卡住其EventExectuor内的单个线程,因此可能再次阻止其分配相同的其他频道线程(在EventExecutor中).我错过了什么或这是真的吗?

我只是想了解为什么事情就是这样,并获得有关Netty 4设计意图的一些信息.

netty

18
推荐指数
1
解决办法
7114
查看次数

为什么在Netty中引入了本地epoll支持?

我相信Java的NIO库将在Linux机器上使用epoll.在Linux机器上使用Epoll而不是NIO有什么好处.

epoll nio netty

18
推荐指数
1
解决办法
7080
查看次数

与Netty相比,vert.x如何实现卓越的性能?

最近的TechEmpower性能基准测试已经在Netty上显示了vert.x,有时甚至是大量的.根据其网站,vert.x使用Netty作为"其大部分网络IO".如果是这样,与Netty相比,它如何实现卓越的性能?

(注意:这不是有争议的或者是火焰棒 - 我真的想知道计算机科学背后的性能差异.谢谢.)

performance netty vert.x

18
推荐指数
1
解决办法
7017
查看次数

使用TLS 1.2将客户端连接到TCP服务器

我正在努力将设备连接到.Net(4.5.2)服务器.它是由设备打开的TCP连接,使用TLS 1.2.

  • 在服务器端,我有一个TCP服务器的标准.Net实现:SslStream通过DotNetty包装
  • 我无法更改设备上的任何内容

任何.Net客户端都可以使用安全的TLS连接成功连接到我的服务器.它在使用CURL时也正常工作,所以我得出结论我的TCP服务器工作正常.

所以我比较了(使用Wireshark)工作客户端发送的内容与无法连接的设备发送的内容.我发现的显着差异是客户端Hello TLS消息中缺少(对于设备)服务器名称扩展(SNI).

我接下来尝试的是使用Pcap.Net手动将数据发送到我的服务器,即使用原始字节数组手动发送TCP SYN/TCP ACK /客户端Hello消息(我从尝试连接的设备获得的原始数据(感谢Wireshark)到我的服务器).我确认通过添加服务器名称扩展来调整不工作的客户端Hello原始字节数组会导致我的TLS握手工作.

所以很明显我遇到了一个问题,那就是不包含SNI扩展的客户端和一个拒绝握手的服务器,如果这个信息不存在的话.

如何更改TCP服务器接受不提供服务器名称扩展的客户端的行为方式?是否有可能首先使用标准的.Net SslStream类?

AFAIK,SNI扩展不是强制性的,由客户决定是否使用它,因此服务器理论上应该接受没有它的客户端Hello消息.

任何指针都将非常感激.

.net c# ssl tcp netty

18
推荐指数
1
解决办法
4128
查看次数

使用Netty的Servlet API实现

有没有人在Netty之上构建了一个Servlet API实现?我很想建立自己的,因为我不能谷歌实施.

基本上我想支持足够的球衣工作(希望球衣不做任何线程局部的东西).

java servlets nio netty

17
推荐指数
1
解决办法
1万
查看次数

如果JVM GC仍然存在,为什么我们需要手动处理Netty ByteBuf的引用计数?

根据这本书Netty in Action v10, reference counting是用来处理汇集的ByteBuf.但是JVM并不知道netty引用计数,所以JVM仍然可以GC ByteBuf.如果是这样,为什么我们仍然需要关心引用计数和手动调用release()方法?

我引用了<Netty in Action v10>中的一些来添加一些上下文.

引用计数的权衡之一是用户在使用消息时必须小心.虽然JVM仍然能够GC这样的消息(因为它不知道引用计数),但是这个消息不会被放回到之前可能获得它的池中.因此,如果您不仔细发布这些消息,那么在某一点上您将耗尽资源的可能性很大.

还有一些相关的线程: Netty 4中的缓冲区所有权:缓冲区生命周期是如何管理的?

https://blog.twitter.com/2013/netty-4-at-twitter-reduced-gc-overhead

添加1

(以下是我的理解.)

A ByteBuf可以从2个角度分类:

1. Pooled or Unpooled
2. Heap-based or Direct
Run Code Online (Sandbox Code Playgroud)

所以可以有4种组合:

(a) Pooled Heap-based
(b) Pooled Direct
(c) Unpooled Heap-based
(d) Unpooled Direct
Run Code Online (Sandbox Code Playgroud)

只有(a)和(c)受JVM GC机制的影响,因为它们是基于堆的.

在<Netty in Action v10>的上述引文中,我认为该消息意味着一个Java对象,它位于(a)类别中.

一个最终的规则是,如果一个Java对象是GCed,它就完全消失了.以下是我认为Netty的作用:

  • 对于(a),Netty分配器必须诱使JVM GC相信该对象永远不应该被GC.然后使用ref count将对象移出/移回池中.这是生命周期的另一种形式.

  • 对于(b),不涉及JVM GC,因为它不是基于JVM堆的.并且Netty分配器需要使用ref计数来将对象移出/返回池中.

  • 对于(c),JVM GC负责控制对象的生命.Netty allocator只提供分配对象的API.

  • 对于(d),不涉及JVM GC.并且不需要汇集.所以Netty allocator只需要提供API来分配/释放对象.

netty

17
推荐指数
1
解决办法
5193
查看次数

PlayFramework 2.4.6错误413请求实体太大

我正在使用PlayFramework 2.4.6,尝试上传多部分文件(大小为18M),服务器返回以下错误:

For request 'POST /api/myEndpoint' [Request Entity Too Large]
Run Code Online (Sandbox Code Playgroud)

我环顾四周,尝试了下面的成功:

  1. play.http.parser.maxMemoryBuffer = 2000000K
  2. parsers.MultipartFormData.maxLength = 1024000K
  3. play.http.parser.maxDiskBuffer = 2000000K
  4. Action.async(parse.anyContent(有些(1024*200L)))

而且他们都没有解决问题.

这是Stacktrace:

14:57:33.128 [New I/O worker #2] [error] -     p.c.server.netty.RequestBodyHandler - Exception caught in RequestBodyHandler
java.nio.channels.ClosedChannelException: null
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.setInterestOps(AbstractNioWorker.java:506) [netty-3.10.4.Final.jar:na]
at org.jboss.netty.channel.socket.nio.AbstractNioWorker$1.run(AbstractNioWorker.java:455) [netty-3.10.4.Final.jar:na]
at org.jboss.netty.channel.socket.ChannelRunnableWrapper.run(ChannelRunnableWrapper.java:40) [netty-3.10.4.Final.jar:na]
at org.jboss.netty.channel.socket.nio.AbstractNioSelector.processTaskQueue(AbstractNioSelector.java:391) [netty-3.10.4.Final.jar:na]
at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:315) [netty-3.10.4.Final.jar:na]
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:89) [netty-3.10.4.Final.jar:na]
at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178) [netty-3.10.4.Final.jar:na]
at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108) [netty-3.10.4.Final.jar:na]
at org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42) [netty-3.10.4.Final.jar:na]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_65]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_65]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_65]
Run Code Online (Sandbox Code Playgroud)

multipartform-data netty playframework playframework-2.4

17
推荐指数
3
解决办法
7895
查看次数

在netty通道上设置套接字超时

我有一个netty频道,我想在底层套接字上设置一个超时(它默认设置为0).

超时的目的是,如果15分钟内没有发生任何事情,将关闭未使用的频道.

虽然我没有看到任何配置这样做,并且套接字本身也对我隐藏.

谢谢

netty

16
推荐指数
1
解决办法
2万
查看次数

以编程方式关闭netty

我正在使用netty 4.0.24.Final.

我需要以编程方式启动/停止netty服务器.
启动服务器时,线程被阻止

f.channel().closeFuture().sync()

请帮助提供一些提示如何正确执行此操作.下面是Main类调用的EchoServer.谢谢.

package nettytests;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;

public class EchoServer {

    private final int PORT = 8007;
    private EventLoopGroup bossGroup;
    private EventLoopGroup workerGroup;

    public void start() throws Exception {
        // Configure the server.
        bossGroup = new NioEventLoopGroup(1);
        workerGroup = new NioEventLoopGroup(1);
        try {
            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup)
             .channel(NioServerSocketChannel.class)
             .option(ChannelOption.SO_BACKLOG, 100)
             .handler(new LoggingHandler(LogLevel.INFO))
             .childHandler(new ChannelInitializer<SocketChannel>() {
                 @Override …
Run Code Online (Sandbox Code Playgroud)

java shutdown netty server

16
推荐指数
1
解决办法
1万
查看次数