Открытый встроенный контейнер EJB не может найти имя JNDI

Я пытался использовать OpenEJB для своей EJB Timer задачи Unit test. Я получаю сообщение об ошибке, что не может найти имя JNDI.

  Properties props = new Properties();
  props.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.LocalInitialContextFactory");


  IService bean;
  try {
        Context context = new InitialContext(props);
        bean = (IService) context.lookup("java:global/My-App/SingleOccurrenceServiceBean");

       assertNotNull(bean);

  } catch (NamingException e) {
        e.printStackTrace();
  }

А ниже выложен лог.

Apache OpenEJB 3.1.4    build: 20101112-03:32
http://openejb.apache.org/
INFO - openejb.home = D:\workspace\task\My-App
INFO - openejb.base = D:\workspace\task\My-App
INFO - Configuring Service(id=Default Security Service, type=SecurityService, provider-id=Default Security Service)
INFO - Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager)
INFO - Configuring enterprise application: classpath.ear
INFO - Enterprise application "classpath.ear" loaded.
INFO - Assembling app: classpath.ear
INFO - Deployed Application(path=classpath.ear)
 javax.naming.NameNotFoundException: Name "global/My-App/SingleOccurrenceServiceBean" not found.

Вот зависимость Maven.

 <groupId>org.apache.openejb</groupId>
 <artifactId>openejb-core</artifactId>
 version>3.1.4</version>

В чем может быть ошибка?


ОБНОВИТЬ

@Remote
public interface IService {

 public void initializeTimer(Date firstDate, long timeout, String info) throws RemoteException;

 void cancelTimer(String timerName) throws RemoteException;

 /**
   * doService call when the EJBTimer timeout. And it start the service intend to do.
   * @param timer
  */
     @Timeout
 public void doService(Timer timer);


}





@Stateless
public class SingleOccurrenceServiceBean implements IService{

    @Override
public void initializeTimer(Date firstDate, long timeout, String info) throws RemoteException {
    try {
        timerService.createTimer(firstDate, info); 

    } catch (Exception e) {
        log.fatal("Exception create timer : "+ e.toString()); 
        e.printStackTrace();
    }

}

@Override
public void cancelTimer(String timerName) throws RemoteException {
    // do nothing as this timer is a single-event-timer
}


@Override
@Timeout
public void doService(Timer timer) {
    log.debug("Read data from DB");
}
}

person user2771655    schedule 11.02.2014    source источник


Ответы (2)



Мне кажется, что имя JNDI, которое вы ищете, не существует, в OpenEJB имя JNDI по умолчанию для EJB должно быть:

{deploymentId}{interfaceType.annotationName}

и вам не нужен java: , проверьте документацию и этот пост.

ОБНОВЛЕНИЕ

Пытаться

...bean = (IService) context.lookup("SingleOccurrenceServiceBeanRemote");...
person Camilo    schedule 11.02.2014
comment
Нужно ли использовать openejb-jar.xml? Я ничего не делал, просто добавил открытую зависимость ejb и запустил модульный тест. Это правильно? Я не развертывал или ничего не делал. Просто запустите класс модульного теста. - person user2771655; 12.02.2014
comment
пожалуйста, предоставьте код SingleOccurrenceServiceBean и IService и заполните вывод журнала, если это возможно - person Camilo; 12.02.2014
comment
Обновлен вопрос с классом Bean и интерфейсом. - person user2771655; 12.02.2014
comment
Извините, проблема все еще сохраняется. jvax.naming.NameNotFoundException: имя SingleOccurrenceServiceBeanRemote не найдено. - person user2771655; 12.02.2014