Grails 服务器发送事件

2023-12-26

我需要让服务器发送事件与 Grails 一起工作。我觉得我已经很接近了,但只是还不够。 JavaScript 请求成功到达控制器,但每次都会抛出错误。它每隔 2 秒左右重试一次(可能是由于错误)。

当服务器的会话计时器低于 5 分钟时,我需要向用户发送一个事件。我正在尝试使用 HTML5 的 EventSource,因为我只想向服务器发送一个请求(多个请求每次都会重置会话计时器)。根据精益Java工程 https://leanjavaengineering.wordpress.com/,HTML5满足了我的需求。

-JavaScript-

console.log("Starting eventSource");
var eventSource = new EventSource("SSETest/push");
console.log("Started eventSource");
eventSource.onmessage   = function(event) { console.log("Message received: " + event.data); };
eventSource.onopen      = function(event) { console.log("Open " + event); };
eventSource.onerror     = function(event) { console.log("Error " + event); };
console.log("eventState: " + eventSource.readyState);
// Stop trying after 10 seconds of errors
setTimeout(function() {eventSource.close();}, 10000);

-Grails 控制器-

package sessionManager
class SSETestController {
    def push = {
        println "$request made it!"
        response.setContentType("text/event-stream, charset=UTF-8")
        response << "data: the data"
        render "HI"
    }
}

-Grails 控制台-

org.apache.catalina.core.ApplicationHttpRequest@4f889fad made it!
org.apache.catalina.core.ApplicationHttpRequest@13f78b8c made it!
org.apache.catalina.core.ApplicationHttpRequest@4b50734c made it!
org.apache.catalina.core.ApplicationHttpRequest@4c4bde24 made it!

-JavaScript 控制台-

Starting eventSource
Started eventSource
eventState: 0
Open [object Event] 
Error [object Event] 
Open [object Event] 
Error [object Event]
Open [object Event] 
Error [object Event]
Open [object Event]
Error [object Event]

提前致谢, 克里斯·汉考克


在 Grails 控制器中,您需要更改为如下所示:

package sessionManager
class SSETestController {
    def push = {
        println "$request made it!"
        response.setContentType("text/event-stream, charset=UTF-8")
        //response << "data: the data\n\n"
        render "data: the data\n\n"
    }
}

在其基本形式中,响应应包含“data:”行,后跟您的消息,然后是两个“\n”字符以结束流:

data: My message\n\n

现在控制台中的响应是:

Starting eventSource
Started eventSource
eventState: 0
Open [object Event]
Message received: the data
Error [object Event]
Open [object Event]
Message received: the data
Error [object Event]
Open [object Event]
Message received: the data
Error [object Event]
Open [object Event]
Message received: the data
Error [object Event]

更详细的你可以看看http://www.html5rocks.com/en/tutorials/eventsource/basics/ http://www.html5rocks.com/en/tutorials/eventsource/basics/.

UPDATE

但为什么每次都会抛出错误呢?

错误可能有不同的原因,例如:网络超时。在我们的例子中,这是由于服务器和浏览器之间的连接关闭所致。

为什么它不断地 ping 服务器?

浏览器获取后关闭服务器与浏览器的连接the data。因此,浏览器会在每次连接关闭后大约 3 秒尝试重新连接。

我认为 HTML5 应该在 JavaScript 运行时连接一次 第一次,只要控制器发送就接收事件 他们。

它应该始终与服务器连接,但不会连接一次。
是的,只要控制器向事件发送消息,它就会接收事件。但在我们的例子中,服务器/控制器只是发送data: the data\n\n并且连接已关闭。
为了连续接收消息,您需要在控制器操作中有循环。例如 :

package sessionManager
class SSETestController {
    def push = {
        println "$request made it!"
        response.setContentType("text/event-stream, charset=UTF-8")
        for(int i = 0 ; i < 10 ; i++){
            render "data: the data\n\n"
            Thread.sleep(1000)
        }
        render "data: finished\n\n"
    }
}

您还可以使用while(true) loop.

如果您想了解更多onerror,你可以看到这个链接http://www.htmlgoodies.com/beyond/reference/receive-updates-from-the-server-using-the-eventsource.html http://www.htmlgoodies.com/beyond/reference/receive-updates-from-the-server-using-the-eventsource.html.
根据上面的链接,

有一个 onerror() 事件处理程序,但它没有你那么有用 可能会想。然而它可以告诉我们一些关于什么是 这要归功于 EventSource 的 readState 属性。为了 例如,EventSource.CONNECTING 的值表示连接 丢失并且 EventSource 正在尝试重新连接。如果有什么 如果出现非常错误的情况,EventSource.CLOSED 的值会让您知道。 除此之外,您无法获得太多信息,因为没有错误 查询对象。相反,传递的是事件对象本身 给处理程序。 EventSource 可以通过 eventSource 或 eventTarget 属性,因为两者都指向同一个对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Grails 服务器发送事件 的相关文章

  • 我可以通过什么方式混合 jQuery 和 vanilla JavaScript

    我有一个用普通 JavaScript 编写的 Web 应用程序 我想用 jQuery 动画来增强它 并使用我在各种 jQuery 插件中找到的一些功能 例如上传 http www uploadify com 可以通过什么方式将 jQuery
  • 在有限的上下文中运行 JS 代码

    我正在尝试奔跑trusted 隔离 上下文中的 JS 代码 基本上想出了这个方法 function limitedEval src context return function with this return eval src call
  • Javascript 对象属性名称

    在 C 中 可以将对象属性的名称作为字符串值获取 名称 对象 Property gt myProperty 这可以在 Javascript Typescript 中完成吗 Object Keys 是我找到的唯一东西 但它给了我所有的键 示例
  • Javascript 将对象推送为克隆

    我将 d3 用于交互式网络应用程序 我需要绑定的数据在交互过程中发生变化 并且由 JSON 变量中的一些选定对象组成 为此 我在 JSON 变量上使用了映射 并进行了一些查询来选择适当的对象 对象被推送到列表中 并且该列表被绑定为新数据 我
  • 判断字符串是否包含有效的javascript代码

    我正在寻找一个C 返回的函数true如果字符串包含有效的 JavaScript 语法 例如 IsValidJavascript alert hello 会回来true but IsValidJavascript alertXXhelloZ
  • 检测 Webkit/Chrome 中 HTML5 数字控件更改的事件?

    HTML5 为我们提供了一些新的输入元素 例如
  • 我可以在 GWT 中使用第三方 Javascript 库吗

    例如穆工具 用 js 编码对我来说很舒服 但显然不适合所有人 你当然可以 最好的事情就是给自己写一些好看的JavaScript 覆盖类型 http code google com webtoolkit doc latest DevGuide
  • 正则表达式中连字符的这种用法有效吗?

    NB I only想知道它是否是正则表达式定义中未转义连字符的有效应用 它是not关于匹配电子邮件 连字符或反斜杠的含义 量词或其他任何内容的问题 另外 请注意 链接的答案并没有真正讨论转义 未转义连字符之间的有效性问题 通常我会像这样声明
  • Firefox Addon 中的 JQuery 导致多个警告

    我在 Firefox 插件中使用 jquery 但我不断收到大量警告消息 如下所示 anonymous function does not always return a value System JS WARNING resource g
  • Angular2:动态同步http请求

    Goal 发出一系列同步 http 请求并能够将它们作为一个可观察流进行订阅 示例 不工作 let query arr test1 test2 test3 function make request query arr if query a
  • 如何在React中动态分配属性?

    这是一个有两个参数的函数 我要创建的标签的名称 具有以下属性的对象 Using React 我创建一个组件并将该元素渲染到 DOM 问题是我想向元素添加属性 但它不允许循环在元素内设置属性 var Element function elem
  • 从字节数组设置 img src

    我需要设置img src我在对象中拥有的字节数组的属性 img
  • node.js 模块/导出系统:是否可以将模块导出为函数

    我想在 Dispatch js 中做这样的事情 function handle msg exports handle 这在调用index js中 var dispatch require Dispatch dispatch data 有任何
  • Svelte 条件元素类报告为语法错误

    我正在做一个if块每if 块的精简指南 https svelte technology guide if blocks 这看起来很简单 但 Svelte 认为这是一个语法错误 svelte plugin ParseError Unexpec
  • 在反应中访问回调内的 event.target

    我有以下课程片段 constructor props super props this timeout null search e gt clearTimeout this timeout this timeout setTimeout f
  • Google 地图 API - 地图未显示 - 没有错误

    我正在尝试将地图从 Google API 加载到 div 中 但是 地图未加载 并且没有输出任何错误 这是代码 google maps var geocoder map function codeAddress address geocod
  • React Redux - 在辅助函数中访问现有存储

    我试图在反应组件之外获取存储实例 存储状态 即在单独的辅助函数中 我有我的减速器 我的动作 我在最上面的组件中创建了一个商店 configStore js import createStore from redux import gener
  • 如何在 TypeScript 中使用 navigation.replace ?

    我试图在我的代码中使用它 const navigation useNavigation navigation replace AllFriends 但我不断收到错误消息 Property replace does not exist on
  • Three.js点击单个粒子

    In this example http jsfiddle net agqq96bq 2 您可以看到 2 个可点击的粒子 但它们都受到点击的影响 另外 我只想检测粒子上的点击 而不将它们过滤出场景 像这儿 if intersects len
  • 将引导程序弹出框保留在视口内

    我正在尝试使用带有按钮的侧边栏创建一个菜单 每个按钮都有一个指定的包含相关数据的弹出窗口 不幸的是 其中一个弹出窗口可能包含任意数量的行 并且在某些情况下它可能部分位于视口之外 See http jsfiddle net bfd9f 1 h

随机推荐

  • Entity Framework 5 的新迁移功能是否完全支持枚举更改?

    假设我们有以下简单模型 public class Car public int Year get set public string Make get set public string Model get set public CarTy
  • 如何编辑 jquery 函数

    我正在尝试修改 jQuery V 6 1 核心中的 attr 函数 我有一个plugins js 文件 该文件包含在jquery 6 1 js 文件之后的页面中 plugins js 文件包含对各种 jQuery 核心函数的改进 以适应某些
  • Scrapy获取任何网站的所有链接

    我有以下 Python 3 网络爬虫代码 import requests from bs4 import BeautifulSoup import re def get links link return links r requests
  • C++ 使用构造函数参数初始化成员数组

    我有一个模板类 其中包含编译时常量长度的单个成员数组 我希望这个数组是常量 但根据构造函数提供的输入初始化它被证明很困难 struct Input int value template
  • 正则表达式:理解音节计数器代码

    我用过迪伦的问题 https stackoverflow com questions 5686483 how to compute number of syllables in a word in javascript这里关于 JavaSc
  • 加入位于不同 Docker 容器中的 serf 节点时出现问题

    上下文 主机是 AWS EC2 Ubuntu 14 04 5 带有 Docker 版本 17 05 0 ce 容器是根据公开可用的存储库映像构建的cbhihe serf alpine bash 所有容器都位于同一个 EC2 实例上 并与网络
  • 如何知道两个单词是否具有相同的词根?

    我想知道 在几种语言中 两个词是否是 要么同一个词 或同一个词的语法变体 例如 had and has具有相同的基础 在这两种情况下 它都是动词have city and cities具有相同的基数 went and gone具有相同的基数
  • Xcode 4 idekeybounds 一次击键可绑定多个命令

    拼命尝试自定义 Xcode 4 键绑定 我正在编辑用户 idekeybindings 文件 当打开时修改该文件 然后随后尝试通过键绑定界面进行更新时 xcode 有时会擦除该文件 可爱 我的理解是 提供一个命令 选择器 而不是仅仅一个字符串
  • bash:nano:在 Windows git bash 中找不到命令

    我在 Windows 电脑上使用 git 版本 2 7 0 windows 1 我使用了以下命令 nano README 结果我 bash nano command not found 现在如何将 Nano 文本编辑器安装到 git bas
  • 理解 main 的一个不常见的参数

    以下问题是在大学编程竞赛中给出的 我们被要求猜测输出和 或解释其工作原理 不用说 我们都没有成功 main write read 0 1 main 一些简短的谷歌搜索让我找到了这个确切的问题 在codegolf stackexchange
  • 正则表达式的含义如 - \\d , \\D, ^ , $ 等 [重复]

    这个问题在这里已经有答案了 这些表达的意思是什么 我在哪里可以了解它们的用法 d D s S w W t n etc 我需要使用stringr包 我完全不知道如何使用这些 From regexp 在里面扩展正则表达式部分 插入符号 和美元符
  • 子查询上的 Groupwise MAX()

    我正在尝试计算返回表中的最大值以及该表中的其他值 然而 我正在执行此操作的表不是 真正的 表 它是由子查询生成的表 这给我带来了问题 因为我认为在不重新指定整个子查询的情况下我无法连接它两次 我目前有一个 SQL Server 解决方案 使
  • React中继injectNetworkLayer不是一个函数

    我正在遵循 lynda 的教程 构建和部署全栈 React 应用程序 在 注入中继网络层 一章中 在index js中 尝试设置网络层 程序编译成功 但我在浏览器中收到以下错误 类型错误 WEBPACK IMPORTED MODULE 4
  • com.google.cloud.pubsub.spi.v1.Publisher.publish 未将数据发送到 PubSub

    对新版本的调用com google cloud pubsub spi v1 Publisher publish pubsubMessage get 永远挂着 我不确定问题是什么 代码片段 com google cloud pubsub sp
  • Dialogflow,从音频中检测意图

    我正在尝试将音频文件发送到对话流 API 进行意图检测 我已经有一个工作得很好的代理 但只能处理文本 我正在尝试添加音频功能 但没有成功 我正在使用此页面中提供的示例 Java https cloud google com dialogfl
  • Visual Studio 2017 中的 SSIS 工具箱缺少某些组件

    我在用Visual Studio Community 2017用于开发 SSIS 包 我使用 SQL Server 2016 某些组件不在 SSIS 工具箱中 这就是我现在拥有的 这是我的大学所拥有的 他们没有与我相同版本的 Visual
  • 如何在 Excel 中使用 VBA 从 SQLite 数据库检索数据?

    我正在使用 ADO 从 VBA 连接到 db 文件 遵循此问题的答案question https stackoverflow com questions 42509154 accessing a sqlite database in vba
  • 无法更改 Visual Studio 代码设置

    我尝试更改 Visual Studio 代码设置 但无法编辑任何内容 我应该怎么办 我想将编码设置为 files encoding ISO 8859 1 这些是我使用的步骤 1 Ctrl Shift p 打开命令面板2 搜索设置并单击首选项
  • onPrepareOptionsMenu 切换菜单项时如何刷新 ActionBar?

    在我的应用程序中 我经常启用 禁用菜单条目 并让它们从 onPrepareOptionsMenu 中可见 今天 我开始向我的一些 Android 2 x 应用程序添加 android showAsAction 菜单属性 以显示 Action
  • Grails 服务器发送事件

    我需要让服务器发送事件与 Grails 一起工作 我觉得我已经很接近了 但只是还不够 JavaScript 请求成功到达控制器 但每次都会抛出错误 它每隔 2 秒左右重试一次 可能是由于错误 当服务器的会话计时器低于 5 分钟时 我需要向用