mardi 6 septembre 2011
Oracle Advanced Queuing (AQ) est un provider de message implémenté en base. Il offre une interface d’accès JMS (en 11G) permettant à des applications externes d’envoyer et recevoir des messages. Cette intégration dans Weblogic peut se faire via un Bridge (ancien mode) ou plus nativement avec un Foreign Server (11G).
Avant la 11G, Oracle fournissait un accès AQ via des interfaces non standardisées tel qu’Oracle Internet Directory (OID) ou l’ancien Provider JNDI d’OC4J.
L’accès se fait par un DataSource XA ou non, et les ressources JMS sont déclarées dans la DataBase et non plus dans le serveur d’applications. Tous les aspects d’administration et de monitoring sont donc décalés côté DataBase.
Le principal avantage, mais qui fait sa faiblesse et la centralisation du point d’accès (la base). Lorsqu’une instance Weblogic tombe, les autres peuvent continuer de travailler sans impacte pour le flux des messages et sans procédure administrative. Par contre, si la base n’est plus accessible, des erreurs sont produites et il faut rejouer les messages.
CINEMATIQUE
1 – Le client récupère l’objet Factory d’accès à la base distante via le nom JNDI local. Cette factory permet de récupérer une référence sur le Foreign Server ou l’on a déclaré la DataSource.
2 – Le client récupère la Destination via la référence locale donnée dans le Foreign Server et la DataSource associé d’accès à la base ou se trouve la destination.
3 – Le producteur pousse le message dans la destination distante (en base).
PARAMETRAGE DATABASE
Chaque queue ou topique JMS AQ est attaché à une table. Ce sont des références logiques associées à la table AQ. Les tables AQ sont créées sur des schémas utilisateur spécifiques qu’il faut déclarer et sur lequel il faut attribuer des droits spécifiques.
User : jmsuser
Password : jmsuser
sqlplus SYS/manager1@ORCL AS SYSDBA @AQ_GRANT.sql
AQ_GRANT.sql
sqlplus SYS/manager1@ORCL AS SYSDBA
grant connect,resource,aq_administrator_role to jmsuser identified by jmsuser;
grant select on sys.DBA_PENDING_TRANSACTIONS to jmsuser;
grant execute on sys.dbms_aqadm to jmsuser;
grant execute on sys.dbms_aq to jmsuser;
grant execute on sys.dbms_aqin to jmsuser;
grant execute on sys.dbms_aqjms to jmsuser;
exec dbms_aqadm.grant_system_privilege(’ENQUEUE_ANY’,’jmsuser’);
exec dbms_aqadm.grant_system_privilege(’DEQUEUE_ANY’,’jmsuser’);
Pour créer une table AQ, il faut préciser les paramètres suivant :
ü queue_table Le nom de la table AQ (24 caractères).
ü queue_payload_type Le type de payload utilisé (utilisé sys.aq$_jms_message pour accepter tout type d’interface de message).
ü multiple_consumers Un flag indiquant si la table AQ et de type topic ou non (permet d’accepter plusieurs consommateurs).
Queue Table : myQueueTable
sqlplus jmsuser/jmsuser AS SYSDBA @AQ_CREATE_TABLE_QUEUE.sql
AQ_CREATE_TABLE_QUEUE.sql
execute dbms_aqadm.create_queue_table(queue_table=>'myQueueTable',queue_payload_type=>'sys.aq$_jms_message',multiple_consumers=>false);
Une fois la table AQ crée, on peut créer une ressource AQ JMS queue associée. Cette ressource est utilisée à la fois pour les queues et topic. Les paramètres à préciser pour créer une queue AQ sont :
ü queu_name Le nom de la queue.
ü queue_table Le nom de la table AQ créé précédemment
Queue : userQueue
sqlplus jmsuser/jmsuser AS SYSDBA @AQ_CREATE_QUEUE.sql
AQ_CREATE_QUEUE.sql
execute dbms_aqadm.create_queue(queue_name=>'userQueue',queue_table=>'myQueueTable');
PARAMETRAGE WEBLOGIC
DATASOURCE
Il faut ensuite déclarer une DATASOURCE côté Weblogic (utiliser l’utilisateur DATASOURCE déclaré lors de la création de la table AQ) pour accéder à la queue AQ (Les driver JDBC OCI ne sont pas acceptés). Sélectionner le type de driver XA ou non selon le que l’on souhaite utiliser queue XA ou non.
ü Non-XA driver Transaction locale (via la factory) (ne pas déclarer le paramètre Supports Global Transaction car pas de support d’option LLR, JTS et Emulate Tow-Phase Commit. Dans le cas où l’option est coché, un warning appartait dans les logs de l’instance : Global transactions are supported with XA-based JDBC drivers).
ü XA driver Transaction globale ou local
L’option Identity-based connection pools n’est pas supportée.
Data Source : AQ_DataSource
Consoleà${domaine}àServicesàDataSourcesàNewà’AQ_DataSource’
FOREIGN SERVER
Créer un module JMS pour y déclarer un foreign JMS Server (accès à la queue AQ JDBC distante).
Consoleà${domaine}àServicesàJMS ModulesàNewà’SystemModule_AQ’
Déclarer dans se module un Foreign Server :
Consoleà${domaine}àServicesàJMS ModulesàNewà SystemModule_AQàNewàForeign Serverà ‘ForeignServer-AQ’
Préciser la factory de connexion de type AQ (oracle.jms.AQjmsInitialContextFactory), ainsi que la datasource associé créé précédemment.
Consoleà${domaine}àServicesàJMS ModulesàNewà SystemModule_AQà ForeignServer-AQàConfigurationàGeneral
Ø JNDI Initial Context Factory=’ oracle.jms.AQjmsInitialContextFactory’
Ø JNDI Properties=’datasource=AQ_DataSource’
Créer une connexion factory pour y spécifier le nom JNDI d’accès à la queue AQ dans Weblogic (Local JNDI Name), ainsi que le type de queue créer côté DATABASE (Remote JNDI Name) :
Consoleà${domaine}àServicesàJMS ModulesàNewà SystemModule_AQà ForeignServer-AQàConfigurationàConnection FactoriesàNew
Ø Name=’ XA_AQ_ForeignConnectionFactory’
Ø Local JNDI Name= ‘XA_AQ_ForeignConnectionFactory’
Ø Remote JNDI Name= ‘XAQueueConnectionFactory’
Remote JNDI Name | |
Remote JNDI Name | JMS Interface |
QueueConnectionFactory | javax.jms.QueueConnectionFactory |
TopicConnectionFactory | javax.jms.TopicConnectionFactory |
ConnectionFactory | javax.jms.ConnectionFactory |
XAQueueConnectionFactory | javax.jms.XAQueueConnectionFactory |
XATopicConnectionFactory | javax.jms.XATopicConnectionFactory |
XAConnectionFactory | javax.jms.XAConnectionFactory |
Déclarer l’accès à la queue distante AQ en créant une Destination :
Consoleà${domaine}àServicesàJMS ModulesàNewà SystemModule_AQà ForeignServer-AQàConfigurationàDestinationsàNew
Ø Name=’ForeignDestination_AQ’
Ø Local JNDI Name=’ForeignDestination_AQ’
Ø Remote JNDI Name=’ 'Queues/userQueue'
La partie remote JNDI name spécifie la queue AQ déclaré côté database avec la convention suivante :
Remote JNDI Name | |
AQ JMS Prefix Value | JMS Interface |
Queues/ | Javax.jms.Queue |
Topics/ | javax.jms.Topic |
TRANSACTION
CLUSTER
MONITORING
ROBUSTESSE
DEBUGING
Placer le properties JAVA dans la ligne de commande de l’instance qui va supporter le lien à la file AQ. Avec un range de valeur croissant en sévérité de 1 à 6 (6 étant le mode le plus verbeux).
-Doracle.jms.traceLevel=
Vous devriez avoir en sortie standard les infos suivantes.
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsConnection:createQueueSession: Created session
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsSession.createQueue IN: queuename: userQueue
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsSession.getQueue IN: owner: JMSUSER, name: userQueue
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsSession.getQueue: created AQOracleSession
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsSession.getQueue: finish AQOracleSession.getQueue()
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsSession.getQueue EXIT:
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsSession.createQueue EXIT :
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] [[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default(self-tuning)'] close (OJMS.Session.JFRANCOI-FR.-5b079042:130d13b6e18:-7fff.6) : ENTRY:waiting for sync
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsSession.preClose: ENTRY
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsSession.inGlobalTransRechecked: entry
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsSession.inGlobalTransRechecked: oracle.jms.useEmulatedXA is on
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] EmulatedXAHandler.inGlobalTrans: entry, reCheck=true
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] EmulatedXAHandler.checkForGlobalTxn: entry
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] EmulatedXAHandler.checkForGlobalTxn: container TM answers NOT IN global txn
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] EmulatedXAHandler.inGlobalTrans: exit
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsSession.inGlobalTransRechecked: exit
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsSession.preClose: abort txn
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsSession.preClose: EXIT
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] [[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default(self-tuning)'] close (OJMS.Session.JFRANCOI-FR.-5b079042:130d13b6e18:-7fff.6) : b4 closeWait
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] [[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default(self-tuning)'] close (OJMS.Session.JFRANCOI-FR.-5b079042:130d13b6e18:-7fff.6) : after closeWait
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsSession.closeSessionResources: entry ...
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsSession.closeSessionResources: Closing general Connection
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsGeneralDBConnection.close: close DB connection
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] [[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default(self-tuning)'] close (OJMS.Session.JFRANCOI-FR.-5b079042:130d13b6e18:-7fff.6) : EXIT
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] [[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default(self-tuning)'] close (OJMS.Connection.JFRANCOI-FR.-5b079042:130d13b6e18:-7fff.5) : ENTRY:waiting for sync
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] [[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default(self-tuning)'] close (OJMS.Connection.JFRANCOI-FR.-5b079042:130d13b6e18:-7fff.5) : b4 markClosed of OJMS.Session.JFRANCOI-FR.-5b079042:130d13b6e18:-7fff.6
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] [[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default(self-tuning)'] close (OJMS.Connection.JFRANCOI-FR.-5b079042:130d13b6e18:-7fff.5) : after markClosed of OJMS.Session.JFRANCOI-FR.-5b079042:130d13b6e18:-7fff.6
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsConnection.preClose: ENTRY
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsConnection.preClose: EXIT
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] [[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default(self-tuning)'] close (OJMS.Connection.JFRANCOI-FR.-5b079042:130d13b6e18:-7fff.5) : b4 closeWait
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] [[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default(self-tuning)'] closeWait (OJMS.Connection.JFRANCOI-FR.-5b079042:130d13b6e18:-7fff.5) : b4 close of OJMS.Session.JFRANCOI-FR.-5b079042:130d13b6e18:-7fff.6
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] [[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default(self-tuning)'] close (OJMS.Session.JFRANCOI-FR.-5b079042:130d13b6e18:-7fff.6) : ENTRY:waiting for sync
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] [[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default(self-tuning)'] close (OJMS.Session.JFRANCOI-FR.-5b079042:130d13b6e18:-7fff.6) : ALREADY CLOSED
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] [[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default(self-tuning)'] closeWait (OJMS.Connection.JFRANCOI-FR.-5b079042:130d13b6e18:-7fff.5) : after close of OJMS.Session.JFRANCOI-FR.-5b079042:130d13b6e18:-7fff.6
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] [[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default(self-tuning)'] close (OJMS.Connection.JFRANCOI-FR.-5b079042:130d13b6e18:-7fff.5) : after closeWait
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsConnection.localClose: ENTRY
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsConnection.closeConnectionResources: Connection closed
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] [[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default(self-tuning)'] close (OJMS.Connection.JFRANCOI-FR.-5b079042:130d13b6e18:-7fff.5) : EXIT
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsContext.lookup: lookup return:JMSUSER.userQueue
ADMINISTRATION
ORDERED MESSAGE
CREATE TYPE orders_message_type AS OBJECT (
order_id NUMBER(15),
Product_code VARCHAR2(10),
Customer_id VARCHAR2(10),
order_details VARCHAR2(4000),
price NUMBER(4,2),
region_code VARCHAR2(100));
DBMS_AQADM.CREATE_QUEUE_TABLE (
queue_table => 'aq_admin.orders_qt',
queue_payload_type =>
'aq_admin.orders_message_type'); DBMS_AQADM.CREATE_QUEUE (
queue_name => 'orders_msg_queue',
queue_table => 'aq_admin.orders_msg_qt',
queue_type => DBMS_AQADM.NORMAL_QUEUE,
max_retries => 0,
retry_delay => 0,
retention_time => 1209600,
dependency_tracking => FALSE,
comment => 'Test Object Type Queue',
auto_commit => FALSE);
DBMS_AQADM.START_QUEUE('orders_msg_queue');
SUBSCRIBER
-- need administrator privileges to add
-- subscriber
DBMS_AQADM.ADD_SUBSCRIBER(
Queue_name => ‘aq_admin.orders_msg_queue’,
Subscriber => ‘US_ORDERS’,
Rule => ‘tab.user_data.region_code = ‘`USA’’’);
DBMS_AQADM.ADD_SUBSCRIBER(
Queue_name => ‘aq_admin.orders_msg_queue’,
Subscriber => ‘EUROPE_ORDERS’,
Rule => ‘tab.user_data.region_code =
‘`EUROPE’’’, Transformation =>
‘aq_admin.Dollar_to_Euro’);
MESSAGE TRANSFORMATION
CREATE FUNCTION
Fn_Dollars_to_Euro(src aq_admin.orders_msg_type
)Returns aq_admin.orders_msg_type AS
Target aq_admin.orders_msg_type;
BEGIN
Target :=
aqadmin.orders_msg_type(src.order_id,
src.product_code, src.customer_id,
src.order_details, src.price*.5,
src.region_code);
END;
DBMS_TRANSFORM.CREATE_TRANSFORMATION(
schema => 'AQ_ADMIN',
name => 'DOLLAR_TO_EURO’,
from_schema => 'AQ_ADMIN',
from_type => 'ORDERS_MSG_TYPE',
to_schema => 'AQ_ADMIN',
to_type => 'ORDERS_MSG_TYPE',
transformation =>
'AQ_ADMIN.Fn_Dollars_to_Euro(source.user_data)');
EXPORT
IMPORT
MOVE
PRODUCE
declare
-- Local variables here
queue_options DBMS_AQ.ENQUEUE_OPTIONS_T;
message_properties DBMS_AQ.MESSAGE_PROPERTIES_T;
message_id RAW(16);
agent SYS.AQ$_AGENT := SYS.AQ$_AGENT(' ', null, 0);
my_message SYS.AQ$_JMS_TEXT_MESSAGE;
begin
my_message := SYS.AQ$_JMS_TEXT_MESSAGE.construct;
my_message.set_text('my test message');
-- Test statements here
DBMS_AQ.ENQUEUE(
queue_name => 'my_queue',
enqueue_options => queue_options,
message_properties => message_properties,
payload => my_message,
msgid => message_id);
commit;
end;
CONSUME
declare
queue_options DBMS_AQ.DEQUEUE_OPTIONS_T;
message_properties DBMS_AQ.MESSAGE_PROPERTIES_T;
message_id RAW(2000);
my_message SYS.AQ$_JMS_TEXT_MESSAGE;
msg_text varchar2(32767);
begin
DBMS_AQ.DEQUEUE(
queue_name => 'my_queue',
dequeue_options => queue_options,
message_properties => message_properties,
payload => my_message,
msgid => message_id);
commit;
my_message.get_text(msg_text);
DBMS_OUTPUT.put_line('JMS message: '||msg_text);
end;
START
execute dbms_aqadm.start_queue(queue_name=>'userQueue');
STOP
connect jmsuser / jmsuserpwd
execute dbms_aqadm.stop_queue(queue_name=>'userQueue');
SUSPEND
PURGE
WLST
startEdit()
cd('/')
cmo.createJMSSystemResource('SystemModule-0')
cd('/SystemResources/SystemModule-0')
set('Targets',jarray.array(, ObjectName))
cd('/JMSSystemResources/SystemModule-0/JMSResource/SystemModule-0')
cmo.createForeignServer('ForeignServer-0')
cd('/JMSSystemResources/SystemModule-0/JMSResource/SystemModule-0/ForeignServers/ForeignServer-0')
cmo.setDefaultTargetingEnabled(true)
cmo.setConnectionURL('some.url')
cmo.setInitialContextFactory('SomeInitialContextFactory')
cmo.createForeignDestination('ForeignDestination-0')
cd('/JMSSystemResources/SystemModule-0/JMSResource/SystemModule-0/ForeignServers/ForeignServer-0/ForeignDestinations/ForeignDestination-0')
cmo.setLocalJNDIName('localQ')
cmo.setRemoteJNDIName('remoteQ')
activate()
STANDALONE CLIENT
Ajouter l’option dans le scripte de démarrage de l’instance Weblogic afin de pouvoir se connecter sur l’arbre JNDI de Weblogic sans mot de passé à partir de l’extérieure.
-Dweblogic.jdbc.remoteEnabled=true
Lorsqu’un client requête la ressource du Foreign server, il faut lui préciser toutes les informations d’accès à la Database en plus de la DataSource (peut être un problème). Si on précise également la DataSource, c’est celle-ci qui sera utilisée.
Inscription à :
Publier les commentaires (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
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)
0 commentaires:
Enregistrer un commentaire