如何获取为请求

时间:2017-01-19 18:05:20

标签: java java-ee jboss jboss-eap-7

JBoss EAP 7服务器实例标识在standalone.xml上配置,如下所示:

<subsystem xmlns="urn:jboss:domain:undertow:3.1" instance-id="node2">

我有环境负载均衡和粘性会话。因此,客户端接收带有类似值的JSESSIONID cookie作为值:“ckvLpSqtsN2EjA8WpFqml3UMU5ZIyH2YI29Ir-i.node2”。

问题是:我在MBean上(可以访问FacesContext)。如何获取为请求提供服务的服务器的instance-id?在上面的场景中,“node2”。

我已经尝试过:

  1. FacesContext.getCurrentInstance()。getExternalContext()。getSessionId(真)。
    • 不起作用,因为它从JSESSIONID中的值中删除了instance-id。
  2. 从“Cookie”标题中读取JSESSIONID值(可通过HttpServletRequest获得)。
    • 当用户还没有会话时(他没有JSESSIONID cookie)不起作用。
  3. 我已经考虑通过在环境变量中设置实例id并配置standalone.xml来定义instance-id =“$ {my.instance.name}”来避免此问题。然后,应用程序读取环境变量以获取instance-id。这是可移植的AS,但容易出现配置错误。理想情况下,应用程序应该获得与instance-id完全相同的内容,并且我不需要应用程序可移植。

    此问题类似于“获取WebSphere app Server的实例名称”(Getting instance name of a WebSphere app Server),但是对于JBoss EAP 7服务器。

2 个答案:

答案 0 :(得分:1)

我不确定它是错误还是功能,但问题中描述的设置instance-id不会改变jboss.node.name或jboss.server.name:

  • jboss.node.name设置为主机名;
  • jboss.server.name设置为主机名;
  • Cookie JSESSIONID末尾附加 instance-id

但是,在<server>标记(standalone.xml上的顶级元素)上添加name =“node123”属性并从underow中删除instance-id属性会产生以下影响:

  • jboss.node.name设置为“node123”;
  • jboss.server.name设置为“node123”;
  • Cookie JSESSIONID末尾附加了“node123”。

这不是我期望的答案,但我发现它比定义自定义属性并确保该属性位于“instance-id”更容易接受。

答案 1 :(得分:0)

它可能与问题没有直接关系,但是在wildfly10中执行了一些测试后,我们得出以下结论,这些关系与节点之间唯一的不同属性有关:

  • -Djboss.node.name=clusternode1 唯一标识集群中的每个节点。您可以在日志中看到它。如果缺少jboss.server.name的值,通常使用主机名。

  • <subsystem xmlns="urn:jboss:domain:undertow:3.1" instance-id="node1" 这会影响每个节点生成的返回cookie。负载均衡器可以使用它来维护粘性会话,而无需跟踪cookie。 例如:如果cookie后缀为.node1,我将在后端服务器1上发送它;如果cookie后缀为.node2,则我将其发送到backend-server2上。

  • <subsystem xmlns="urn:jboss:domain:transaction:3.0"> <core-environment node-identifier="node1" 该文档说,应该是独一无二的。 如果在同一主机上运行多个服务器,则使用。请参见下图:operating-modes 如果保留默认值,则会收到警告。警告在wildfly11中更改为更具描述性:https://github.com/wildfly/wildfly/commit/732429b98fc08a01410058a707c73c1dd52c75b1