vendredi 2 septembre 2011
JMS est une interface de système de message qui permet de définir des fonctionnalités des providers de message (MOM). Celle de Weblogic définit les fonctionnalités définit dans le standard plus celle spécifique éditeur.
JMS permet d’envoyer un message d’un producteur à un consommateur de deux façons différentes :
ü En point-to-point Ou le producteur ou sender envoie un message sur une queue destination au consommateur ou receiver indépendamment du type de message envoyé.
ü En publish-subscribe Avec plusieurs consommateurs actifs (sur le temps de durée de vie de son abonnement) ou subscriber en abonnement sur une topic sur certains types de messages (event), ou le message est publié par un producteur ou publisher.
Type | Producteur | Consommateur | file |
Point-To-Point | Sender | Receiver | Queue |
Publish-Subscrive | Publisher | Subscriver | Topic |
Le message peut être persisté dans un fichier ou en base pour garantir de toute perte en cas d’incident sur l’instance. Les messages sont maintenus dans la queue jusqu'à ce que :
ü Un consommateur exécute correctement le message (pending message).
ü Le message expire dans le temps.
ü L’instance sur laquelle la queue non persistante est hébergée tombe.
ü La queue est supprimée.
Dans le cas de la souscription non persistante, la durée de vie du message est associée au temps de la connexion JMS, contrairement au mode persisté ou le message survie à une reconnexion.
Le consommateur ou receveur dépile les messages dans l’ordre d’arriver sur la queue (FIFO). Chaque message n’est exécuté que par un consommateur. Si plusieurs consommateurs sont en attachement sur une file unique, seul un consommateur traite le message.
EXTERNAL JMS Providers
Les spécifications JEE ne définissent pas la façon de communiquer avec des providers JMS externes. Certains définissent une API JMS pour faciliter ces intégrations. Dans Weblogic, deux stratégies sont possibles (direct ou indirecte) pour communiquer avec des providers interne (Weblogic) ou externe (Autre fournisseur).
Intégration | Fonctionnement | Caractéristique |
Directe | L’application interagie directement avec la destination distante via le code applicatif ou le paramétrage des descripteurs (le plus optimisé, mais exposé aux interruptions et erreur du provider distant). | Choix de la rapidité, mais peux robuste. |
Indirecte | Utilisant la stratégie du Store-And-Forward utilisant un agent intermédiaire (message forwarding agent) assurant la persistance locale et l’envoi du message asynchrone vers la destination distante. Elle assure les options de rejeux et de passivation garantissant l’envoi du message malgré les erreurs et interruption de la destination distante. | Choix de la robustesse, mais moins rapide. |
Plusieurs possibilités sont offertes par l’architecture Weblogic, chacune offrant des avantages et inconvénients différents.
DIRECT | INDIRECT | ||||
Client JMS MDB | Foreign Server | Foreign JNDI Provider | Bridge | S.A.F | |
Destination et Version | WLS | WLS/Other | WLS/Other | WLS/Other | WLS>9 même version |
Cas D’utilisation | Si pas de contrainte de robustesse dans un environnement Weblogic de même version. | Isoler le paramétrage local de la configuration distante en rendant visible le JDNI distant en local. | À utiliser pour des objets non JMS | Utilisation d’un mode Indirect sur des destinations Weblogic plus anciennes ou des providers distants différents | Utilisation avec des destinations Weblogic. Implémenter un client SAF. Plus optimisé sur les transactions (transaction ne nécessitant pas transaction distribuée). |
Contre indication | Moins optimisé sur les transactions. Dans le cas où l’on reçoit d’une destination distante (Utiliser un client consommateur ou un MDB avec l’option retry). Envoi sur une destination local (plutôt envoyer directement à la destination locale). Environnement avec une faible tolérance de latence de message (envoi mono thread et donc potentiellement un point de contention). Si c’est un environnement Weblogic supérieur ou égal à 9 préférer SAF. Quand il y a beaucoup de destinations sur la partie distante avec beaucoup de serveurs, le paramétrage peut vite devenir complexe à mettre en place et à maintenir (préférer le SAF avec un agent par serveur). | Ne fonctionne qu’avec des destinations Weblogic. Ne peux fonctionner avec des destinations temporaires | |||
Cluster | Utilise les Distributed Destination. | Utilise les Distributed Destination. | Utilise les Distributed Destination. | ||
Les principales différences entre sur le mode indirecte entre le Bridge et le SAF sont que :
ü Le Bridge fonction avec un file source et destination alors que le SAF est une vue locale d’une file distante.
ü Le paramétrage du Bridge nécessite de déclarer autant d’entrées que de destination, alors que l’on peut regrouper plusieurs destinations dans un même SAF.
ü Le SAF et multithread et peut se passer de propagation de transaction alors que le Bridge fonctionne avec des transactions avec un envoi mono thread.
ü Le SAF offre un client de type Indirect.
lundi 11 avril 2011
Cet article présente les fonctionnalités des modules OEPE d’Oracle pour Eclipse afin d’aider le développement sous Jython et WLST. Nous allons créer des scriptes de connexion et création de ressources sur une instance Weblogic. Vous aurez besoin d’avoir accès à une DataBase.
L’avantage de ce module est d’offrir des Wizards de création de scripte et un éditeur Eclipse apportant la correction de code, l’auto indentation et la complétion ainsi que la validation automatique et l’aide à l’exécution. Nous pourrons également exécuter les scriptes en mode debug pas à pas.
CREATION D’UN PROJET WLST
Créer un projet JAVA.
FileàNewàJava Project.
Associer le projet à Weblogic.
Click droit sur le projetàPropertiesàTargeted RuntimesàOracle Weblogic Server 11gR1 PatchSet 3àOk
Click droit sur le projetàPropertiesàProject FacetsàOracle Weblogic Scripting Tools (WLST) Support
(ne pas faire attention a la ligne de commentaire ‘Futher configuration available’)
CREATION D’UN SCRIPTE DE CONNEXION
Créer un source WLST :
Placer vous sous le répertoire wlst du projet :
click droitàNewàOtheràWeblogicàWLSTàNextà
Donner un nom au fichier WLST (TestConnect.py)
Vous obtenez un fichier avec le contenu suivant :
#Conditionally import wlstModule only when script is executed with jython
if __name__ == '__main__':
from wlstModule import *#@UnusedWildImport
print 'starting the script ....'
username = 'weblogic'
password = 'welcome1'
url='t3://localhost:7001'
connect(username,password,url)
edit()
startEdit()
try:
save()
activate(block="true")
print "script returns SUCCESS"
except Exception, e:
print e
print "Error while trying to save and/or activate!!!"
dumpStack()
raise
Modifier
La vue de droite donne une visibilité sur les variables déclarées.
Démarrons une instance Weblogic et modifions le scripte sur les variables username, password, url pour se connecter à cette instance.
Click Droit sur le scriptàRun AsàWLST Run
TEMPLATE DE SCRIPTE
Lors de la création des scriptes, vous avez différent template possible. On pourra ainsi créer et supprimer un data source avec le template ‘Configure JDBC Data Source’ et ‘Delete JDBC Data Source’
Click droit sur le répertoire wlst du projetàNewàOtheràWeblogicàWLST ScriptàNextà’donner un nom de fichier ;createDataSource.py’àOverwrite an existing fileàclique sur le bouton Template
Finish
if __name__ == '__main__':
from wlstModule import *#@UnusedWildImport
print 'starting the script ....'
username = 'weblogic'
password = 'welcome1'
url='t3://localhost:7001'
connect(username,password,url)
edit()
startEdit()
# Change these names as necessary
dsname='myJDBCDataSource'
server='AdminServer'
cd("Servers/"+server)
target=cmo
cd("../..")
# start creation
print 'Creating JDBCSystemResource with name '+dsname
jdbcSR = create(dsname,"JDBCSystemResource")
theJDBCResource = jdbcSR.getJDBCResource()
theJDBCResource.setName("myJDBCDataSource")
connectionPoolParams = theJDBCResource.getJDBCConnectionPoolParams()
connectionPoolParams.setConnectionReserveTimeoutSeconds(25)
connectionPoolParams.setMaxCapacity(100)
connectionPoolParams.setTestTableName("SYSTABLES")
dsParams = theJDBCResource.getJDBCDataSourceParams()
dsParams.addJNDIName("ds.myJDBCDataSource")
driverParams = theJDBCResource.getJDBCDriverParams()
driverParams.setUrl("jdbc:derby://localhost:1527/examples;create=true")
driverParams.setDriverName("org.apache.derby.jdbc.ClientXADataSource")
# driverParams.setUrl("jdbc:oracle:thin:@my-oracle-server:my-oracle-server-port:my-oracle-sid")
# driverParams.setDriverName("oracle.jdbc.driver.OracleDriver")
driverParams.setPassword("examples")
# driverParams.setLoginDelaySeconds(60)
driverProperties = driverParams.getProperties()
proper = driverProperties.createProperty("user")
#proper.setName("userName")
proper.setValue("examples")
proper1 = driverProperties.createProperty("DatabaseName")
#proper1.setName("DatabaseName")
proper1.setValue("examples")
jdbcSR.addTarget(target)
save()
activate(block="true")
print 'Done configuring the data source'
Faire de même pour supprimer le datasource :
Click droit sur le répertoire wlst du projetàNewàOtheràWeblogicàWLST ScriptàNextà’donner un nom de fichier ;deleteDataSource.py’àOverwrite an existing fileàclique sur le bouton TemplateàDelete JDBC DataSource.
VARIABILISATION DES SCRIPTES
Nous allons maintenant variabiliser ces scriptes en introduisant un fichier de properties. Pour cela nous allons créer un scripte utilitaire pour y placer toutes les fonctionnalités désirées comme une méthode loadProps et créer un fichier properties regroupant tous les aspects de paramétrage.
Pour créer le fichier properties :
Click droit sur le répertoire WLST du projetàNewàFileàparam.properties
username=weblogic
password=weblogic1
url=t3://localhost:7001
Créer le scripte utilitaire pour y placer la méthode de chargement du fichier properties.
Click droit sur le répertoire WLST du projetàNewàPyDev ModuleàPackage=lib.wlsutility, Name=mytools.py
Coller le code suivant pour introduire la méthode loadProps
#Conditionally import wlstModule only when script is executed with jython
#if __name__ == '__main__':
# from wlstModule import *#@UnusedWildImport
from wlstModule import *#@UnusedWildImport
#import wlstModule as wlst
from java.io import FileInputStream
def loadProps(configPropFile):
propInputStream = FileInputStream(configPropFile)
configProps = Properties()
configProps.load(propInputStream)
return configProps
Modifier le code du fichier TestConnect en important les méthodes utilitaires et chargeant le fichier properties et en injectant son contenu dans les variables username, password, url :
import lib.wlsutility.mytools as mytools
propertie = mytools.loadProps('param.properties')
print 'starting the script ....'
username = propertie['username']
password = propertie['password']
url= propertie['url']
Tester la modification en exécutant le scripte TestConnect.py
Click Droit sur le scriptàRun AsàWLST Run
Reporter cette modification dans les scriptes de création et suppression de DataSource en y introduisant les variables associées au paramétrage du DataSource (url, driver, nom, etc … ). Prenez les paramètres d’une base accessible lors de la création de la ressource. Dans mon cas ce sera une base Oracle. Vous devez avoir les modifications suivantes :
param.properties
username=weblogic
password=weblogic1
url=t3://localhost:7001
dsname=monDataSource
server=AdminServer
TestTableName='SELECT 1 FROM DUAL'
JNDIName=ds.monJDBCDataSource
JDBC_URL=jdbc:oracle:thin:@localhost:1521:ORACLE
JDBC_DriverName=oracle.jdbc.xa.client.OracleXADataSource
JDBC_UserName=system
JDBC_Password=password
createDataSource
if __name__ == '__main__':
from wlstModule import *#@UnusedWildImport
import lib.wlsutility.mytools as mytools
propertie = mytools.loadProps('param.properties')
print 'starting the script ....'
username = propertie['username']
password = propertie['password']
url= propertie['url']
connect(username,password,url)
edit()
startEdit()
# Change these names as necessary
dsname=propertie['dsname']
server=propertie['server']
cd("Servers/"+server)
target=cmo
cd("../..")
# start creation
print 'Creating JDBCSystemResource with name '+dsname
jdbcSR = create(dsname,"JDBCSystemResource")
theJDBCResource = jdbcSR.getJDBCResource()
theJDBCResource.setName(dsname)
connectionPoolParams = theJDBCResource.getJDBCConnectionPoolParams()
connectionPoolParams.setConnectionReserveTimeoutSeconds(25)
connectionPoolParams.setMaxCapacity(100)
connectionPoolParams.setTestTableName(propertie['TestTableName'])
dsParams = theJDBCResource.getJDBCDataSourceParams()
dsParams.addJNDIName(propertie['JNDIName'])
driverParams = theJDBCResource.getJDBCDriverParams()
driverParams.setUrl(propertie['JDBC_URL'])
driverParams.setDriverName(propertie['JDBC_DriverName'])
# driverParams.setUrl("jdbc:oracle:thin:@my-oracle-server:my-oracle-server-port:my-oracle-sid")
# driverParams.setDriverName("oracle.jdbc.driver.OracleDriver")
driverParams.setPassword(propertie['JDBC_Password'])
# driverParams.setLoginDelaySeconds(60)
driverProperties = driverParams.getProperties()
proper = driverProperties.createProperty("user")
#proper.setName("userName")
proper.setValue(propertie['JDBC_UserName'])
proper1 = driverProperties.createProperty("DatabaseName")
#proper1.setName("DatabaseName")
proper1.setValue("examples")
jdbcSR.addTarget(target)
save()
activate(block="true")
print 'Done configuring the data source'
deleteDataSource.py
if __name__ == '__main__':
from wlstModule import *#@UnusedWildImport
import lib.wlsutility.mytools as mytools
propertie = mytools.loadProps('param.properties')
print 'starting the script ....'
username = propertie['username']
password = propertie['password']
url= propertie['url']
connect(username,password,url)
edit()
startEdit()
delete(propertie['dsname'],'JDBCSystemResource')
save()
activate(block="true")
Vous pouvez tester ces scriptes et vérifier la création et la suppression de la ressource dans la console Weblogic.
ConsoleàServicesàDataSources
Avant Création
Exécution du scripte de création :
Initializing WebLogic Scripting Tool (WLST) ...
Welcome to WebLogic Server Administration Scripting Shell
Type help() for help on available commands
starting the script ....
Connecting to t3://localhost:7001 with userid weblogic ...
Successfully connected to Admin Server 'AdminServer' that belongs to domain 'dev_domain'.
Warning: An insecure protocol was used to connect to the
server. To ensure on-the-wire security, the SSL port or
Admin port should be used instead.
Location changed to edit tree. This is a writable tree with
DomainMBean as the root. To make changes you will need to start
an edit session via startEdit().
For more help, use help(edit)
You already have an edit session in progress and hence WLST will
continue with your edit session.
Starting an edit session ...
Started edit session, please be sure to save and activate your
changes once you are done.
Creating JDBCSystemResource with name monDataSource
MBean type JDBCSystemResource with name monDataSource has been created successfully.
Saving all your changes ...
Saved all your changes successfully.
Activating all your changes, this may take a while ...
The edit lock associated with this edit session is released
once the activation is completed.
Activation completed
Done configuring the data source
Après création
Initializing WebLogic Scripting Tool (WLST) ...
Welcome to WebLogic Server Administration Scripting Shell
Type help() for help on available commands
starting the script ....
Connecting to t3://localhost:7001 with userid weblogic ...
Successfully connected to Admin Server 'AdminServer' that belongs to domain 'dev_domain'.
Warning: An insecure protocol was used to connect to the
server. To ensure on-the-wire security, the SSL port or
Admin port should be used instead.
Location changed to edit tree. This is a writable tree with
DomainMBean as the root. To make changes you will need to start
an edit session via startEdit().
For more help, use help(edit)
You already have an edit session in progress and hence WLST will
continue with your edit session.
Starting an edit session ...
Started edit session, please be sure to save and activate your
changes once you are done.
MBean type JDBCSystemResource with name monDataSource has been deleted successfully.
Saving all your changes ...
Saved all your changes successfully.
Activating all your changes, this may take a while ...
The edit lock associated with this edit session is released
once the activation is completed.
Activation completed
Rafraichissement de la console :
On pourra améliorer ces scriptes en introduisant pas exemple des tests pour savoir si la ressource n’est pas déjà créée lors de sa création, supprimer les ressources en cas d’exception dans un try/catch ou tester si la session console n’est pas déjà prise par quelqu'un et la fermer avant d’en rouvrir une autre.
Inscription à :
Articles (Atom)
AUTEUR
- Jean FRANCOIS
- Carrières Sur Sein, Yvelines, France
- Consultant Oracle (Ancien consultant BEA depuis 2001), je m’occupe des expertises sur les produits Oracle : SOCLE (Weblogic, Coherence, JRockit) SOA (Service Bus, SOA Suite, BPM)
MON CV
LABEL 3D
Blogumulus by Roy Tanck and Amanda Fazani
LABEL CLOUD
ARCHIVES
AUTRES BLOG
-
Alexandre Vasseur ex (BEA | Oracle FR / Esper)
James Bayer (BEA | Oracle US)
Maxence Button ex (BEA | Oracle FR)
Marc Kelderman
Edwin Biemond (Oracle ACE)
Mark Smith (Oracle)
Chris Tomkins (Oracle)





















































