La technique de migration recommandée consiste à utiliser
le type d'importation avec liaison de session sans état
de WebSphere Integration Developer qui vous
permet d'appeler un EJB de session sans état en tant que composant
SCA. Pendant la migration, vous devez écrire
du code Java
personnalisé pour la conversion entre le style d'interface
Java SCA et le style
d'interface EJB existant.
Pour créer le composant EJB personnalisé :
- Sous le projet de module, développez
Interfaces et sélectionnez l'interface WSDL
générée pour cet EJB dans
WebSphere
Studio Application Developer Integration.
- Effectuez un glisser-déposer de cette interface vers l'éditeur
d'assemblage. Une boîte de dialogue vous demande de sélectionner le
type de composant à créer. Sélectionnez Composant (sans
type d'implémentation) et cliquez sur
OK.
- Un composant générique apparaît dans le diagramme de
l'assemblage. Sélectionnez-le et accédez à la vue
Propriétés.
- Dans l'onglet Description, vous pouvez
remplacer le nom et le nom d'affichage du composant par un nom plus
descriptif. Attribuez-lui le nom de votre EJB et ajoutez un suffixe
tel que "JavaMed", car ce composant
Java
servira d'intermédiaire entre l'interface WSDL générée pour l'EJB dans
WebSphere
Studio Application Developer Integration et l'interface
Java
de l'EJB.
- Dans l'onglet Détails, vous voyez que ce
composant a une interface (celle pour laquelle vous avez effectué un
glisser-déposer vers l'éditeur d'assemblage).
- Dans l'éditeur d'assemblage, cliquez avec le bouton droit de la
souris sur le composant que vous venez de créer et sélectionnez
Sélectionnez ensuite le package dans lequel
l'implémentation
Java
sera générée.
Cette opération crée un service
Java
squelette conforme à l'interface WSDL selon le modèle de
programmation SCA, où les types complexes sont représentés par un
objet de type commonj.sdo.DataObject et où les types simples sont
représentés par leurs équivalents objet
Java.
Les exemples de code suivants affichent :
- des définitions appropriées provenant de l'interface WSDL 5.1 ;
- les méthodes Java de
WebSphere Studio
Application Developer Integration Edition 5.1 qui correspondent à l'interface WSDL ;
- les méthodes Java de
WebSphere Integration
Developer 6.0 pour la même interface WSDL.
Le code suivant affiche les définitions appropriées provenant de
l'interface WSDL 5.1 :
<types>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
attributeFormDefault="qualified"
elementFormDefault="unqualified"
targetNamespace="http://migr.practice.ibm.com/"
xmlns:xsd1="http://migr.practice.ibm.com/">
<complexType name="StockInfo">
<all>
<element name="index" type="int"/>
<element name="price" type="double"/>
<element name="symbol" nillable="true"
type="string"/>
</all>
</complexType>
</schema>
</types>
<message name="getStockInfoRequest">
<part name="symbol" type="xsd:string"/>
</message>
<message name="getStockInfoResponse">
<part name="result" type="xsd1:StockInfo"/>
</message>
<operation name="getStockInfo" parameterOrder="symbol">
<input message="tns:getStockInfoRequest"
name="getStockInfoRequest"/>
<output message="tns:getStockInfoResponse"
name="getStockInfoResponse"/>
</operation>
Le code suivant affiche les méthodes Java de
WebSphere Studio Application Developer
Integration Edition 5.1 qui correspondent à l'interface WSDL :
public StockInfo getStockInfo(String symbol)
{
return new StockInfo();
}
public void setStockPrice(String symbol, float newPrice)
{
// set some things
}
Le code suivant affiche les méthodes Java
de WebSphere Integration
Developer 6.0 pour la même interface WSDL :
public DataObject getStockInfo(String aString) {
//TODO Needs to be implemented.
return null;
}
public void setStockPrice(String symbol, Float newPrice) {
//TODO Needs to be implemented.
}
Pour finir, vous devez entrer du code réel aux endroits
où vous voyez les balises "//TODO" dans la classe d'implémentation
Java
générée. Commencez par créer une référence de ce
composant Java vers l'EJB réel de sorte
qu'il puisse accéder à l'EJB selon le modèle de
programmation SCA :
- Laissez l'éditeur d'assemblage ouvert et accédez à J2EE. Localisez
le projet EJB contenant l'EJB pour lequel vous créez un service.
- Développez Descripteur de déploiement :
<nom-projet> et localisez l'EJB. Effectuez un
glisser-déposer vers l'éditeur d'assemblage. Si un message vous
informe que les dépendances du projet doivent être mises à jour,
cochez la case Ouvrir l'éditeur de dépendances
du module… et cliquez sur OK.
- Sous la section J2EE, assurez-vous que le projet EJB est
répertorié et, dans le cas contraire, ajoutez-le en cliquant sur
le bouton Ajouter….
- Enregistrez les dépendances du module et fermez cet éditeur. Vous
voyez qu'une nouvelle importation a été créée dans l'éditeur
d'assemblage. Vous pouvez le sélectionner et accéder à la vue
Propriétés de l'onglet Description afin de remplacer le nom et le
nom d'affichage de cette importation par un nom plus explicite. Dans
l'onglet Connexion, vous remarquez que le type d'importation a
automatiquement la valeur Connexion de bean session sans
état et que le nom JNDI de l'EJB est déjà défini de
manière appropriée.
- Sélectionnez l'outil Connexion dans la palette de l'éditeur
d'assemblage.
- Cliquez sur le composant
Java et relâchez le bouton de la souris.
- Ensuite, cliquez sur l'importation EJB et relâchez le bouton de
la souris.
- Vous allez voir apparaître un message Une référence
correspondante va être créée sur le noeud source. Voulez-vous
continuer ? Cliquez sur OK.
Une connexion est créée entre les deux composants.
- Sélectionnez le composant
Java dans l'éditeur d'assemblage et dans la vue
Propriétés de l'onglet Détails, développez Références, puis
sélectionnez la référence à l'EJB que vous venez de créer. Vous
pouvez mettre à jour le nom de la référence si le nom généré n'est
pas assez descriptif ou pas approprié. N'oubliez pas le nom de
cette référence en vue d'une utilisation future.
- Enregistrez le diagramme de l'assemblage.
Vous devez utiliser le modèle de programmation SCA pour appeler
l'EJB à partir de la classe Java
générée.
Ouvrez la classe
Java générée et suivez ces étapes
pour écrire le code qui appellera le service EJB. Pour la classe
d'implémentation Java
générée :
- Créez une variable privée (dont le type correspond à celui de
votre interface EJB distante) :
private YourEJBInterface ejbService = null;
- Si votre interface EJB contient des types complexes, créez
également une variable privée pour BOFactory :
private BOFactory boFactory = (BOFactory)
ServiceManager.INSTANCE.locateService(“com/ibm/websphere/bo
/BOFactory”);
- Dans le constructeur de la classe d'implémentation
Java, utilisez les API SCA pour
résoudre la référence EJB (pensez à indiquer le nom de la
référence EJB que vous avez écrit dans une étape précédente) et
affectez à la variable privée la même valeur que cette référence :
// Locate the EJB service
this.ejbService = (YourEJBInterface)
ServiceManager.INSTANCE.locateService("name-of-your-ejb-reference");
Pour chaque balise "//TODO" dans la classe d'implémentation
Java générée :
- Convertissez tous les paramètres en types de paramètre attendus
par l'EJB.
- Appelez la méthode appropriée sur la référence EJB à l'aide
du modèle de programmation SCA, en envoyant les paramètres convertis.
- Convertissez la valeur de retour de l'EJB en type de valeur de
retour déclaré par la méthode d'implémentation
Java
générée.
/**
* Method generated to support the implementing WSDL port type named
* "interface.MyBean".
*/
public BusObjImpl getStockInfo(String aString) {
BusObjImpl boImpl = null;
try {
// invoke the EJB method
StockInfo stockInfo = this.ejbService.getStockInfo(aString);
// formulate the SCA data object to return.
boImpl = (BusObjImpl)
this.boFactory.createByClass(StockInfo.class);
// manually convert all data from the EJB return type into the
// SCA data object to return
boImpl.setInt("index", stockInfo.getIndex());
boImpl.setString("symbol", stockInfo.getSymbol());
boImpl.setDouble("price", stockInfo.getPrice());
} catch (RemoteException e) {
e.printStackTrace();
}
return boImpl;
}
/**
* Method generated to support the implementing WSDL port type named
* "interface.MyBean".
*/
public void setStockPrice(String symbol, Float newPrice) {
try {
this.ejbService.setStockPrice(symbol, newPrice.floatValue());
} catch (RemoteException e) {
e.printStackTrace();
}
}