2013-09-20 3 views
0

Это мой первый вопрос на переполнение стека, так что не стесняйтесь сказать мне, если я что-то неправильно :)Удаленный поиск JNDI возвращение мой собственный EJB

Я работаю над проектом, EJB и JBoss 4.2.3 .ga. В какой-то момент мы пытаемся получить доступ к каждому узлу кластера, найти EJB и вернуть его.

Это кусок кода, который выполняет поиск JNDI:

public static <I> I getCache(Class<I> i, String clusterNode) { 
    ServiceLocator serviceLocator = ServiceLocator.getInstance(); 
    String jndi = serviceLocator.getRemoteJNDIName(i); 

    Properties props = new Properties(); 
    props.setProperty(Context.PROVIDER_URL, "jnp://" + clusterNode + ":" 
      + jndiPort); 
    props.setProperty(Context.URL_PKG_PREFIXES, "org.jboss.naming"); 
    props.setProperty(Context.INITIAL_CONTEXT_FACTORY, 
      "org.jnp.interfaces.NamingContextFactory"); 
    Object result = null; 
    try { 
     InitialContext ctx = new InitialContext(props); 
     result = ctx.lookup(jndi); 
    } catch (NamingException e) { 
     return null; 
    } 

    return (I) result; 
} 

Здесь:

  • CLUSTERNODE простая строка с IP-адрес или имя DNS-узла. Например: «192.168.2.65» или «cluster1».
  • getRemoteJNDIName возвращает строку, например, как это: «MyEARName/MyEJBName/удаленный»

Проблема заключается в том, что, когда я называю этот метод, например, «127.0.0.1» он прекрасно работает. Кроме того, если я назову его существующим и работающим IP-адресом, где работает сервер, все в порядке.

Однако, если я вызываю метод с несуществующим или неработающим адресом или именем dns, вместо того, чтобы бросать исключение NamingException, он возвращает EJB на моей собственной машине. Поэтому я не знаю, как убрать узел или нет.

Я предполагаю, что могут быть лучшие способы сделать это. Я хотел бы услышать о них, но мы не можем совершить «большие» изменения в продукте из-за того, что он находится в производстве уже несколько лет.

Все. Спасибо вам в ожидании и с наилучшими пожеланиями.

+0

Возможно ли, что ваша конфигурация имеет резервную копию на localhost? Каково значение 'clusterNode'? –

+0

clusterNode - это простая строка с IP-адресом или именем DNS-узла. Например: «192.168.2.75» или «cluster1». – Faliorn

ответ

1

Однако, если я вызываю метод с несуществующей или нерабочим адрес или доменное имя, вместо того, чтобы бросать NamingException, он возвращает EJB в моей собственной машине

Я думаю, это поведение можно объяснить, если у вас есть автоматический naming discovery. Если Contex.PROVIDER_URL не указан или узлы в списке недоступны (это ваш случай), клиенту разрешен поиск в сети доступных JNDI-сервисов.

Однако это работает только при определенных условиях, некоторые из них: все узлы кластеров работают в режиме ALL, все узлы расположены в одной и той же подсети.

Вы можете отключить эту настройку, используя свойство InitialContext .

Я предполагаю, что может быть более эффективные способы сделать это

Согласно кодексу, вы не поймать объект опрашиваемых из JNDI, это означает, что каждый раз, когда вам нужно выполнить обслуживание, должен быть выполнен новый поиск (который требует много времени). Шаблон ServiceLocator предлагает кэшировать результат поиска для повышения производительности.

+0

Спасибо за ваш ответ.Как вы говорите, все узлы находятся в режиме «все», поэтому, я думаю, вы правы. Я попробую как можно скорее. Что касается кэширования, мы действительно кэшируем вызовы JNDI, чтобы избежать новых поисков. Просто поместите упрощенный код, чтобы прояснить вопрос :) – Faliorn

Смежные вопросы