我刚开始玩弄服务器事件,我遇到了一条我想了解的 chrome 错误消息。我在网上搜索得很快,但没有找到解释,所以我想我可能做错了什么。
在服务器端,我有一个简单的 servlet,它接受请求并创建一个虚拟事件创建者任务:
private Executor executor = Executors.newSingleThreadExecutor();
public void doGet(final HttpServletRequest request, final HttpServletResponse response)
{
final AsyncContext asynCtx = request.startAsync(request, response);
response.setHeader("Cache-Control", "no-cache");
response.setContentType("text/event-stream");
response.setCharacterEncoding("utf-8");
executor.execute(() -> {
boolean run = true;
try
{
while (run)
{
final ServletResponse resp = asynCtx.getResponse();
run = resp != null;
if (resp != null)
{
System.out.println("pushing a server event.");
final PrintWriter writer = asynCtx.getResponse().getWriter();
writer.println("data: {time: " + System.currentTimeMillis() + "}\n");
writer.flush();
}
else
{
System.out.println("stopping beeper, no response object available anymore.");
break; // do not run anymore, we got no response
}
Thread.sleep(2000);
}
}
catch (final Exception e)
{
e.printStackTrace();
}
});
}
在客户端我只是:
$(document).ready(function ()
{
var source = new EventSource("/events");
source.onmessage = function (event)
{
console.log("received event: " + JSON.stringify(event));
document.getElementById("eventContainer").innerHTML += event.data + "<br/>";
};
console.log("start to receive events...")
});
当我加载 HTML 文件时它工作正常,事件被接收并写入控制台。但是30 秒后我收到一条错误消息:
GET [HttpOfLocalhost]/events net::ERR_INCOMPLETE_CHUNKED_ENCODING
为什么?
请求会被终止并立即启动一个新请求,因此它不会终止应用程序,但控制台上的错误消息并不好。
我的开发者控制台截图:
请求/响应详细信息:
计时,这表明它总是在 30 秒后发生:
谢谢!
最佳答案
好吧,所以我不能站着不动,仔细看看发生了什么。
AsyncContext对象有一个 setTimeout(...)方法。在我的 tomcat 版本(Tomcat 嵌入式 8)中,默认值设置为 30,000 毫秒(30 秒)。这正是我的 chrome 控制台出现 net::ERR_INCOMPLETE_CHUNKED_ENCODING 错误后的持续时间。
我检查使用:
System.out.println("Current Timeout is: " + asynCtx.getTimeout() + " ms");
显示:
Current Timeout is: 30000 ms
因此,为了避免 net:ERR 消息,有人可以将超时设置为 0。但是事件线程会一直运行下去(不幸的是)。 我使用的另一种解决方案是添加 AsyncListener到 AsyncContext并调用complete() onTimeout() 中的方法方法。
来自 complete() 方法的 API 文档:
Completes the asynchronous operation that was started on the request that was used to initialze this AsyncContext, closing the response that was used to initialize this AsyncContext. Any listeners of type AsyncListener that were registered with the ServletRequest for which this AsyncContext was created will be invoked at their onComplete method.
监听器的源代码:
asynCtx.addListener(new AsyncListener()
{
@Override
public void onComplete(AsyncEvent asyncEvent) throws IOException
{
System.out.println("onComplete(...)");
}
@Override
public void onTimeout(AsyncEvent asyncEvent) throws IOException
{
// this will close the request and the context gracefully
// and the net:ERR is gone.
asyncEvent.getAsyncContext().complete();
System.out.println("onTimeout(...)");
}
@Override
public void onError(AsyncEvent asyncEvent) throws IOException
{
System.out.println("onError(...)");
}
@Override
public void onStartAsync(AsyncEvent asyncEvent) throws IOException
{
System.out.println("onStart(...)");
}
});
所以是的,这是由于缺乏知识。我希望这对某人有帮助。
关于java - 使用 HTML5 服务器事件和 Java Servlet 时如何防止 net::ERR_INCOMPLETE_CHUNKED_ENCODING?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26863972/
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这
所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru
在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo
我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.
您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www