ejb2 com ejb3

17 respostas
G

Ola gente !!

Bom… nao tenho muita pratica com jboss e ejb…
mas tenho que desenvolver uma aplicaçao da seguinte maneira…

tenho o meu aplicaçao.ear.
nele os ejb estao na versao 3.

e em um jar separado… possuo uma outra aplicaçao com ejb2.

eu consegui colocar o jar do ejb2 no ear do ejb3.

ate ai tudo bem…
mas gostaria de saber como faço para o ejb2 chamar um ejb3.

tem que usar akele negocio de narow e bla bla bla ?!
jndi ?!

alguem tem uma luz ?!

Obrigado !!!

17 Respostas

L

Ghz_Gordo,

Acredito que para chamar os ejbs3 dentro do seu ejb2 vc tenha que fazer lookup via JNDI mesmo, axo q disso vc nao tem como fugir não viu, pois independente de ser ejb2 ou ejb3, eles ficam no JNDI ao iniciar o application server, então para trabalhar com eles é necessário o lookup. Caso fosse de um ejb3 para um ejb3 vc teria algumas anotações para lhe auxiliar, como @EJB ou @Resource, etc…

[]'s!!!

G

leonickel !!!

valeu pela resposta rapida !!!

valeu mesmoo !!

toh começando esse estudo sobre ejb e talz… vo prokurar um pouko mais sobre jndi !!
valeu kra !!! =D

L

Ghz_Gordo,

Nao sei se te ajuda em algo, mas segue um exemplo básico de como recuperar algum objeto no JNDI:

InitialContext context = null;
		try
		{
             Properties props = new Properties();
             props.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
             props.put(Context.URL_PKG_PREFIXES, "org.jboss.naming");
             props.put(Context.PROVIDER_URL, "127.0.0.1:1099");
             context = new InitialContext(props);
             Object obj = context.lookup("NOMEDOSEUBEAN/remote");
             return obj;
		} catch(Throwable t)
		{
                        throw t;
		}

Esse nome que está sendo passado no lookup é o nome do seu bean feito em ejb3, esse “/remote” é para resgatar a interface remota que tem a anotação @Remote.

Espero ter ajudado em algo, qlq coisa posta mais aí :smiley:

[]'sss!!

Rafael_Nunes

Você vai precisar definir junto com os EJB3, as interfaces que fazia no EJB2(Home, SessionBean/ EJBObject) para os EJB3, não somente aquelas anotações.

L

não tenho mta experiência com ejb3, usamos aqui no serviço mas eu sei o básico somente, até preciso estudar mais

mas eu acredito que uma das diferenças do eb2 para ejb3 eh q no ejb3 nao sao mais obrigados criar akele monte de interfaces home, local, remote, localremote, etc, etc, etc, é necessário criar apenas uma interface e anotá-la com @Remote e no seu bean vc implementa ela que é o bastante, acredito eu, as demais interfaces o servidor de aplicações se encarrega de manuseá-las, quando necessário.

pelo menos é este modelo que estamos usando aki no serviço e estah funcionando sem problemas, aparentemente.

mas se eu estiver errado em algo, por favor, me corrijam.

valeu!

G

Ola gente !!!

tuuudo bom !?

bom… o meu ejb3 que estou tentando acessar fikou assim…

@Stateful
@RemoteBinding( jndiBinding="ejb/ResultAction/remote" )
@LocalBinding( jndiBinding="result" )
@Scope(ScopeType.SESSION)

public class ResultAction implements Result, ResultRemote
{
....
}

bom… e no meu bean (ejb 2), fikou assim…

public String foo(String param) {
		System.out.print(param);
		
		try{
			Hashtable t = new Hashtable();
			t.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
			t.put(Context.PROVIDER_URL, "127.0.0.1:1099");
			t.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
			
			InitialContext initialContext = new InitialContext(t);
			
			ejb3.ResultRemote res = (ejb3.ResultRemote)initialContext.lookup("ejb/ResultAction/remote");
			
			res.er(param);
			
		} catch(Throwable t){
			t.printStackTrace(); 
		}
		
		return null;
	}

bom… no caso eu adicionei no meu projeto ejb2… o ResultRemote (ejb3.ResultRemote)… mudaria algo no meu ejb-jar.xml ???

valeuuu !!

G

Opaaa !!!

encomodando novamente… ao tentar acessar o ejb3… da o seguinte erro:

19:07:39,912 ERROR [STDERR] java.lang.ClassCastException: $Proxy204
19:07:39,912 ERROR [STDERR]     at ejb.SbbComunicatorBean.foo(SbbComunicatorBean.java:72)
19:07:39,912 ERROR [STDERR]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
19:07:39,912 ERROR [STDERR]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
19:07:39,912 ERROR [STDERR]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
19:07:39,912 ERROR [STDERR]     at java.lang.reflect.Method.invoke(Method.java:585)
19:07:39,912 ERROR [STDERR]     at org.jboss.invocation.Invocation.performCall(Invocation.java:359)
19:07:39,912 ERROR [STDERR]     at org.jboss.ejb.StatelessSessionContainer$ContainerInterceptor.invoke(StatelessSessionContainer.java:237)
19:07:39,912 ERROR [STDERR]     at org.jboss.resource.connectionmanager.CachedConnectionInterceptor.invoke(CachedConnectionInterceptor.java:158)
19:07:39,912 ERROR [STDERR]     at org.jboss.ejb.plugins.StatelessSessionInstanceInterceptor.invoke(StatelessSessionInstanceInterceptor.java:169)
19:07:39,912 ERROR [STDERR]     at org.jboss.ejb.plugins.CallValidationInterceptor.invoke(CallValidationInterceptor.java:63)
19:07:39,975 ERROR [STDERR]     at org.jboss.ejb.plugins.AbstractTxInterceptor.invokeNext(AbstractTxInterceptor.java:121)
19:07:39,975 ERROR [STDERR]     at org.jboss.ejb.plugins.TxInterceptorCMT.runWithTransactions(TxInterceptorCMT.java:350)
19:07:39,975 ERROR [STDERR]     at org.jboss.ejb.plugins.TxInterceptorCMT.invoke(TxInterceptorCMT.java:181)
19:07:39,975 ERROR [STDERR]     at org.jboss.ejb.plugins.SecurityInterceptor.invoke(SecurityInterceptor.java:168)
19:07:39,975 ERROR [STDERR]     at org.jboss.ejb.plugins.LogInterceptor.invoke(LogInterceptor.java:205)
19:07:39,975 ERROR [STDERR]     at org.jboss.ejb.plugins.ProxyFactoryFinderInterceptor.invoke(ProxyFactoryFinderInterceptor.java:136)
19:07:40,006 ERROR [STDERR]     at org.jboss.ejb.SessionContainer.internalInvoke(SessionContainer.java:648)
19:07:40,006 ERROR [STDERR]     at org.jboss.ejb.Container.invoke(Container.java:954)
19:07:40,006 ERROR [STDERR]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
19:07:40,006 ERROR [STDERR]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
19:07:40,006 ERROR [STDERR]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
19:07:40,006 ERROR [STDERR]     at java.lang.reflect.Method.invoke(Method.java:585)
19:07:40,038 ERROR [STDERR]     at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)
19:07:40,038 ERROR [STDERR]     at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)
19:07:40,038 ERROR [STDERR]     at org.jboss.mx.server.Invocation.invoke(Invocation.java:86)
19:07:40,038 ERROR [STDERR]     at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
19:07:40,038 ERROR [STDERR]     at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
19:07:40,038 ERROR [STDERR]     at org.jboss.proxy.ejb.EjbObjectCorbaServant._invoke(EjbObjectCorbaServant.java:288)
19:07:40,038 ERROR [STDERR]     at org.jacorb.poa.RequestProcessor.invokeOperation(RequestProcessor.java:297)
19:07:40,038 ERROR [STDERR]     at org.jacorb.poa.RequestProcessor.process(RequestProcessor.java:596)
19:07:40,038 ERROR [STDERR]     at org.jacorb.poa.RequestProcessor.run(RequestProcessor.java:739)

que seria nessa linha…

ejb3.ResultRemote res = (ejb3.ResultRemote)initialContext.lookup("ejb/ResultAction/remote");

tenho que modificar algo mais ?!
eu soh coloquei essa class no meu projeto… nao mudei nada no meu ejb-jar.xml

[]

Rafael_Nunes

Conforme eu disse, para você conseguir acessar de um EJB 2, você vai ter que definir também a interface Home e o EJBObject. Não somente as anotações.

Paulo_Silveira

Oi Rafael, tem certeza disso? Voce so precisa fazer isso se ele ja tem um cliente acessando como um ejb2, e nao por um ejb2, nao eh isso? Alem disso, da SessionBean voce nao precisa nao, so da Home e da Object mesmo.

Ghz, porque voce nao migra seu EJB2 para EJB3 e usa @EJB, deixando tudo muito mais facil?

Da para fazer isso sem quebrar compatibilidade com seus atuais clientes que trabalham como seu bean sendo EJB2 (que acho que foi o que o Rafael quis dizer). Aqui tem um resuminho:

http://blog.caelum.com.br/2007/03/19/guia-rapido-de-migracao-ejb2-para-ejb3/

G

Aeee galeraaaa !!!

mas entao… nao sei se é possivel…

pois no meu ejb2 eu precisaria do jboss.xml

<session>
         <ejb-name>SbbComunicator</ejb-name>
         <jndi-name>ejb/SbbComunicator</jndi-name>
         	<invoker-bindings>
		<invoker>
			<invoker-proxy-binding-name>iiop</invoker-proxy-binding-name>
		</invoker>
	</invoker-bindings>
        <method-attributes>
        </method-attributes>
      </session>

eu poderia estar fazendo isto com o meu ejb3 ?!

valeuu !!!

G

ker dizer…

eu precisaria tb este codigo…

<assembly-descriptor>
		<container-transaction>
			<method>
				<ejb-name>SbbCommunicatorBean</ejb-name>
				<method-intf>Remote</method-intf>
				<method-name>*</method-name>
			</method>
			<trans-attribute>Required</trans-attribute>		
		</container-transaction>
	</assembly-descriptor>

que fika dentro do meu ejb-jar.xml

valeuu !!!

Paulo_Silveira

a transacao voce substitui com @TransactionAttribute, o nome jndi com @RemoteBinding, e deve ter uma para que o jboss sempre gere o stub iiop em vez de jrmp…

agodinho

Paulo, vc tem usado ejb3 com freqüência? em projetos grandes?
Só agora estou começando a estudar ejb3 (essa link que vc passou caiu como uma luva pra mim), alguma dica geral?

Rafael_Nunes

Yeap. Para manter a compatibilidade e todos clientes que fazem chamada para EJB2 continuarem da emsma forma a chamarem EJB3, tive de implementar as interfaces Home e EJBObject.
Ao menos só desta forma consegui manter a compatibilidade sem ter de alter todas minhas aplicações feitas em EJB2.

agodinho:
Paulo, vc tem usado ejb3 com freqüência? em projetos grandes?
Só agora estou começando a estudar ejb3 (essa link que vc passou caiu como uma luva pra mim), alguma dica geral?

Eu tenho utilizado nos últimos projetos, alguns consideravelmente grandes(se é que existe uma unidade de medida para isso), e só a facilidade de anotações e Dependence of Injection, já vale a pena a migração.

Paulo_Silveira

Oi Agodinho.

agodinhost:
Paulo, vc tem usado ejb3 com freqüência? em projetos grandes?
Só agora estou começando a estudar ejb3 (essa link que vc passou caiu como uma luva pra mim), alguma dica geral?

Que bom que gostou!

A gente tem usado muito mais JPA standalone, sendo raro usar ejb3 tambem. Mas em alguns casos usamos sim e tem sim ja algumas poucas boas praticas… Vou ver se montamos um post sobre ejb3 como esse de jpa:
http://blog.caelum.com.br/2008/01/28/os-7-habitos-dos-desenvolvedores-hibernate-e-jpa-altamente-eficazes/

mas vale lembra que a arquitetura ja é muito mais interessante, eliminando a necessidade de “core java ee 5 partterns” quase que obrigatorios.

abracos

G

Aeee galeraaaa !!!

bom… axo que esta quasi certo… rs

mew bean fikou da seguinte forma…

@Stateless

@TransactionManagement(TransactionManagementType.CONTAINER)

@Remote(SbbComunicator.class)

@RemoteHome(SbbComunicatorHome.class)

@RemoteBinding(factory=org.jboss.ejb3.iiop.IORFactory.class)

só que uma duvida…
quando eu utilizava com ejb2… eu utilizava o iiop… fazendo referencia ao meu ejb em si…

  • corbaname
    ejb/
    ejb/jainslee/
    ejb/jainslee/SbbComunicator

corbaname::localhost:3528/JBoss/Naming/root#ejb/jainslee/SbbComunicator

mas agora… utilizando o ejb3…
ele me trouxe o seguinte…

  • corbaname
    jboss-seam-web_msgsip/
    jboss-seam-web_msgsip/SbbComunicatorBean/
    jboss-seam-web_msgsip/SbbComunicatorBean/remote
    jboss-seam-web_msgsip/SbbComunicatorBean/remoteHome

como que eu referencio meu ejb agora ?!
remote ?! remoteHome ?!

G

a

Criado 31 de janeiro de 2008
Ultima resposta 7 de fev. de 2008
Respostas 17
Participantes 5