Как получить доступ к EJB 2.0 с помощью отдельной программы

1

Я разрабатываю проект EJB 2.0 с использованием Eclipse и Jboss AS. Ниже приведены примеры кода:

Компонентный интерфейс:

package com.example.ejb;

import javax.ejb.*;
import java.rmi.RemoteException;

public interface Advice extends EJBObject {

    public String getAdvice() throws RemoteException;
}

Домашний интерфейс:

package com.example.ejb;

import java.rmi.RemoteException;

import javax.ejb.*;

public interface AdviceHome extends EJBHome {

    public Advice create() throws CreateException, RemoteException;
}

Использование бина:

package com.example.ejb;

import java.rmi.RemoteException;

import javax.ejb.*;

public class AdviceBean implements SessionBean {


private static final long serialVersionUID = 1L;

private String[] adviceStrings = {"One word: inappropriate.", 
           "You mightwant to    rethink that haricut.", "Your boss will respect "};

    public void ejbPassivate() {

            System.out.println("ejb activate");
    }

    public void ejbRemove() {

            System.out.println("ejb remove");

    }

    public void setSessionContext(SessionContext ctx) {

            System.out.println("session context");

    }

    public String getAdvice() {

            System.out.println("in get advice");

            int random = (int) (Math.random() * adviceStrings.length);
            return adviceStrings[random];
    }

    public void ejbCreate() {

            System.out.println("in get create");
    }

    public void ejbActivate() throws EJBException, RemoteException {
        System.out.println("in ejbActivate");

    }
}

EJB-jar.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN"       
"http://java.sun.com/dtd/ejb-jar_2_0.dtd">

<ejb-jar id="ejb-jar_ID">
<display-name>Ejb1</display-name>

<enterprise-beans>  
<session>
   <display-name>AdviceBean</display-name>
   <ejb-name>AdviceBean</ejb-name>
   <home>com.example.ejb.AdviceHome </home>
   <remote>com.example.ejb.Advice</remote>
   <ejb-class>com.example.ejb.AdviceBean</ejb-class>
   <session-type>Stateless</session-type>
   <transaction-type>Bean</transaction-type>
   <security-identity>
     <description></description>
     <use-caller-identity></use-caller-identity>
   </security-identity>
 </session>  
</enterprise-beans>
<ejb-client-jar>EJBProjectClient.jar</ejb-client-jar>
</ejb-jar>

Я развернул этот код в Jboss AS, и когда я запустил этот "на сервере", приведенные ниже данные я получаю в JBOSS для запуска журналов для JNDI:

09: 33: 50,273 INFO [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (поток обслуживания MSC 1-3) Связи JNDI для сеансового компонента с именем AdviceBean в развертывании развертывания "EJBProject1.jar":

java:global/EJBProject1/AdviceBean!com.example.ejb.Advice
java:app/EJBProject1/AdviceBean!com.example.ejb.Advice
java:module/AdviceBean!com.example.ejb.Advice
java:jboss/exported/EJBProject1/AdviceBean!com.example.ejb.Advice
java:global/EJBProject1/AdviceBean!com.example.ejb.AdviceHome
java:app/EJBProject1/AdviceBean!com.example.ejb.AdviceHome
java:module/AdviceBean!com.example.ejb.AdviceHome
java:jboss/exported/EJBProject1/AdviceBean!com.example.ejb.AdviceHome

09: 33: 50,299 INFO [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (поток обслуживания MSC 1-2) Связи JNDI для сеансового компонента с именем AdviceBean в подразделении блока развертывания "EJBProject.jar" развертывания "EnterpriseApplicationProject. ухо ":

java:global/EnterpriseApplicationProject/EJBProject/AdviceBean!com.example.ejb.Advice
java:app/EJBProject/AdviceBean!com.example.ejb.Advice
java:module/AdviceBean!com.example.ejb.Advice
java:jboss/exported/EnterpriseApplicationProject/EJBProject/AdviceBean!com.example.ejb.Advice
java:global/EnterpriseApplicationProject/EJBProject/AdviceBean!com.example.ejb.AdviceHome
java:app/EJBProject/AdviceBean!com.example.ejb.AdviceHome
java:module/AdviceBean!com.example.ejb.AdviceHome
java:jboss/exported/EnterpriseApplicationProject/EJBProject/AdviceBean!com.example.ejb.AdviceHome

Мой клиентский код, который пытается получить доступ к EJB:

package com.example.localclient;

import javax.naming.*;
import java.rmi.*;
import javax.rmi.*;
import javax.ejb.*;

import com.example.ejb.Advice;
import com.example.ejb.AdviceHome;

@SuppressWarnings("unused")
public class AdviceClient {

public static void main(String[] args) throws Exception {
    new AdviceClient().go();

}

public void go() throws Exception{

    Context ic = new InitialContext();
    Object o = ic.lookup("java:jboss/exported/EJBProject1/AdviceBean");
    AdviceHome home = (AdviceHome) PortableRemoteObject.narrow(o, AdviceHome.class);
    Advice advisor = home.create();
    System.out.println(advisor.getAdvice());
}

}

Однако, когда я запускаю этот автономный клиент, я получаю следующее исключение:

Исключение в потоке "main" javax.naming.NoInitialContextException: необходимо указать имя класса в среде или системном свойстве или в качестве параметра апплета или в файле ресурсов приложения: java.naming.factory.initial в javax.naming.spi. NamingManager.getInitialContext(NamingManager.java:662) в javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:307) в javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:344) в javax.naming.InitialContext.lookup(InitialContext.java: 411) в com.example.localclient.AdviceClient.go(AdviceClient.java:24) в com.example.localclient.AdviceClient.main(AdviceClient.java:17)

Похоже, что он не может найти имя JNDI, я пытался использовать различные комбинации имен JNDI, которые я видел, когда JBoss начинал (эта информация несколько абзацев выше).

Мне нужна некоторая информация, я сделал google, но все равно столкнулся с той же проблемой.

1) какое имя JNDI я должен предоставить в автономном клиенте?

2) Поскольку клиенту нужна клиентская банка (которая имеет информацию о интерфейсе и другие данные), где я могу это увидеть? FYI в Jboss я видел клиентскую банку как "EJBProjectClient.jar", но не смог физически найти, где эти файлы находятся в рабочей области eclipse.

Любая помощь высоко ценится.

Благодарю!

Теги:
java-ee
jboss
ejb-3.0
ejb-2.x

1 ответ

1

Клиентский код работает в другой JVM, отличной от сервера.

То, что вам нужно, очень просто. Вам нужно изменить свой код, чтобы начать исходный контекст со свойствами сервера, а не локальным.

Взгляните на эту ссылку здесь для получения дополнительной информации о том, как это сделать: http://docs.oracle.com/javase/jndi/tutorial/basics/prepare/initial.html

Вам нужно будет изменить следующие значения в соответствии с вашей средой, URL-адресом поставщика и фабрикой контекстов.

  • URL-адрес поставщика, где ваш сервер имеет порт IIOP (обратитесь к настройкам вашего сервера, чтобы получить порт).
  • Проверьте документацию на сервере для фабрики conetxt (извините, не знаю о точных значениях для JBoss).

Надеюсь это поможет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню