javascript - 如何将同一小工具的多个实例分开

标签 javascript jira jira-plugin

关闭。这个问题需要更多 focused .它目前不接受答案。












想改进这个问题?更新问题,使其仅关注一个问题 editing this post .

3年前关闭。




Improve this question




我创建了一个 JIRA 小工具。当我只将它的一个实例放在仪表板上时,这很好。当我在同一个仪表板上放置第二个实例,将其配置为加载不同的数据,然后刷新整个仪表板时,我可以看到它们共享大部分数据——就好像它们几乎同时从服务器获取数据一样,并且然后写入相同的 javascript 变量,然后基于该变量进行渲染。

当它们渲染时,当我知道它们应该完全不同时,它们大多彼此相同(我可以看到与实例 A 的配置匹配的值出现在实例 B 中)。

我可以判断它错误的另一种方法是,当我分别刷新每个小工具时,它们会显示正确的数据。但是当我刷新整个仪表板时,它们显示的内容大多相同。

我如何将这些分开?我的一个想法是尝试以下方法:

  • 在服务器上保留一个线程安全的请求计数器。
  • 对于每个请求,递增计数器并将新值附加到速度模板中的 javascript 变量的名称中。
  • 将项目添加到上下文哈希映射时,将请求计数器附加到键,以便它们与步骤 2 中的 javascript 变量
  • 渲染器采用修改后的速度模板和上下文哈希映射,并生成仅引用其自己的请求结果的内容。

  • 但是我在第 2 步遇到了一些问题。我有模板文件“/templates/gadgets/my-gadget.vm”的“位置”——它不是一个真实的位置,因为服务器上没有这样的文件在那条路上。渲染器期望“位置”作为参数。我想加载/templates/gadgets/my-gadget.vm(无论它实际在哪里),写出一个新的/templates/gadgets/my-gadget..vm,然后将这个新位置传递给渲染器......但是/templates/gadgets/my-gadget.vm 不是普通的文件路径。它在哪里?

    还是有更好的方法?

    注意:servlet 中没有任何东西被标记为静态或易失——servlet 中的所有内容都是特定于实例的(因此是特定于请求的???),因此请求之间的流血在客户端(请参阅评论以讨论这是否是正确并查看 tl;dr 的公认答案)。

    最佳答案

    您在评论中提到您将从 HttpServletRequest 传入的值存储为服务器端的“实例变量”。问题是 JIRA 只实例化您的 servlet 对象的单个副本,这意味着您写入实例变量的任何内容都将在请求之间共享。如果两个请求同时进入并且它们被交错,线程#1 会意外地看到来自线程#2 的数据,这可能就是发生的情况。

    解决方案是将所有内容都保留在堆栈中。例如,无需写入实例变量,只需在 service 中声明局部变量即可。方法并将所有内容留在那里而不是在类范围内。

    如果您的 servlet 类中已经有其他使用实例变量的函数,您可以修改它们以接收在方法调用期间作为参数传递的值,或者重构并将该代码移动到另一个使用其自己的实例的类变量(但请确保每次收到请求时在 service() 内显式实例化该类的新对象!)。

    关于javascript - 如何将同一小工具的多个实例分开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24191316/

    相关文章:

    java - Webwork actions,action类中声明的变量的生命周期

    Javascript/JQuery 设置复选框的值,同时禁用其他复选框

    javascript - 使文本不可选择

    Windows 批处理 : echo a multi-line variable with special characters (JiraRelease Notes from jenkins)

    Jira 问题提醒

    php - Jira REST API 的文件附件返回空数组

    java - 如何获取 Jira 时间?

    java - 将 docx4j 与 JIRA 插件集成时遇到问题

    javascript - jquery clone 在哪里渲染它的内容?

    javascript - 插件没有按我的预期工作