Der Ressourcenadapter von WebSphere eXtreme Scale
stellt Unterstützung für das Management von Clientverbindungen und für lokale Transaktionen bereit.
Mit dieser Unterstützung
können Java-EE-Anwendungen (Java Platform, Enterprise
Edition) Clientanwendungen von eXtreme Scale
suchen und lokale Transaktionen mit
lokalen Java-EE-Transaktionen oder mit den APIs von eXtreme Scale abgrenzen.
Die javax.resource.cci.ConnectionFactory-Instanz kann optional in eine com.ibm.websphere.xs.ra.XSConnectionFactory umgesetzt werden, die weitere Optionen für den Abruf von Verbindungshandles bereitstellt. Die abgerufenen Verbindungshandles muss in die Schnittstelle com.ibm.websphere.xs.ra.XSConnection umgesetzt werden, die die Methode getSession bereitstellt. Die Methode getSession gibt ein com.ibm.websphere.objectgrid.Session-Objekthandle zurück, das Anwendungen die Verwendung alle Datenzugriffs-APIs von eXtreme Scale wie ObjectMap und EntityManager ermöglicht.
Das Sitzungshandle und alle abgeleiteten Objekte sind für die Lebensdauer des XSConnection-Handles gültig.
Die folgenden Prozeduren können verwendet werden, um Transaktionen von eXtreme Scale abzugrenzen. Die Prozeduren können nicht gemischt verwendet werden. Es ist beispielsweise nicht möglich, globale Transaktionsdemarkation und lokale Transaktionsdemarkation im Kontext derselben Anwendungskomponente gemischt zu verwenden.
// (C) Copyright IBM Corp. 2001, 2012.
// All Rights Reserved. Licensed Materials - Property of 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;
/**
* Dieses Beispiel muss in einem J2EE-Kontext in Ihrem Anwendungsserver
* ausgeführt werden, z. B. über das JUnitEE-Framework-Servlet.
*
* Der Code in diesen Testmethoden befindet sich gewöhnlich in Ihrem
* eigenen Servlet, Ihrer eigenen EJB oder einer anderen Webkomponente.
*
* Das Beispiel ist von einer konfigurierten Verbindungsfactory von WebSphere eXtreme Scale
* abhängig, die unter dem JNDI-Namen "eis/embedded/wxscf" registriert wurde und
* eine Verbindung zu einem Grid definiert, das eine Map mit dem Namen "Map1" enthält.
*
* Das Beispiel führt ein Direkt-Lookup des JNDI-Namens durch und erfordert
* Keine Ressourceninjektion.
*/
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();
}
/**
* Dieses Beispiel wird ausgeführt, wenn kein globaler Transaktionskontext
* vorhanden ist, und verwendet automatische Festschreibung.
*/
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();
}
}
/**
* Dieses Beispiel wird ausgeführt, wenn kein globaler Transaktionskontext
* vorhanden ist, und grenzt die Transaktion mit session.begin()/session.commit() ab.
*/
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();
}
}
/**
* Dieses Beispiel verwendet die Schnittstelle LocalTransaction für die
* Demarkation von Transaktionen.
*/
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();
}
}
/**
* Dieses Beispiel ist von einer extern verwalteten Transaktion abhängig,
* die gewöhnlich in einer EJB enthalten ist, deren Transaktionsattribute
* auf REQUIRED oder REQUIRES_NEW gesetzt sind.
* ANMERKUNG: Wenn keine globale Transaktion aktiv ist, wird dieses Beispiel
* im Modus für automatische Festschreibung ausgeführt, weil nicht
* geprüft wird, ob eine Transaktion vorhanden ist.
*/
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();
}
}
/**
* Dieses Beispiel veranschaulicht das Starten einer neuen globalen Transaktion
* mit der Schnittstelle UserTransaction. Gewöhnlich startet der Container die
* globale Transaktion (z. B. in einer EJB, deren Transaktionsattribut auf
* REQUIRES_NEW gesetzt ist), aber auch dieses Beispiel startet die globale Transaktion
* mit der API UserTransaction, falls sie momentan nicht aktiv ist.
*/
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(); // Verbindung nach Start der globalen Transaktion abrufen
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(); }
}
}
}