Можно ли вызвать EJB из настольного приложения? - PullRequest
2 голосов
/ 07 декабря 2009

Я новичок в Java EJB 3.0. Можно вызвать (сессионный) компонент - развернутый на JBoss - из клиента настольного приложения?

Заранее спасибо.

Ответы [ 4 ]

3 голосов
/ 07 декабря 2009

Да, вы можете. Здесь есть некоторые особенности (относится к EJB2, но то же самое для EJB3, когда речь идет об удаленных клиентах): http://www.theserverside.com/discussions/thread.tss?thread_id=9197

перефразировать:

Hashtable env = new Hashtable();
env.put("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
env.put("java.naming.provider.url", "jnp://localhost:1099");
env.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
Context ctx = new InitialContext(env); 
// name is whatever JNDI name you gave it 
Object o = ctx.lookup("home name"); 
EJBHome ejbHome = (EJBHome) PortableRemoteObject.narrow(o,EJBHome.class); 
// This is userID should be the one passed. 
EJB ejb = ejbHome.create(..); 
1 голос
/ 07 декабря 2009

Предположим, у вас есть следующий удаленный интерфейс:

@Remote
public interface HelloBeanRemote {
    public String sayHello();
}

И сессионный компонент, реализующий его:

@Stateless
public class HelloBean implements HelloBeanRemote {
    ...
}

И что этот EJB правильно упакован и развернут на JBoss.

На стороне клиента создайте jndi.properties со следующим содержимым и поместите его в classpath:

java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=localhost:1099

Затем используйте следующий код для вызова вашего EJB:

Context context;
try {
    context = new InitialContext();
    HelloBeanRemote beanRemote = (HelloBeanRemote)context.lookup("HelloBean/remote"); 
    beanRemote.test(); 
} catch (NamingException e) {
    e.printStackTrace();
    throw new RuntimeException(e);
}

В качестве альтернативы, если вы не хотите предоставлять файл jndi.properties, вы можете явно настроить среду JNDI в коде и создать контекст следующим образом:

Properties properties = new Properties();
properties.put("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
properties.put("java.naming.factory.url.pkgs","=org.jboss.naming:org.jnp.interfaces");
properties.put("java.naming.provider.url","localhost:1099");
Context context = new InitialContext(properties);

Но я бы порекомендовал использовать jndi.properties для переносимости.

1 голос
/ 07 декабря 2009

Да.

public static void main(String args[]) throws Exception {

   InitialContext ctx = new InitialContext();
   YourService yourService = (YourService) ctx.lookup("com.example.session.YourService");
   String time = yourService.getTime();
   System.out.println("Time is: " + time);
}

Для настройки клиента вы должны предоставить файл jndi.properties с содержимым

java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=localhost

Если вы ищете рабочие примеры для JBoss, попробуйте загрузить исходный код Enterprise JavaBeans 3.0, пятое издание

0 голосов
/ 07 декабря 2009

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

...