blob: 8bb421b822d90b9bddfbbf9d60a0b2a95709c2d5 [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd";>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You 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.
-->
<html>
<head>
<link rel="shortcut icon" href="http://aries.apache.org/images/favicon.ico"></link>
<link type="text/css" rel="stylesheet" href="http://aries.apache.org/resources/site.css"></link>
</script><script src="http://aries.apache.org/resources/menus.js" language="javascript" type="text/javascript"></script>
<meta name="keywords" content="..."/>
<meta name="description" content="..." />
<title>
Apache Aries -
</title>
</head>
<body onload="SetMenu()">
<table width="100%" cellpadding="0" cellspacing="0">
<tr width="100%">
<td id="cell-0-0" colspan="2">&nbsp;</td>
<td id="cell-0-1">&nbsp;</td>
<td id="cell-0-2" colspan="2">&nbsp;</td>
</tr>
<tr width="100%">
<td id="cell-1-0">&nbsp;</td>
<td id="cell-1-1">&nbsp;</td>
<td id="cell-1-2">
<div style="padding: 5px;">
<div id="banner">
<!-- Banner -->
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td align="left" class="topbardiv" nowrap="">
<a href="http://aries.apache.org/" title="Apache Aries"> <img border="0" src="http://aries.apache.org/images/Arieslogo_Horizontal.gif"> </a>
</td>
<td align="right" nowrap="">
<a href="http://www.apache.org/" title="The Apache Software Foundation"> <img border="0" src="http://aries.apache.org/images/apache_feather.png"> </a>
</td>
</tr>
</table>
<!-- Banner -->
</div>
</div>
<div id="top-menu">
<table border="0" cellpadding="1" cellspacing="0" width="100%">
<tr>
<td>
<div align="left">
<!-- Breadcrumbs -->
<!-- Breadcrumbs -->
</div>
</td>
<td>
<div align="right">
<!-- Quicklinks -->
<DIV style="padding: 5px 5px 0px 25px;">
<FORM action="http://www.google.com/search" method="get" style="font-size: 10px;">
<A href="http://www.apache.org/licenses/LICENSE-2.0.html" class="external-link" rel="nofollow">License</A>
<INPUT name="ie" type="hidden" value="UTF-8"></INPUT>
<INPUT name="oe" type="hidden" value="UTF-8"></INPUT>
<INPUT maxlength="255" name="q" size="15" type="text" value></INPUT>
<INPUT name="btnG" type="submit" value="Search"></INPUT>
<INPUT name="domains" type="hidden" value="aries.apache.org"></INPUT>
<INPUT name="sitesearch" type="hidden" value="aries.apache.org"></INPUT>
</FORM>
</DIV>
<!-- Quicklinks -->
</div>
</td>
</tr>
</table>
</div>
</td>
<td id="cell-1-3">&nbsp;</td>
<td id="cell-1-4">&nbsp;</td>
</tr>
<tr width="100%">
<td id="cell-2-0" colspan="2">&nbsp;</td>
<td id="cell-2-1">
<table>
<tr height="100%" valign="top">
<td height="100%">
<div id="wrapper-menu-page-right">
<div id="wrapper-menu-page-top">
<div id="wrapper-menu-page-bottom">
<div id="menu-page">
<!-- NavigationBar -->
<style type="text/css">
/* The following code is added by mdx_elementid.py
It was originally lifted from http://subversion.apache.org/style/site.css */
/*
* Hide class="elementid-permalink", except when an enclosing heading
* has the :hover property.
*/
.headerlink, .elementid-permalink {
visibility: hidden;
}
h2:hover > .headerlink, h3:hover > .headerlink, h1:hover > .headerlink, h6:hover > .headerlink, h4:hover > .headerlink, h5:hover > .headerlink, dt:hover > .elementid-permalink { visibility: visible }</style>
<div onclick="SwitchMenu('documentation')" id="documentationTitle" class="menutitle">Documentation</div>
<div id="documentation" class="menuitemgroup">
<div class="menuitem">
<a href="/documentation/integrators-guide.html">Integrators Guide</a>
</div>
<div class="menuitem">
<a href="/documentation/articles.html">Articles</a>
</div>
<div class="menuitem">
<a href="https://svn.apache.org/repos/asf/aries/slides/">Slides</a>
</div>
<div class="menuitem">
<a href="/documentation/tutorials.html">Tutorials</a>
</div>
<div class="menuitem">
<a href="/documentation/tools.html">Tools</a>
</div>
</div>
<div onclick="SwitchMenu('modules')" id="modulesTitle" class="menutitle">Modules</div>
<div id="modules" class="menuitemgroup">
<div class="menuitem">
<a href="/modules/samples.html">Samples</a>
</div>
<div class="menuitem">
<a href="/modules/async-svcs.html">Asynchronous Services</a>
</div>
<div class="menuitem">
<a href="/modules/blueprint.html">Blueprint</a>
</div>
<div class="menuitem">
<a href="/modules/blueprint-maven-plugin.html">Blueprint-maven-plugin</a>
</div>
<div class="menuitem">
<a href="/modules/blueprintannotation.html">Blueprint Annotations</a>
</div>
<div class="menuitem">
<a href="/modules/blueprintnoosgi.html">Blueprint No-OSGi</a>
</div>
<div class="menuitem">
<a href="/modules/blueprintweb.html">Blueprint Web</a>
</div>
<div class="menuitem">
<a href="/modules/esaanttask.html">ESA Ant Task </a>
</div>
<div class="menuitem">
<a href="/modules/ebamavenpluginproject.html">EBA Maven Plugin </a>
</div>
<div class="menuitem">
<a href="/modules/esamavenpluginproject.html">ESA Maven Plugin </a>
</div>
<div class="menuitem">
<a href="/modules/jmx.html">JMX</a>
</div>
<div class="menuitem">
<a href="/modules/jndiproject.html">JNDI</a>
</div>
<div class="menuitem">
<a href="/modules/jpaproject.html">JPA</a>
</div>
<div class="menuitem">
<a href="/modules/transactioncontrol.html">Transaction Control Service</a>
</div>
<div class="menuitem">
<a href="/modules/transactionsproject.html">Transactions</a>
</div>
<div class="menuitem">
<a href="/modules/rsa.html">Remote Service Admin (RSA)</a>
</div>
<div class="menuitem">
<a href="/modules/spi-fly.html">SPI Fly</a>
</div>
<div class="menuitem">
<a href="/modules/subsystems.html">Subsystems</a>
</div>
<div class="menuitem">
<a href="/modules/applications.html">Applications (obsolete)</a>
</div>
</div>
<div onclick="SwitchMenu('downloads')" id="downloadsTitle" class="menutitle">Downloads</div>
<div id="downloads" class="menuitemgroup">
<div class="menuitem">
<a href="/downloads/currentreleases.html">Current Releases</a>
</div>
<div class="menuitem">
<a href="/downloads/testresults.html">Compliance Tests</a>
</div>
<div class="menuitem">
<a href="/downloads/archived-releases.html">Archived Releases</a>
</div>
</div>
<div onclick="SwitchMenu('community')" id="communityTitle" class="menutitle">Community</div>
<div id="community" class="menuitemgroup">
<div class="menuitem">
<a href="/community/resources.html">Community Resources</a>
</div>
<div class="menuitem">
<a href="/community/gettinginvolved.html">Getting Involved</a>
</div>
<div class="menuitem">
<a href="/community/people.html">Who we are</a>
</div>
<div class="menuitem">
<a href="/community/boardreports.html">Board Reports</a>
</div>
<div class="menuitem">
<a href="/community/logos.html">Logos for Users</a>
</div>
</div>
<div onclick="SwitchMenu('development')" id="developmentTitle" class="menutitle">Development</div>
<div id="development" class="menuitemgroup">
<div class="menuitem">
<a href="/development/buildingaries.html">Building Aries </a>
</div>
<div class="menuitem">
<a href="/development/guidelines.html">Cording Guidelines</a>
</div>
<div class="menuitem">
<a href="/development/architecture.html">Architecture</a>
</div>
<div class="menuitem">
<a href="/development/releasingaries.html">Releasing Aries </a>
</div>
<div class="menuitem">
<a href="/development/compliancetesting.html">OSGi Compliance Tests </a>
</div>
<div class="menuitem">
<a href="/development/maintainingthewebpages.html">Web Site Maintenance </a>
</div>
</div>
<div onclick="SwitchMenu('sponsorship')" id="sponsorshipTitle" class="menutitle">Sponsorship</div>
<div id="sponsorship" class="menuitemgroup">
<div class="menuitem">
<a href="http://www.apache.org/foundation/thanks.html">Thanks</a>
</div>
<div class="menuitem">
<a href="http://www.apache.org/foundation/sponsorship.html">Sponsoring Apache</a>
</div>
</div>
<!-- NavigationBar -->
</div>
</div>
</div>
</div>
</td>
<td height="100%" width="100%">
<!-- Content -->
<div class="wiki-content"><style type="text/css">
/* The following code is added by mdx_elementid.py
It was originally lifted from http://subversion.apache.org/style/site.css */
/*
* Hide class="elementid-permalink", except when an enclosing heading
* has the :hover property.
*/
.headerlink, .elementid-permalink {
visibility: hidden;
}
h2:hover > .headerlink, h3:hover > .headerlink, h1:hover > .headerlink, h6:hover > .headerlink, h4:hover > .headerlink, h5:hover > .headerlink, dt:hover > .elementid-permalink { visibility: visible }</style>
<h1 id="getting-started-with-the-transaction-control-service">Getting started with the Transaction Control Service<a class="headerlink" href="#getting-started-with-the-transaction-control-service" title="Permanent link">&para;</a></h1>
<p>To make use of scoped resources and transactions using the transaction control service you need two things:</p>
<ul>
<li>
<p>A <code>org.osgi.service.transaction.control.TransactionControl</code> implementation
(found in the service registry)</p>
</li>
<li>
<p>A <code>org.osgi.service.transaction.control.ResourceProvider</code> for each of the
resources that you want to use.</p>
</li>
</ul>
<h2 id="scoping-work-using-transactioncontrol">Scoping Work using TransactionControl<a class="headerlink" href="#scoping-work-using-transactioncontrol" title="Permanent link">&para;</a></h2>
<p>The Transaction Control Service defines three different scopes:</p>
<ul>
<li>
<p>Unscoped - There is no scope associated with the current thread</p>
</li>
<li>
<p><em>No Transaction Scope</em> - There is a scope associated with the current thread, but no ongoing transaction</p>
</li>
<li>
<p><em>Transactional Scope</em> - There is an ongoing transaction associated with the current thread</p>
</li>
</ul>
<p>Scoped resources have different behaviours in each of these three scopes:</p>
<ul>
<li>
<p>Unscoped - The resource is generally not usable and will throw exceptions</p>
</li>
<li>
<p><em>No Transaction</em> Scope - The same physical resource will be used throughout the scope,
and will be automatically tidied up at the end of the scope (e.g. closed or returned to a pool)</p>
</li>
<li>
<p><em>Transactional Scope</em> - The same physical resource will be used throughout the scope, will be
automatically committed or rolled back up at the end of the transaction, and then tidied up afterwards</p>
</li>
</ul>
<h3 id="starting-and-finishing-scopes">Starting and Finishing scopes<a class="headerlink" href="#starting-and-finishing-scopes" title="Permanent link">&para;</a></h3>
<p>A scope is defined using a piece of work wrapped in a <code>Callable</code>. This means that it is lambda-friendly.</p>
<div class="codehilite"><pre><span class="n">Integer</span> <span class="n">result</span> <span class="p">=</span> <span class="n">txControl</span><span class="p">.</span><span class="n">required</span><span class="p">(()</span> <span class="o">-&gt;</span> <span class="p">{</span>
<span class="o">//</span><span class="n">Work</span> <span class="n">goes</span> <span class="n">in</span> <span class="n">here</span>
<span class="k">return</span> 42<span class="p">;</span>
<span class="p">});</span>
</pre></div>
<p>The scope starts immediately before the work is executed, and finishes immediately afterwards. The
<code>required</code> and <code>requiresNew</code> methods can be used to ensure that a
<em>Transactional</em> scope has been started. The <code>supports</code> and <code>notSupported</code>
methods can be used to ensure that a <em>No Transaction</em> scope has been started.</p>
<p>Simple scope management is perfect in most situations, but you may also wish to read about
<a href="advancedScopes.html">more advanced scope control techniques</a> or <a href="exceptionManagement.html">exception management</a> once you've mastered the basics.</p>
<h2 id="accessing-resources">Accessing Resources<a class="headerlink" href="#accessing-resources" title="Permanent link">&para;</a></h2>
<p>A <code>ResourceProvider</code> is a generic factory for scoped resources. Typically you will use a more
specific interface for type safety. For example the Transaction Control specification defines
<code>JDBCConnectionProvider</code> and <code>JPAEntityManagerProvider</code> interfaces. If
needed you can <a href="advancedResourceProviders.html">make your own ResourceProvider</a>.</p>
<p>To create your scoped resource you make one call to <code>getResource</code> passing in the
<code>TransactionControl</code> service that the resource should integrate with. The returned object
is thread-safe, and can be cached for use in any scope.</p>
<h3 id="declarative-services-example">Declarative Services Example<a class="headerlink" href="#declarative-services-example" title="Permanent link">&para;</a></h3>
<p>The following component provides read and write access using JDBC to a list of messages created by a user.
The transactionality and lifecycle of the database resources is automatically managed.</p>
<div class="codehilite"><pre><span class="p">@</span><span class="n">Component</span>
<span class="n">public</span> <span class="n">class</span> <span class="n">MyDaoImpl</span> <span class="n">implements</span> <span class="n">MyDao</span> <span class="p">{</span>
<span class="p">@</span><span class="n">Reference</span>
<span class="n">TransactionControl</span> <span class="n">control</span><span class="p">;</span>
<span class="n">Connection</span> <span class="n">dbConn</span><span class="p">;</span>
<span class="p">@</span><span class="n">Reference</span>
<span class="n">void</span> <span class="n">setResource</span><span class="p">(</span><span class="n">JDBCConnectionProvder</span> <span class="n">provider</span><span class="p">)</span> <span class="p">{</span>
<span class="n">dbConn</span> <span class="p">=</span> <span class="n">provider</span><span class="p">.</span><span class="n">getResource</span><span class="p">(</span><span class="n">control</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">@</span><span class="n">Override</span>
<span class="n">public</span> <span class="n">void</span> <span class="n">saveMessage</span><span class="p">(</span><span class="n">String</span> <span class="n">user</span><span class="p">,</span> <span class="n">String</span> <span class="n">message</span><span class="p">)</span> <span class="p">{</span>
<span class="n">txControl</span><span class="p">.</span><span class="n">required</span><span class="p">(()</span> <span class="o">-&gt;</span> <span class="p">{</span>
<span class="n">PreparedStatement</span> <span class="n">ps</span> <span class="p">=</span> <span class="n">connection</span><span class="p">.</span><span class="n">prepareStatement</span><span class="p">(</span>
&quot;<span class="n">Insert</span> <span class="n">into</span> <span class="n">MESSAGES</span> <span class="n">values</span> <span class="p">(</span> ?<span class="p">,</span> ? <span class="p">)</span>&quot;<span class="p">);</span>
<span class="n">ps</span><span class="p">.</span><span class="n">setString</span><span class="p">(</span>1<span class="p">,</span> <span class="n">user</span><span class="p">);</span>
<span class="n">ps</span><span class="p">.</span><span class="n">setString</span><span class="p">(</span>2<span class="p">,</span> <span class="n">message</span><span class="p">);</span>
<span class="k">return</span> <span class="n">ps</span><span class="p">.</span><span class="n">executeUpdate</span><span class="p">();</span>
<span class="p">});</span>
<span class="p">}</span>
<span class="p">@</span><span class="n">Override</span>
<span class="n">public</span> <span class="n">void</span> <span class="n">getMessagesForUser</span><span class="p">(</span><span class="n">String</span> <span class="n">user</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="n">txControl</span><span class="p">.</span><span class="n">supports</span><span class="p">(()</span> <span class="o">-&gt;</span> <span class="p">{</span>
<span class="n">PreparedStatement</span> <span class="n">ps</span> <span class="p">=</span> <span class="n">connection</span><span class="p">.</span><span class="n">prepareStatement</span><span class="p">(</span>
&quot;<span class="n">Select</span> <span class="n">MESSAGE</span> <span class="n">FROM</span> <span class="n">MESSAGES</span> <span class="n">WHERE</span> <span class="n">USER</span> <span class="p">=</span> ?&quot;<span class="p">);</span>
<span class="n">ps</span><span class="p">.</span><span class="n">setString</span><span class="p">(</span>1<span class="p">,</span> <span class="n">user</span><span class="p">);</span>
<span class="n">List</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span> <span class="n">result</span> <span class="p">=</span> <span class="n">new</span> <span class="n">ArrayList</span><span class="o">&lt;&gt;</span><span class="p">();</span>
<span class="n">ResultSet</span> <span class="n">rs</span> <span class="p">=</span> <span class="n">ps</span><span class="p">.</span><span class="n">executeQuery</span><span class="p">();</span>
<span class="k">while</span><span class="p">(</span><span class="n">rs</span><span class="p">.</span><span class="n">next</span><span class="p">())</span> <span class="p">{</span>
<span class="n">result</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">rs</span><span class="p">.</span><span class="n">getString</span><span class="p">(</span>1<span class="p">));</span>
<span class="p">}</span>
<span class="k">return</span> <span class="n">result</span><span class="p">;</span>
<span class="p">});</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div></div>
<!-- Content -->
</td>
</tr>
</table>
</td>
<td id="cell-2-2" colspan="2">&nbsp;</td>
</tr>
<tr width="100%">
<td id="cell-3-0">&nbsp;</td>
<td id="cell-3-1">&nbsp;</td>
<td id="cell-3-2">
<div id="footer">
<!-- Footer -->
<div id="site-footer">
<a href="http://aries.apache.org/privacy-policy.html";>Privacy
Policy</a>
</div>
<!-- Footer -->
</div>
</td>
<td id="cell-3-3">&nbsp;</td>
<td id="cell-3-4">&nbsp;</td>
</tr>
<tr width="100%">
<td id="cell-4-0" colspan="2">&nbsp;</td>
<td id="cell-4-1">&nbsp;</td>
<td id="cell-4-2" colspan="2">&nbsp;</td>
</tr>
</table>
</body>
</html>