从Servlet中查找JBoss中的JNP端口

时间:2010-06-16 16:40:48

标签: servlets jboss jndi

我有一个在JBoss(4.2.2.GA和4.3-eap)中运行的servlet,它需要连接到EJB才能工作。

通常,此代码可以正常工作以使Context连接并进行RMI调用(所有这些都在同一服务器中)。

public class ContextFactory
{
  public static final int DEFAULT_JNDI_PORT = 1099;
  public static final String DEFAULT_CONTEXT_FACTORY_CLASS = "org.jnp.interfaces.NamingContextFactory";
  public static final String DEFAULT_URL_PREFIXES = "org.jboss.naming:org.jnp.interfaces";

  public Context createContext(String serverAddress)
  {
      //combine provider name and port 
      String providerUrl = serverAddress + ":" + DEFAULT_JNDI_PORT;

      //Set properties needed for Context: factory, provider, and package prefixes.
      Hashtable<String, String> env = new Hashtable<String, String>(3);
      env.put(Context.INITIAL_CONTEXT_FACTORY, DEFAULT_CONTEXT_FACTORY_CLASS);
      env.put(Context.PROVIDER_URL, providerUrl);
      env.put(Context.URL_PKG_PREFIXES, DEFAULT_URL_PREFIXES);


      return new InitialContext(env);
  }

现在,当我在server / conf / jboss-service.xml中从1099更改JNDI绑定端口时,我无法弄清楚如何以编程方式为上面的providerUrl找到正确的端口。

我已经转储了System.getProperties()和System.getEnv(),但它没有出现在那里。

我很确定我也可以在server / conf / jndi.properties中设置它,但我希望避免另一个魔术配置文件。

我已经尝试过HttpNamingContextFactory,但失败了“java.net.ProtocolException:Server重定向次数过多(20)”

env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.HttpNamingContextFactory");
env.put(Context.PROVIDER_URL, "http://" + serverAddress + ":8080/invoker/JNDIFactory");

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

有关端口的信息作为MBean属性存储在JBoss上。问题是,为了读取此属性,您需要访问MBean,这需要端口号...

我认为获取此端口号的唯一方法是读取配置文件本身并提取端口号。它不是很优雅,因此您可以优先在serv.xml的web.xml文件中创建并在那里存储端口号。

您也可以使用JBoss HTTP调用程序,它通过端口8080(默认HTTP端口)将请求隧道传输到1099端口,请注意您需要保护此连接器。在这种情况下,端口将始终与HTTP端口相同。