Поиск порта JNP в JBoss из сервлета - PullRequest
1 голос
/ 16 июня 2010

У меня есть сервлет, работающий в JBoss (4.2.2.GA и 4.3-eap), который должен подключиться к 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);
  }

Теперь, когда я изменяю порт привязки JNDI с 1099 в server / conf / jboss-service.xml, я не могу понять, как программно найти правильный порт для providerUrl выше.

Я сбросил System.getProperties () и System.getEnv (), и он там не отображается.

Я почти уверен, что могу установить его и в server / conf / jndi.properties, но я надеялся избежать другого волшебного конфигурационного файла.

Я пробовал HttpNamingContextFactory, но это не удается "java.net.ProtocolException: сервер перенаправлен слишком много раз (20)"

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

Есть идеи?

1 Ответ

1 голос
/ 17 июня 2010

Информация о порте хранится в JBoss как свойство MBean. Проблема в том, что для чтения этого свойства необходим доступ к MBeans, для которого требуется номер порта ...

Я думаю, что единственный способ получить этот номер порта - это прочитать сам файл конфигурации и извлечь номер порта. Это не очень элегантно, поэтому вы можете создать файл web.xml для своего сервлета и сохранить там номер порта.

Вы также можете использовать JBoss HTTP invoker, который туннелирует запросы на порт 1099 через порт 8080 (порт HTTP по умолчанию), однако учтите, что вам необходимо защитить этот разъем. В этом случае порт всегда будет таким же, как ваш HTTP-порт.

...