如何保持同一个小工具的多个实例分开[关闭]

问题描述 投票:1回答:1

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

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

我可以告诉它错误的另一种方法是当我单独刷新每个小工具时,它们会显示正确的数据。但是当我刷新整个仪表板时,它们显示的大部分都是相同的。

我如何保持这些分开?我有一个想法是尝试以下方法:

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

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

还是有更好的方法?

注意:servlet中没有任何内容标记为static或volatile - servlet中的所有内容都是特定于实例的(因此也是特定于请求的),因此请求之间的流量是在客户端(请参阅有关是否为纠正并查看tl; dr的接受答案。

javascript jira jira-plugin
1个回答
1
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.