Tag: nio

long polling netty nio framework java

如何使用netty框架进行长轮询? 比方说,我获取http://localhost/waitforx 但waitforx是异步的,因为它必须等待事件? 比方说,它从阻塞队列中获取内容(只能在队列中的数据时获取)。 从队列中获取项目时,我想将数据发送回客户端。 希望有人可以给我一些提示如何做到这一点。 非常感谢

如何使用Java NIO有效地从套接字读取

我正在处理涉及从套接字交易报价中读取的任务,我需要实现最小延迟和高吞吐量。 我开始使用像这样最简单的java nio原型 ByteBuffer buf = ByteBuffer.allocateDirect(BUFFER_SIZE); try { buf.clear(); int numBytesRead = socketChannel.read(buf); if (numBytesRead == -1) { socketChannel.close(); } else { buf.flip(); byte[] byteArrived = new byte[buf.remaining]; buf.get(byteArrived,0,byteArrived.length); // here we send byteArrived to the parser } } catch (IOException e) { } 我想每次创建byte []数组都很蹩脚,但由于缺乏知识,我不知道如何解析ByteBuffer(因为我需要将字节协议解组成消息并将它们传递给业务逻辑)。 你能推荐一下如何避免大规模垃圾的产生吗? 另外,我想问一下如何组织低延迟和高吞吐量的套接字读取的最佳实践? 我读到了LMAX和disruptor框架,他们在单线程上实现了6M事务。

在Tomcat中托管Netty Server是否可行/可取?

我们构建基于Netty / NIO的服务,我正在考虑将此服务部署到我们的生产环境中。 我们标准的部署服务的方式是作为WAR,部署在Tomcats中。 当我在这里建议采用相同的方法时,我得到了“不应该做”的呐喊和抱怨,因为Netty和Tomcat都是服务器,“将一台服务器托管在另一台服务器上是没有意义的”。 对我而言,它非常有意义,因为它完全解决了我的部署问题,并使我免于编写其他代码。 为什么这么大“不不”?

如何处理一个非常大的文本文件?

我正在写一些需要处理非常大的文本文件的东西(至少有几个GiB)。 这里需要什么(这是固定的)是: 基于CSV,遵循RFC 4180,但嵌入式换行符除外 对线路的随机读取访问,尽管大多数是逐行和接近结束 最后添加行 (换行)。 显然,要求重写文件的其余部分,这也很少见,所以目前不是特别重要 文件的大小禁止将其完全保留在内存中(这也是不可取的,因为在附加更改时应尽快保留)。 我曾想过使用内存映射区域作为文件的窗口,如果请求超出其范围的行,它将被移动。 当然,在那个阶段我仍然没有字节级别以上的抽象。 为了实际使用内容我有一个CharsetDecoder给我一个CharBuffer 。 现在问题是,我可以在CharBuffer处理文本行,但我还需要知道文件中该行的字节偏移量(以保持行索引和偏移的缓存,所以我没有再次从头开始扫描文件以查找特定行)。 有没有办法将CharBuffer中的偏移量映射到匹配的ByteBuffer中的偏移量? 使用ASCII或ISO-8859- *显然是微不足道的,对于UTF-8和ISO 2022或BOCU-1来说,事情会变得非常丑陋(不是我实际上期望后两种,但UTF-8应该是默认值) – 并且仍然存在问题)。 我想我可以再次将CharBuffer的一部分转换为字节并使用长度。 无论是工作还是我遇到变音符号的问题,在这种情况下,我可能会强制要求使用NFC或NFD来确保文本始终是明确编码的。 不过,我想知道这是不是要走到这里的路。 有更好的选择吗? ETA:有人回答常见问题和建议: 这是用于模拟运行的数据存储,旨在成为完整数据库的小型本地替代方案。 我们也有数据库后端并且它们被使用,但是对于它们不可用或不适用的情况,我们确实需要这样做。 我也只支持CSV的一个子集(没有嵌入式换行符),但现在还可以。 这里有问题的几点是我无法预测线条的长度,因此需要创建文件的粗略地图。 至于我上面概述的内容:我正在思考的问题是我可以很容易地确定字符级别上的一行(U + 000D + U + 000A),但我不想假设这看起来像0A 0D字节级别上的0A 0D (例如,UTF-16已经失败,其中它是0D 00 0A 00或00 0D 00 0A )。 我的想法是,我可以通过不硬编码我当前使用的编码细节来使字符编码变得可变。 但我想我可以坚持使用UTF-8并将其他所有东西都加入其中。 不过,不知怎的,感觉不对劲。

为什么WatchService会产生如此多的操作?

import java.io.*; import java.nio.file.*; public class Tmp { public static void main(String [] args) throws IOException { int count = 0; Path path = Paths.get(“C:\\tmp\\”); WatchService ws = null; try { ws = FileSystems.getDefault().newWatchService(); path.register(ws, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.OVERFLOW); } catch (IOException ioe) { ioe.printStackTrace(); } while(true) { WatchKey key = null; try { key […]

目录正在查看java中的更改

我正在使用WatchService来监视目录中的更改,特别是在目录中创建新文件。 以下是我的代码 – package watcher; import java.nio.file.*; import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE; import static java.nio.file.StandardWatchEventKinds.OVERFLOW; import java.io.*; public class Watch { public static void main(String[] args) throws IOException { Path dir = Paths.get(“c:\\mk\\”); WatchService service = FileSystems.getDefault().newWatchService(); WatchKey key = dir.register(service, ENTRY_CREATE); System.out.println(“Watching directory: “+dir.toString()); for(;;){ WatchKey key1; try { key1 = service.take(); } catch (InterruptedException x) […]

非阻塞UDP I / O与阻止Java中的UDP I / O.

NIO中的非阻塞TCP / IP SocketChannel和Selector帮助我处理许multithreading数量少的TCP / IP连接。 但UDP DatagramChannels怎么样? (我必须承认我对UDP不是很熟悉。) 即使DatagramChannel未在阻塞模式下运行,UDP发送操作似乎也不会阻塞。 是否存在DatagramSocket.send(DatagramPacket)因拥塞或类似情况而阻塞的情况? 如果存在这样的情况以及生产环境中可能出现的情况,我真的很好奇。 如果DatagramSocket.send(DatagramPacket)实际上没有阻塞,并且我不打算使用连接的DatagramSocket并仅绑定到一个端口,那么使用非阻塞模式与DatagramChannel和Selector没有任何优势吗?

Java:对巨大磁盘文件进行随机读取的最快方法

我有一个中等大小的数据集,大约800 MB左右,这基本上是一些大的预计算表,我需要将一些计算速度提高几个数量级(创建该文件需要几个mutlicores计算机天来使用优化生成和multithreading算法……我真的需要那个文件)。 现在已经计算了一次,那么800MB的数据是只读的。 我无法忍受它在记忆中。 截至目前,它是一个巨大的800MB文件,但如果可以提供帮助,拆分成较小的文件不是问题。 我需要在该文件中读取大约32位数据的大量时间。 我不知道在哪里我需要读取这些数据:读取是均匀分布的。 在这样的文件或文件中随机读取Java的最快方法是什么? 理想情况下,我应该从几个不相关的线程中进行这些读取(但如果需要,我可以在单个线程中对读取进行排队)。 Java NIO是可行的吗? 我不熟悉’内存映射文件’:我想我不想在内存中映射800 MB。 我想要的是我可以访问这些800MB基于磁盘的数据的最快随机读取。 顺便说一下,如果人们想知道这与我不久前提出的问题完全不同: Java:基于磁盘的快速哈希集

使用Netty的异步HTTP客户端

我是netty的新手,仍然喜欢找我的路。 我正在寻找创建一个异步工作的http客户端。 http的netty示例仅显示如何等待IO操作,而不是如何使用addListener ,因此我一直试图在过去几天解决这个问题。 我正在尝试创建一个请求类,它将处理请求的所有不同状态,包括连接,发送数据,处理响应,然后关闭连接。 为了做到这一点,我的类扩展了SimpleChannelUpstreamHandler并实现了ChannelFutureListener 。 我使用ChannelPipelineFactory将类(作为SimpleChannelUpstreamHandler )的(this)实例作为处理程序添加到管道。 连接创建如下: this.state = State.Connecting; this.clientBootstrap.connect(this.address).addListener(this); 然后是operationComplete方法: @Override public void operationComplete(ChannelFuture future) throws Exception { State oldState = this.state; if (!future.isSuccess()) { this.status = Status.Failed; future.getChannel().disconnect().addListener(this); } else if (future.isCancelled()) { this.status = Status.Canceled; future.getChannel().disconnect().addListener(this); } else switch (this.state) { case Connecting: this.state = State.Sending; Channel channel […]

如何使用FileChannels transferFrom()方法监控进度(JProgressBar)?

我需要一些JProgressBar组件的帮助。 我的程序使用java.nio FileChannels将文件从一个地方复制到另一个地方。 实际的复制方法是transferFrom() 。 我现在有两个问题。 如何监控FileChannel的传输进度? 我发现的所有教程都使用传统的java.io InputStreams,并在循环输入流时增加进度int。 我的复制方法(FileChannel方法)封装在一个单独的方法中,该方法由其他方法调用,这些方法迭代源文件夹和目标文件夹,然后为每个文件调用FileChannel方法。 如何为完整的复制机制实现ProgressBar? 好吧,我应该早一点阅读常见问题解答,所以我想我必须编辑我的初始post,而不是评论答案,对吧? 好的,这就是我到目前为止所做的。 正如jambjo建议的那样(感谢顺便说一句), transferFrom()方法现在已经循环。 BTW:是否有一个更好的块大小,或者它取决于我的进度条的粒度,就像EJP所说的那样? 这是我的代码片段: while (position < size) { position += destination.transferFrom(source, position, chunkSize); current = (position/size)*100; System.out.println(current); } 不幸的是,’当前’值在循环内保持为0,我不知道为什么。 我错过了什么吗? 再次感谢jambjo ! 我非常感谢你的投入! 现在单个文件的进度监控工作,让我们解决我的第二个问题。 我不想,我不仅要监控一个文件的进度,而是监视一堆文件的进度。 我的主要复制方法遍历各种目录并通过调用实际的传输方法复制适当的文件。 因此复制方法不传输文件,它们只是选择实际传输方法的文件。