EJB's aanroepen met Ruby

Geplaatst door Danny Lagrouw do, 13 apr 2006 13:25:00 GMT

Nadat ik een paar dagen geleden JRuby had geïnstalleerd en er wat mee had gespeeld, begon ik me af te vragen of je een EJB zou kunnen aanroepen vanuit een JRuby-script. De Java-code waarmee je een EJB aanroept is immers gewoon client code, die met de applicatieserver communiceert over een (in het geval van BEA) HTTP-achtig protocol. In mijn huidige project hebben we een OptimalJ-team dat alle domeincode (Java domeinmodel classes) genereert, en daarbij business services aanlevert (in de vorm van session EJB’s) aan ons, het web frontend team. We ontwikkelen de frontend met BEA WebLogic Portal. Als we nu die EJB’s zouden kunnen aanspreken vanuit JRuby, en Rails zou onder JRuby draaien (wat nog slechts een kwestie van tijd lijkt te zijn), dan zouden we zo’n frontend applicatie in Rails kunnen maken. Dat zou mooi zijn. Ik moet alleen de enterprise architect van het bedrijf in kwestie nog even overtuigen, en hij wordt al horenddol van mijn enthousiaste verhalen over Ruby en Rails…

Maar nu de code! Tot mijn verbazing (na 6 jaar ervaring met EJB’s is alles wat met EJB’s te maken heeft en meteen werkt een grote verrassing) was het slechts een kwestie van de Java-code voor het aanroepen van de EJB, omzetten in JRuby-code. En dan werkt het gewoon. Dit is een voorbeeld van de omgezette code:

require 'java'

include_class 'java.util.Properties'
include_class 'javax.naming.Context'
include_class 'javax.naming.InitialContext'

properties = Properties.new
properties.put(Context::INITIAL_CONTEXT_FACTORY,
    "weblogic.jndi.WLInitialContextFactory")
properties.put(Context::PROVIDER_URL, "t3://localhost:7001")
context = InitialContext.new(properties)
home = context.lookup("business-ejb-jndi-name")
business_ejb = home.create
result = business_ejb.someBusinessMethod(parameters)

Oke, er zijn wat kleine lettertjes. Het voorbeeld werkt op een BEA WebLogic applicatieserver. Voor een andere JEE applicatieserver moet je de classname van de juiste InitialContextFactory invullen. Vul ook de JNDI-naam van de EJB in (achter lookup). Bovendien moet je, vóór je het script draait, de juiste libraries in de CLASSPATH environment variabele zetten. Voor de BEA server moet je bijvoorbeeld weblogic.jar nemen en de EJB client jar (die de home interface van de EJB bevat). Maar als je dat hebt uitgezocht, zou het moeten werken; ik heb het bijvoorbeeld ook met JBoss aan de praat gekregen. Vraag eventueel een Java-guru in je buurt om hulp.

Ik heb de code verwerkt tot een JRuby module (die je hier kunt downloaden vanuit de (eindelijk werkende) RubyEnRails Subversion repository). Met deze module hoef je alleen nog het volgende te schrijven voor het aanroepen van een EJB naar keuze:

require 'rejb'
business_ejb = Rejb::ejb("business-ejb-jndi-name")
result = business_ejb.someBusinessMethod(parameters)

Geplaatst in  | geen reacties

Reacties

(Laat url/e-mail achter »)

   Voorvertoning