[Java programming language only]

Développement de composants client eXtreme Scale en vue d'utiliser des transactions

L'adaptateur de ressources WebSphere eXtreme Scale fournit une gestion des connexions client et une prise en charge des transactions locales. Ces prises en charge permettent aux applications Java™ Platform, Enterprise Edition (Java EE) de rechercher les connexions client eXtreme Scale et de démarquer les transactions locales à l'aide des transactions locales Java EE ou des API eXtreme Scale.

Avant de commencer

Créez une référence de ressource de fabrique de connexions eXtreme Scale.

Pourquoi et quand exécuter cette tâche

Vous pouvez utiliser les API d'accès aux données eXtreme Scale de plusieurs façons. Dans tous les cas, la fabrique de connexions eXtreme Scale doit être injectée dans le composant d'application ou recherchée dans l'interface JNDI (Java Naming Directory Interface). Une fois la fabrique de connexions recherchée, vous pouvez démarquer les transactions et créer des connexions permettant d'accéder aux API eXtreme Scale.

Vous pouvez aussi éventuellement transtyper l'instance javax.resource.cci.ConnectionFactory en une fabrique com.ibm.websphere.xs.ra.XSConnectionFactory qui fournit des options supplémentaires pour l'extraction des descripteurs de connexion. Les descripteurs de connexions générés doivent être transtypés vers l'interface com.ibm.websphere.xs.ra.XSConnection, qui fournit la méthode getSession. La méthode getSession renvoie un descripteur d'objet com.ibm.websphere.objectgrid.Session qui permet aux applications d'utiliser n'importe laquelle des API d'accès aux données eXtreme Scale, telles que les API ObjectMap et EntityManager.

Le descripteur de session et les objets dérivés sont valides pendant toute la durée de vie du descripteur XSConnection.

Les procédures suivantes peuvent être utilisées pour démarquer les transactions eXtreme Scale. Vous ne pouvez pas mélanger ces procédures. Par exemple, vous ne pouvez pas mélanger une démarcation de transaction globale et une démarcation de transaction locale dans le même contexte de composant d'application.

Procédure

Exemple

Reportez-vous à l'exemple de code suivant, qui illustre les étapes précédentes de démarcation des transactions eXtreme Scale.
    // (C) Copyright IBM Corp. 2001, 2012.
    // All Rights Reserved. Eléments sous licence - Propriété d'IBM.
    package com.ibm.ws.xs.ra.test.ee;
     
    import javax.naming.InitialContext;
    import javax.resource.cci.Connection;
    import javax.resource.cci.ConnectionFactory;
    import javax.resource.cci.LocalTransaction;
    import javax.transaction.Status;
    import javax.transaction.UserTransaction;
     
    import junit.framework.TestCase;
     
    import com.ibm.websphere.objectgrid.ObjectMap;
    import com.ibm.websphere.objectgrid.Session;
    import com.ibm.websphere.xs.ra.XSConnection;
     
    /**
    * Cet exemple doit être exécuté dans un contexte J2EE sur votre serveur
    * d'applications. Par exemple, en utilisant le servlet d'infrastructure préfabriquée JUnitEE.
    *
    * Le code présent dans ces méthodes de texte réside généralement sur votre propre servlet,
    * sur votre EJB ou sur un autre composant Web.
    *
    * L'exemple dépend d'une fabrique de connexions WebSphere eXtreme Scale configurée
    * enregistrée sous le nom JNDI de "eis/embedded/wxscf" qui définit une
    * connexion à une grille contenant une mappe portant le nom "Map1".
    *
    * Cet exemple effectue une recherche directe du nom JNDI et ne nécessite pas une
    * injection de ressource.
    */
    public class DocSampleTests extends TestCase {
        public final static String CF_JNDI_NAME = "eis/embedded/wxscf";
        public final static String MAP_NAME = "Map1";
       
        Long                key = null;
        Long                value = null;
        InitialContext      ctx = null;
        ConnectionFactory   cf = null;
       
        public DocSampleTests() {
        }
        public DocSampleTests(String name) {
            super(name);
        }
        protected void setUp() throws Exception {
            ctx = new InitialContext();
            cf = (ConnectionFactory)ctx.lookup(CF_JNDI_NAME);
            key = System.nanoTime();
            value = System.nanoTime();
        }
        /**
         * Cette exemple s'exécute lorsqu'il n'est pas dans le contexte d'une transaction globale
         * et utilise la validation automatique (autocommit).
         */
        public void testLocalAutocommit() throws Exception {
            Connection conn = cf.getConnection();
            try {
                Session    session = ((XSConnection)conn).getSession();
                ObjectMap  map = session.getMap(MAP_NAME);
                map.insert(key, value); // Or various data access operations
            }
            finally {
                conn.close();
            }
        }
     
        /**
         * Cette exemple s'exécute lorsqu'il n'est pas dans le contexte d'une transaction globale
         * et démarque la transaction à l'aide de session.begin()/session.commit()
         */
        public void testLocalSessionTransaction() throws Exception {
            Session    session = null;
            Connection conn = cf.getConnection();
            try {
                session = ((XSConnection)conn).getSession();
                session.begin();
                ObjectMap  map = session.getMap(MAP_NAME);
                map.insert(key, value); // Or various data access operations
                session.commit();
            }
            finally {
                if (session != null && session.isTransactionActive()) {
                    try { session.rollback(); }
                    catch (Exception e) { e.printStackTrace(); }
                }
                conn.close();
            }
        }
       
        /**
         * Cet exemple utilise l'interface LocalTransaction pour démarquer les
         * transactions.
         */
        public void testLocalTranTransaction() throws Exception {
            LocalTransaction tx = null;
            Connection conn = cf.getConnection();
            try {
                tx = conn.getLocalTransaction();
                tx.begin();
                Session    session = ((XSConnection)conn).getSession();
                ObjectMap  map = session.getMap(MAP_NAME);
                map.insert(key, value); // Or various data access operations
                tx.commit(); tx = null;
            }
            finally {
                if (tx != null) {
                    try { tx.rollback(); }
                    catch (Exception e) { e.printStackTrace(); }
                }
                conn.close();
            }
        }
       
        /**
         * Cet exemple dépend d'une transaction à gestion externe.
         * Cette transaction à gestion externe peut généralement être présente dans
         * un EJB avec des attributs de transaction définis sur REQUIRED ou REQUIRES_NEW.
         * REMARQUE : S'il n'y a AUCUNE transaction globale active, cet exemple s'exécute en
         *       mode de validation automatique car il ne vérifie pas si une transaction existe.
         */
        public void testGlobalTransactionContainerManaged() throws Exception {
            Connection      conn = cf.getConnection();
            try {
                Session    session = ((XSConnection)conn).getSession();
                ObjectMap  map = session.getMap(MAP_NAME);
                map.insert(key, value); // Or various data access operations
            }
            catch (Throwable t) {
                t.printStackTrace();
                UserTransaction tx = (UserTransaction)ctx.lookup("java:comp/UserTransaction");
                if (tx.getStatus() != Status.STATUS_NO_TRANSACTION) {
                    tx.setRollbackOnly();
                }
            }
            finally {
                conn.close();
            }
        }
       
        /**
         * Cet exemple montre comment démarrer une nouvelle transaction globale à l'aide de
         * l'interface UserTransaction. Généralement, le conteneur démarre la transaction
         * globale (par exemple, dans un EJB avec un attribut de transaction défini sur
         * REQUIRES_NEW), mais cet exemple démarre aussi la transaction globale
         * à l'aide de l'API UserTransaction si elle n'est pas actuellement active.
         */
        public void testGlobalTransactionTestManaged() throws Exception {
            boolean         started = false;
            UserTransaction tx = (UserTransaction)ctx.lookup("java:comp/UserTransaction");
            if (tx.getStatus() == Status.STATUS_NO_TRANSACTION) {
                tx.begin();
                started = true;
            }
            // else { called with an externally/container managed transaction }
            Connection conn = null;
            try {
                conn = cf.getConnection(); // Get connection after the global tran starts
                Session    session = ((XSConnection)conn).getSession();
                ObjectMap  map = session.getMap(MAP_NAME);
                map.insert(key, value); // Or various data access operations
                if (started) {
                    tx.commit(); started = false; tx = null;
                }
            }
            finally {
                if (started) {
                    try { tx.rollback(); }
                    catch (Exception e) { e.printStackTrace(); }
                }
                if (conn != null) { conn.close(); }   
            }
        }
 /**
         /**
         * Cet exemple montre un transaction multipartition.
         */				
			
				public void testGlobalTransactionTestManagedMultiPartition() throws Exception {
						boolean         started = false;
						XSConnectionSpec connSpec = new XSConnectionSpec();
						connSpec.setWriteToMultiplePartitions(true);
						UserTransaction tx = (UserTransaction)ctx.lookup("java:comp/UserTransaction");
						if (tx.getStatus() == Status.STATUS_NO_TRANSACTION) {
								tx.begin();
						started = true;
					}
				// else { called with an externally/container managed transaction }
						Connection conn = null;
									try {
						conn = cf.getConnection(connSpec); // Get connection after the global tran starts
						Session    session = ((XSConnection)conn).getSession();
						ObjectMap  map = session.getMap(MAP_NAME);
						map.insert(key, value); // Or various data access operations
						if (started) {
								tx.commit(); started = false; tx = null;
								}
						}
						finally {
							if (started) {
									try { tx.rollback(); }
									catch (Exception e) { e.printStackTrace(); }
							}
							if (conn != null) { conn.close(); }
						}
					}