Friday, July 24, 2009

Integrate Adobe Flex and JBOSS using BlazeDS - Part II

In the first part of this tutorial I showed you an example on how to integrate flex with JBOSS using BlazeDS. In this example we used RemoteObject in Actionscript to create a new instance of uk.co.spltech.remote.RemoteService and call the callMe() method remotely. The method returned a list of strings that we used to populate a datagrid.
In the second part of this tutorial we will do something slightly more useful. This time we will be invoking an EJB 3.0 bean managed by the application server.

Step 1

To be able to invoke EJB 3.0 from flex you need to download and copy FlexEJBFactory.jar to $JBOSS_HOME/server/default/lib. Or you can copy it to a local directory in your project separate from JBOSS e.g. example7/jbosslib and add the following line to $JBOSS_SERVER/server/default/conf/jboss-service.xml:

<classpath codebase="/usr/java/eclipse/workspace/example7/jbosslib" archives="*"/>

Previously all the BlazeDS jars were located in the WAR:WEB-INF/lib directory. But this is not going to work now because we need to see the jars within the context of the entire EAR. For that reason we need to move all those jars to to $JBOSS_SERVER/server/default/lib(or to a local directory inside your project e.g. jbosslib):

flex-ejb-factory.jar
flex-messaging-common.jar
flex-messaging-core.jar
flex-messaging-opt.jar
flex-messaging-proxy.jar
flex-messaging-remoting.jar
backport-util-concurrent.jar

Step 2

Because we will be invoking EJB 3.0 components we need to change the build process so that it creates an EAR file instead of a WAR. We add the following lines to the createjars target:

<jar jarfile="build/example7.jar">
<fileset dir="${build.classes.dir}">
<include name="uk/co/spltech/remote/*.class" />
</fileset>

</jar>

<zip zipfile="build/example7.ear">
<zipfileset dir="build">
<include name="example7.war" />
</zipfileset>
<zipfileset dir="${build.dir}/resources" prefix="META-INF">
<include name="application.xml" />
</zipfileset>
<zipfileset dir="build">
<include name="example7.jar" />
</zipfileset>
</zip>

Step 3

Add the new ejb3 factory to flex/services-config.xml:

<factories>
<factory id="ejb3" class="com.adobe.ac.ejb.EJB3Factory"/>
</factories>

Step 4

Inside the uk.co.spltech.remote package create the following classes:

package uk.co.spltech.remote;

import java.util.List;

/**
* This is an example of an interface where you can
* declare all the methods that you want to call remotely
*
* @author Armindo Cachada
*
*/
public interface RemoteService {
/**
* I am not doing anything useful except to just show that I can be invoked remotely
* from Adobe Flex using RemoteObject.
*
*/
public List<String> callMe();
}


And the implementation of the interface:

package uk.co.spltech.remote;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.Local;
import javax.ejb.Stateless;

/**
* This remote service is called using BlazeDS/LiveCycle DS from Flex
*
* @author Armindo Cachada
*
*/
@Stateless(name = "remoteService")
@Local(RemoteService.class)
public class RemoteServiceImpl implements RemoteService {


/**
* I am not doing anything useful except to just show that I can be invoked remotely
* from Adobe Flex using RemoteObject.
*
*/
public List<String> callMe() {
System.out.println("I was invoked!");
List<String> result = new ArrayList<String>();
result.add("Michael Jackson");
result.add("Beatles");
result.add("Tina Turner");
return result;

}
}

Step 5

Add the new destination to flex/remoting-config.xml:

<destination id="remoteService" >
<properties>
<factory>ejb3</factory>
<source>example7/remoteService/local</source>
<scope>application</scope>
</properties>
</destination>

There are two differences in the destination declaration:

  • The factory node indicates that we want to use the EJB3Factory declared in services-config.xml

  • The source instead of referencing a class name is changed to reference an EJB3 bean via JNDI.


Step 6

We are going to use the same mxml code as the one for Part I of this tutorial but we need to change the flex compiler settings:


-services "/usr/java/eclipse/workspace/example7/resources/flex/services-config.xml" -context-root "/example7" -locale en_US


After you have followed all these steps you should be good to go!

Download source code for JBOSS+Adobe Flex+BlazeDS project Part II

To save bandwidth I didn't include all the jars needed:

flex-ejb-factory.jar
flex-messaging-common.jar
flex-messaging-core.jar
flex-messaging-opt.jar
flex-messaging-proxy.jar
flex-messaging-remoting.jar
backport-util-concurrent.jar

Copy these jars to the jbosslib directory inside the project. Don't forget to change jboss-service.xml to reference this directory. Otherwise nothing will work.

Good luck!

2 comments:

Paulo Teixeira (Xavelha) said...

Hi. I've been trying to do both tutorials of integrating JBoss and BlazeDS. And on the PartII I don't know where I define the step 2. createjars??. I have a small EJB Module done in Eclipse and deployed on JBoss AS. I tested it with a Java Client and it works fine. But Don't get how to make it work with flex. Do I need to put the jar (this case MyFirstBean.jar) inside the blazeds.war?? Newbie at this.
Thanks a lot

Paulo Teixeira (Xavelha) said...

Hi again.. Just to let you know that I managed my self on going around with the tutorial :) .. I did a bit different for de EJB3.0 call, regarding that I already had a Java Bean deployed. I just created a web project as in the first part of the tutorial and also placing the EJB Factory Library and the other libraries as well in the WEB-INF of the web project, but with no java classes, as the logic would be in the java bean. Deployed it as normally would do, with the SWF/html and all generated by the FLex compiler.. and it worked fine.. :) Thanks a lot.

P.S:
Penso que fala português (o nome indica que sim ;) ) Achei o tutorial um bocado confuso, mas penso que foi te eu ter lido mal e não estar dentro do contexto. Li vários tutoriais, mas o seu foi o que realmente ajudou mais. Muito obrigado :)

 
Software