Tag: 异步

使用Spring Cache Abstraction的异步缓存更新

使用Spring的缓存抽象,如何在仍然返回旧条目的同时异步刷新条目? 我正在尝试使用Spring的缓存抽象来创建一个缓存系统,在相对较短的“软”超时后,缓存条目可以进行刷新。 然后,在查询它们时,返回缓存的值,并启动异步更新操作以刷新条目。 我也会 Guava的缓存构建器允许我指定缓存中的条目应在一定时间后刷新。 然后可以使用异步实现覆盖缓存加载器的reload()方法,允许返回过时的缓存值,直到检索到新的缓存值。 但是,spring缓存似乎不使用底层Guava缓存的CacheLoader 是否可以使用Spring的缓存抽象来进行这种异步缓存刷新? 编辑澄清:使用Guava的CacheBuilder,我可以使用refreshAfterWrite()来获取我想要的行为。 例如来自Guava Caches解释 : LoadingCache graphs = CacheBuilder.newBuilder() .maximumSize(1000) .refreshAfterWrite(1, TimeUnit.MINUTES) .build( new CacheLoader() { public Graph load(Key key) { // no checked exception return getGraphFromDatabase(key); } public ListenableFuture reload(final Key key, Graph prevGraph) { if (neverNeedsRefresh(key)) { return Futures.immediateFuture(prevGraph); } else { // asynchronous! ListenableFutureTask task […]

异步迭代器

我有以下代码: while(slowIterator.hasNext()) { performLengthTask(slowIterator.next()); } 因为迭代器和任务都很慢,所以将它们放入单独的线程中是有意义的。 以下是Iterator包装器的快速而脏的尝试: class AsyncIterator implements Iterator { private final BlockingQueue queue = new ArrayBlockingQueue(100); private AsyncIterator(final Iterator delegate) { new Thread() { @Override public void run() { while(delegate.hasNext()) { queue.put(delegate.next()); // try/catch removed for brevity } } }.start(); } @Override public boolean hasNext() { return true; } @Override public T […]

Java:高性能消息传递(单生产者/单一消费者)

我最初在这里问过这个问题,但我意识到我的问题不是关于一个真正的循环。 我想知道的是,在Java中进行高性能异步消息传递的正确方法是什么? 我想做什么…… 我有大约10,000名消费者,每个消费者都从他们的私人队列中消费消息。 我有一个线程一个接一个地生成消息并将它们放在正确的消费者队列中。 每个使用者无限循环,检查消息是否出现在队列中并进行处理。 我认为这个术语是“单一生产者/单一消费者”,因为有一个生产者,每个消费者只能在他们的私人队列上工作(多个消费者永远不会从同一个队列中读取)。 在Consumer.java里面: @Override public void run() { while (true) { Message msg = messageQueue.poll(); if (msg != null) { … // do something with the message } } } Producer正在快速地将消息放入消费者消息队列中(每秒数百万条消息)。 消费者应该尽快处理这些消息! 注意: while (true) { … }由Producer作为最后一条消息发送的KILL消息终止。 但是,我的问题是关于设计此消息传递的正确方法。 我应该为messageQueue使用什么样的队列? 应该是同步还是异步? 如何设计消息? 我应该使用while-true循环吗? 消费者应该是一个线程,还是其他什么? 10,000个线程会慢慢爬行吗? 什么是线程的替代品? 那么, 在Java中进行高性能消息传递的正确方法是什么?

Spring Async Uncaught Exception处理程序

@Override @Async public void asyncExceptionTest() { int i=1/0; } 如何使用Spring Async框架进行日志记录,而不必在每个异步方法中放置try catch? 它似乎没有像普通的那样传递给DefaultUncaughtExceptionHandler 。

如何在Spring中检查@Async调用是否已完成?

我使用@Async注释执行rsync命令的方法。 一次有十个线程调用此方法。 我的要求是在所有十个线程完成rsync命令执行之后,只有我剩下的代码应该执行但是没有得到如何检查我的所有十个线程是否完全执行了@Async方法? 所以请告诉我一个方法来检查它

Java中的非阻塞(异步)DNS解析

是否有一种干净的方法以非阻塞的方式异步解析Java中的DNS查询(通过主机名获取IP)(即状态机,而不是1个查询= 1个线程 – 我想同时运行数万个查询,但是没有运行成千上万的线程)? 到目前为止我发现了什么: 标准InetAddress.getByName()实现是阻塞的,看起来像标准Java库缺少任何非阻塞实现。 在批量问题中解决DNS讨论了类似的问题,但找到的唯一解决方案是multithreading方法(即一个线程在每个给定时刻只处理1个查询),这不是真正可扩展的。 dnsjava库也只是阻止。 dnsjava有一些古老的非阻塞扩展,可以追溯到2006年,因此缺少任何现代Java并发内容,例如Future范例使用,以及非常有限的仅队列实现。 dnsjnio项目也是dnsjava的扩展,但它也适用于线程模型(即1个查询= 1个线程)。 asyncorg似乎是我迄今为止针对此问题找到的最佳解决方案,但是: 它也是从2007年开始,看起来已经废弃了 几乎没有任何文档/ javadoc 使用许多非标准技术,如Fun类 我错过了任何其他想法/实施? 澄清 。 我有一个相当大(每天几TB)的日志量。 每个日志行都有一个主机名,可以来自互联网上的任何地方,我需要一个IP地址作为我的进一步统计计算的主机名。 行的顺序并不重要,所以,基本上,我的想法是开始2个线程:首先迭代线: 读一行,解析它,获取主机名 发送查询到DNS服务器以解析给定的主机名,不要阻止回答 将行和DNS查询套接字句柄存储在内存中的某个缓冲区中 转到下一行 第二个线程将: 等待DNS服务器回答任何查询(使用epoll / kqueue技术) 阅读答案,找到缓冲区中的哪一行 将已解析IP的行写入输出 继续等待下一个答案 Perl中使用AnyEvent简单模型实现向我展示了我的想法通常是正确的,我可以通过这种方式轻松实现每秒15-20K查询的速度(天真的阻塞实现每秒2-3次查询 – 只是为了比较 -这就像4个数量级的差异)。 现在我需要在Java中实现相同的 – 我想跳过我自己的DNS实现;)

long polling netty nio framework java

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

GWT – 在加载文件之前进行简单加载屏幕的最简单方法

单击按钮时,我的GWT应用程序返回嵌入在HTML页面中的PDF文件,如下所示: 问题是服务器创建这个PDF文件可能需要一段时间,所以我想要的是一个带有加载动画的等待屏幕,可以在后台下载PDF文件,然后在文件完成后显示页面如上所述。 一种显而易见的方法是显示加载页面,向服务器发送异步命令,然后一旦调用onSucceed方法,就像正常一样调用页面。 下行是我必须添加一些服务器端逻辑,以使PDF创建在后台工作… 有没有办法用GWT API做客户端?

Jedis和生菜异步能力

我正在使用redis与Akka,所以我不需要阻止调用。 生菜具有内置的异步未来调用。 但是Jedis是Redis的推荐客户。 如果我以正确的方式使用它们,有人可以告诉我。 如果是这样哪一个更好。 JEDIS我使用静态Jedis连接池来获取con并使用Akka将来的回调来处理结果。 我关心的是当我使用另一个线程(可调用)来获得线程最终将阻塞结果的结果时。 虽然生菜可能有一些更有效的方法来做到这一点。 private final class OnSuccessExtension extends OnSuccess { private final ActorRef senderActorRef; private final Object message; @Override public void onSuccess(String valueRedis) throws Throwable { log.info(getContext().dispatcher().toString()); senderActorRef.tell((String) message, ActorRef.noSender()); } public OnSuccessExtension(ActorRef senderActorRef,Object message) { this.senderActorRef = senderActorRef; this.message=message; } } ActorRef senderActorRef = getSender(); //never close over a […]

使用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 […]