我对ES6 Promise API中的某些东西感到困惑.我可以看到一个明确的用例,用于同时提交多个异步作业,并"解决"第一次成功.例如,这将服务于多个等效服务器可用的情况,但有些可能已关闭,而其他服务器负载较重且速度较慢,因此我的目标是从第一个服务器获得响应成功,并忽略其余服务器(是的,我知道这对于客户端从服务器的角度来看是一种令人讨厌的方式,但它对最终用户来说非常好;)
但是,据我所知,我有"全部"或"种族"行为."所有"行为似乎要等到所有请求都完成,这意味着我必须等待最慢,即使服务器已经完成(实际上,我可能要等待超时,这将是一场灾难对于这种情况.)然而,"种族"行为似乎让我第一次完成,如果这恰好是失败,也是一场灾难.
API中是否存在允许"raceToSuccess"行为的内容,或者我是否需要手动构建它.就此而言,我将如何手工制作它?
作为旁注,我在Java 8 CompletableFuture中发现了同样的难题,它似乎是一个紧密并行的API.那么,我在哲学层面上错过了一些东西吗?
我很抱歉这肯定是基本的maven/war插件,但我完全不是一个maven用户.我只需将这一件事破解成一个基于maven的项目.
我需要做的是将(基本上是任意的)目录和文件复制到我的战争的根目录中.当战争部署时,我需要它们作为可用资源出现在HTTP上.
我不能简单地将它们放在源树中的"正确位置".这是因为有问题的文件实际上是我项目的源文件.我意识到这有点奇怪,但这是一个文档项目,我需要在同一场战争中显示源和效果.
因此,在一般情况下,我如何配置maven war插件将给定目录及其内容复制到我的战争根源?(顺便说一句,我试图弄清楚这个工具的文档,但它似乎是基于对maven的这么多理解,以至于在没有先学习maven的情况下感觉我永远不会理解它,而且我也有点过分了迫切需要时间去做!)
很多TIA托比.
在介绍 JPMS 服务时,Java 语言规范的 7.7.4 节指出“服务类型必须是类类型、接口类型或注释类型”。
我正在努力理解允许注释的意义。我的理解是服务的 JPMS 概念是我们期望在运行时选择实现的东西。看起来,为了有用,实现至少需要有可能是不同于标识所请求服务的原始类的东西。但我相信注释不能使用“扩展”,所以这永远不会发生?从那以后,我相信如果我尝试使用注释类型创建服务,我将不可避免地遇到这样一种情况,即服务查找可能返回的唯一内容,例如 SomeAnnotation。类将完全是 SomeAnnotation。这似乎毫无意义,所以我必须假设我错过了一些东西。
任何人都可以阐明这一点,也许可以提供注释如何成为“服务”的示例?
我一直在试验Java 9/10孵化器中的HttpClient东西,并且有以下简单的代码(几乎从项目主页上被盗!):
URI uri = URI.create("http://192.168.1.102:8080/");
HttpRequest getRequest = HttpRequest.newBuilder()
.uri(uri)
.GET()
.build();
HttpResponse<String> response = client.send(getRequest,
HttpResponse.BodyHandler.asString());
System.out.println("response to get: " + response.body());
Run Code Online (Sandbox Code Playgroud)
如果它指向不是localhost的URL,我发现它工作正常,但如果我要求localhost(无论是名称为"localhost",172.0.0.1,还是本地主机的实际IP地址),它都会失败.错误很奇怪,整个堆栈跟踪都没有提到我的任何代码.
WARNING: Using incubator modules: jdk.incubator.httpclient
Exception in thread "main" java.io.EOFException: EOF reached while reading
at jdk.incubator.httpclient/jdk.incubator.http.Http1AsyncReceiver$Http1TubeSubscriber.onComplete(Http1AsyncReceiver.java:507)
at jdk.incubator.httpclient/jdk.incubator.http.SocketTube$InternalReadPublisher$ReadSubscription.signalCompletion(SocketTube.java:551)
at jdk.incubator.httpclient/jdk.incubator.http.SocketTube$InternalReadPublisher$InternalReadSubscription.read(SocketTube.java:728)
at jdk.incubator.httpclient/jdk.incubator.http.SocketTube$SocketFlowTask.run(SocketTube.java:171)
at jdk.incubator.httpclient/jdk.incubator.http.internal.common.SequentialScheduler$SchedulableTask.run(SequentialScheduler.java:198)
at jdk.incubator.httpclient/jdk.incubator.http.internal.common.SequentialScheduler.runOrSchedule(SequentialScheduler.java:271)
at jdk.incubator.httpclient/jdk.incubator.http.internal.common.SequentialScheduler.runOrSchedule(SequentialScheduler.java:224)
at jdk.incubator.httpclient/jdk.incubator.http.SocketTube$InternalReadPublisher$InternalReadSubscription.signalReadable(SocketTube.java:675)
at jdk.incubator.httpclient/jdk.incubator.http.SocketTube$InternalReadPublisher$ReadEvent.signalEvent(SocketTube.java:829)
at jdk.incubator.httpclient/jdk.incubator.http.SocketTube$SocketFlowEvent.handle(SocketTube.java:243)
at jdk.incubator.httpclient/jdk.incubator.http.HttpClientImpl$SelectorManager.handleEvent(HttpClientImpl.java:769)
at jdk.incubator.httpclient/jdk.incubator.http.HttpClientImpl$SelectorManager.run(HttpClientImpl.java:731)
Run Code Online (Sandbox Code Playgroud)
有一个本地运行的服务器,我可以使用Web浏览器的简单请求连接到它.
有什么想法吗?
[编辑]我发现,我相信,这个项目的邮件列表.它被"混淆了"(它完全欺骗了我!)但显示为:net dash dev at openjdk dot java dot net我也会在那里发布,看看他们是否有任何输入.
[编辑2]我很确定这与localhost(每个原始标题)无关,但是与node.js/express协议协商(这是我正在使用的服务器因为它很容易实验) ).偶尔节点(例如,使用非LF终止的最后一行文本)似乎报告错误的内容长度,但这不是问题,因为失败仍然以正确的长度发生.我认为这可能是尝试将连接升级到HTTP/2.0的一个错误,但还不知道......
[编辑3]在浪费了太多的生命实验之后,我很确定node.js 8.11.1(以及表达4.13.4和body-parser …
我不禁感到必须在某个地方回答这个问题,但如果我能找到它,我就知道了.部分问题可能是客户方面有太多的讨论让我看到树木.
无论如何,除了道歉,这就是我想要做的.我需要一个独立于平台的WebSockets服务器端实现.我希望它能在NodeJS中运行.
现在,我在这个主题上找到的99%的内容都谈到了socket.io.但据我所知,这不是WebSockets,它本身就是一种特殊的"额外"协议.我需要"通过(尚未)标准"的作品.有一个很好的理由,它是不可协商的,相信我,让我们只是节省带宽:)
所以,我尝试了WebSocket,但这需要(或似乎需要python,更糟糕的是,Visual Studio)才能在Windows上运行.我需要一些独立于平台的东西,不需要像这样的特殊东西.
我也尝试过node-websocket-server,但我根本无法工作.主页上的示例对我失败.它似乎接受了一个连接,但客户端没有看到它,双方都没有发送任何东西,客户端立即看到连接已关闭.实际上,我所得到的只是一个"连接"回调,然后它似乎就死了.在调试模式下运行并没有告诉我任何有用的东西,除了一些关于某个对象或其他没有flush()方法的内部错误.我怀疑这是一个已经不复存在的项目?
所以,我没有想法.是否有可能说服socket.io纯粹由WebSockets的(非)规范工作?有没有办法让node-websocket-server表现得我找不到.是否有一种方法可以绕过websocket中的Visual Studio依赖项,还是有一些其他基于NodeJS的工具可以满足我的所有要求?
哦,另外一件事,我希望这个工具与"连接"和平共存,因为我正在使用它来处理常规文档.
TIA,托比
我有一个常见的Streams API问题,我想"有效地"解决.假设我有一个(可能非常大,可能是无限的)流.我想以某种方式预处理它,例如,过滤掉一些项目,并改变一些项目.让我们假设这个预处理是复杂的,时间和计算密集的,所以我不想做两次.
接下来,我想对项目序列执行两组不同的操作,并使用不同的流类型构造处理每个不同序列的远端.对于无限的流,这将是一个forEach,对于有限的一个,它可能是一个收集器或其他什么.
显然,我可能会将中间结果收集到一个列表中,然后从该列表中拖出两个单独的流,分别处理每个流.这对于有限的流来说是有效的,尽管a)它看起来"丑陋"而且b)对于非常大的流来说它可能是不切实际的,而对于无限流来说它是不可行的.
我想我可以用偷看作为一种"发球".然后,我可以对peek下游的结果执行一个处理链,并以某种方式强制消费者查看"其他"工作,但现在第二条路径不再是流.
我发现我可以创建一个BlockingQueue,使用peek将东西推入该队列,然后从队列中获取一个流.这似乎是一个好主意,实际上工作得很好,虽然我无法理解流是如何关闭的(它实际上是这样,但我看不出如何).这是示例代码:
List<Student> ls = Arrays.asList(
new Student("Fred", 2.3F)
// more students (and Student definition) elided ...
);
BlockingQueue<Student> pipe = new LinkedBlockingQueue<>();
ls.stream()
.peek(s -> {
try {
pipe.put(s);
} catch (InterruptedException ioe) {
ioe.printStackTrace();
}
})
.forEach(System.out::println);
new Thread(
new Runnable() {
public void run() {
Map<String, Double> map =
pipe.stream()
.collect(Collectors.groupingBy(s->s.getName(),
Collectors.averagingDouble(s->s.getGpa())));
map.forEach(
(k,v)->
System.out.println(
"Students called " + k
+ " average " + v));
}
}).start();
Run Code Online (Sandbox Code Playgroud)
所以,第一个问题是:有没有"更好"的方法来做到这一点?
第二个问题,BlockingQueue上的流如何关闭?
干杯,托比
我希望页面中有一个区域保留用于上下文相关的帮助文本。除非将鼠标悬停在某些特定元素上,否则它是空白的。但是,当然,可以从几个独立的文本片段中选择可见的选择。这是在页面流中,下面还有更多内容。我尝试使用“定位”的 div,并将帮助 div 放入其中。每个帮助 div 都是position:absolute; 顶部:0px;可见性:隐藏;JS 的目的是让其中一个每次可见,但空间会保留给任何帮助 div 中最大的文本。好吧,正如大多数人所猜测的那样,因为帮助 div 是绝对位置的,所以它们的高度不会影响封闭 div 的高度,最终高度为零。
我怎样才能做到这一点?我不想使用像素大小来强制高度,因为在某些浏览器/字体组合上它几乎总是错误的,并且每次更改帮助文本或获得新的、更长的帮助片段时都需要不断调整添加到此。
我有道理吗,还是我需要尝试画图?
java ×2
css ×1
ecmascript-6 ×1
es6-promise ×1
httpclient ×1
java-10 ×1
java-8 ×1
java-9 ×1
java-module ×1
java-stream ×1
maven ×1
node.js ×1
socket.io ×1
websocket ×1