Kontextabhängige Proxys entwickeln, die Ausführungseigenschaften verwenden

Verwenden Sie einen Arbeitsmanager als Kontextservice (ContextService), um den Aufruf einer Schnittstelle in einen Kontext zu bringen, und geben Sie Ausführungseigenschaften an, um die Erfassung des Threadkontexts und seine Anwendung auf den Ausführungsthread zu steuern.

Informationen zu diesem Vorgang

Anwendungskomponenten, die voraussetzen, dass Threadkontext vorhanden ist, wenn Methoden eines Objekts aufgerufen werden, können einen Arbeitsmanager verwenden, der javax.enterprise.concurrent.ContextService implementiert, um einen kontextabhängigen Proxy für das Objekt zu erstellen. Der Threadkontext wird gemäß den Einstellungen des Arbeitsmanagers erfasst, wenn der kontextabhängige Proxy erstellt wird. Wenn Schnittstellenmethoden im kontextabhängigen Proxy aufgerufen werden, wird der zuvor erfasste Threadkontext vor dem Aufruf angewendet und anschließend wiederhergestellt.

Sie können Ausführungseigenschaften für einen kontextabhängigen Proxy angeben, um zu steuern, wie Threadkontext erfasst und angewendet wird. Beispielsweise werden Methoden kontextabhängiger Proxys mit jeder im Ausführungsthread bereits ausgesetzten Transaktion aufgerufen, es sei denn, dieses Verhalten wird durch eine Ausführungseigenschaft außer Kraft gesetzt.

Vorgehensweise

  1. Definieren Sie eine Schnittstelle mit den Methoden, die Threadkontext voraussetzen (oder wählen Sie eine passende vorhandene Schnittstelle aus).
    public interface AddressFinder {
        Address getAddress(Person p) throws Exception;
    }
  2. Stellen Sie eine Implementierung der Schnittstelle bereit:
    public class DatabaseAddressFinder implements AddressFinder {
        private final String resRefLookupName;
        public DatabaseAddressFinder(String resRefLookupName) {
            this.resRefLookupName = resRefLookupName;
        }
        public Address getAddress(Person p) throws Exception {
            // Voraussetzung für den Lookup der Ressourcenreferenz ist der Threadkontext
            // der Anwendungskomponente, die die Ressourcenreferenz definiert.
            DataSource ds = (DataSource) new InitialContext().lookup(
                resRefLookupName);
            Connection con = ds.getConnection();
            try  { 
                ResultSet r = con.createStatement().executeQuery(
                    "SELECT STREETADDR, CITY, STATE, ZIP " +
                    "FROM ADDRESSES WHERE PERSONID=" + p.id);
                if (r.next())
                    return new Address(r.getString(1), r.getString(2),
                        r.getString(3), r.getInt(4));
                else
                    return null;
            } finally {
                con.close();
            }
        }
    }
  3. Verwenden Sie einen Kontextservice, um Kontext aus dem aktuellen Thread zu erfassen, und schließen Sie eine Instanz in diesen Kontext ein, wenn Sie eine Gruppe Ausführungseigenschaften anwenden:
    ContextService contextService = (ContextService) new InitialContext().lookup(
        "java:comp/DefaultContextService");
    Map<String, String> executionProperties =Collections.singletonMap(
        ManagedTask.TRANSACTION,
        ManagedTask.USE_TRANSACTION_OF_EXECUTION_THREAD)
    AddressFinder addressFinder = contextService.createContextualProxy(
        new DatabaseAddressFinder("java:comp/env/jdbc/MyDataSourceRef"),
        executionProperties,
        AddressFinder.class);
  4. Verwenden Sie in einem anderen Thread den kontextabhängigen Proxy, um Methoden im Kontext des ursprünglichen Threads aufzurufen.
    transaction.begin();
    try  { 
        Address myAddress = addressFinder.getAddress(me);
        updateShippingInfo(myAddress);
    } finally {
        transaction.commit();
    }

Symbol, das den Typ des Artikels anzeigt. Taskartikel



Symbol für Zeitmarke Letzte Aktualisierung: 25.05.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tasb_execprops_cproxies
Dateiname:tasb_execprops_cproxies.html