/* * Copyright (c) OSGi Alliance (2016). All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.osgi.service.transaction.control.recovery; import javax.transaction.xa.XAResource; import org.osgi.service.transaction.control.ResourceProvider; import org.osgi.service.transaction.control.TransactionContext; /** * A {@link RecoverableXAResource} service may be provided by a * {@link ResourceProvider} if they are able to support XA recovery * operations. * * There are two main sorts of recovery: * * <ul> * <li>Recovery after a remote failure, where the local transaction * manager runs throughout</li> * <li>Recovery after a local failure, where the transaction manager * replays in-doubt transactions from its log</li> * </ul> * * This service is used in both of these cases. * * The identifier returned by {@link #getId()} provides a persistent name * that can be used to correlate usage of the resource both before and after * failure. This identifier must also be passed to * {@link TransactionContext#registerXAResource(XAResource, String)} each time * the recoverable resource is used. * */ public interface RecoverableXAResource { /** * Get the id of this resource. This should be unique, and persist between restarts * @return an identifier, never <code>null</code> */ String getId(); /** * Get a new, valid XAResource that can be used in recovery * * This XAResource will be returned later using the * {@link #releaseXAResource(XAResource)} method * * @return a valid, connected, XAResource * * @throws Exception If it is not possible to acquire a valid * XAResource at the current time, for example if the database * is temporarily unavailable. */ XAResource getXAResource() throws Exception; /** * Release the XAResource that has been used for recovery * * @param xaRes An {@link XAResource} previously returned * by {@link #getXAResource()} */ void releaseXAResource(XAResource xaRes); }