blob: 09082404701f9e89e15e008ebac58278bb9bc700 [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Application Resources</title>
<meta name="description" content="Apache TomEE">
<meta name="author" content="Apache TomEE">
<meta name="google-translate-customization" content="f36a520c08f4c9-0a04e86a9c075ce9-g265f3196f697cf8f-10">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
<meta http-equiv="Cache-Control" content="no-store, no-cache, must-revalidate, max-age=0">
<!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
<!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<!-- Le styles -->
<link href="./resources/css/bootstrap.css" rel="stylesheet">
<link href="./resources/css/prettify.css" rel="stylesheet">
<!--link href="./resources/css/bootstrap-mods.css" rel="stylesheet"-->
<link href="./resources/css/main.css" rel="stylesheet">
<link href="./resources/font-awesome-4.6.3/css/font-awesome.min.css" rel="stylesheet">
<script type="text/javascript">
var t = encodeURIComponent(document.title.replace(/^\s+|\s+$/g,""));
var u = encodeURIComponent(""+document.URL);
function fbshare () {
window.open(
"http://www.facebook.com/sharer/sharer.php?u="+u,
'Share on Facebook',
'width=640,height=426');
};
function gpshare () {
window.open(
"https://plus.google.com/share?url="+u,
'Share on Google+',
'width=584,height=385');
};
function twshare () {
window.open(
"https://twitter.com/intent/tweet?url="+u+"&text="+t,
'Share on Twitter',
'width=800,height=526');
};
function pinshare () {
window.open("//www.pinterest.com/pin/create/button/?url="+u+"&media=http%3A%2F%2Ftomee.apache.org%2Fresources%2Fimages%2Ffeather-logo.png&description="+t,
'Share on Pinterest',
'width=800,height=526');
};
</script>
<!-- Le fav and touch icons -->
<link rel="shortcut icon" href="./favicon.ico">
<link rel="apple-touch-icon" href="./resources/images/apple-touch-icon.png">
<link rel="apple-touch-icon" sizes="72x72" href="./resources/images/apple-touch-icon-72x72.png">
<link rel="apple-touch-icon" sizes="114x114" href="./resources/images/apple-touch-icon-114x114.png">
<script src="./resources/js/prettify.js" type="text/javascript"></script>
<script src="./resources/js/jquery-latest.js"></script>
<script src="http://platform.twitter.com/widgets.js" type="text/javascript"></script>
<script src="./resources/js/common.js"></script>
<script src="./resources/js/prettyprint.js"></script>
<!--script src="//assets.pinterest.com/js/pinit.js" type="text/javascript" async></script//-->
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-2717626-1']);
_gaq.push(['_setDomainName', 'apache.org']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
</head>
<body>
<div class="topbar" data-dropdown="dropdown">
<div class="fill">
<div class="container">
<a class="brand" href="./index.html">Apache TomEE</a>
<ul class="nav">
<li class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
Apache
<b class="caret"></b>
</a>
<ul class="dropdown-menu">
<!-- <li><a href="./misc/whoweare.html">Who we are?</a></li> -->
<!-- <li><a href="./misc/heritage.html">Heritage</a></li> -->
<li><a href="http://www.apache.org">Apache Home</a></li>
<!-- <li><a href="./misc/resources.html">Resources</a></li> -->
<li><a href="./misc/contact.html">Contact</a></li>
<li><a href="./misc/legal.html">Legal</a></li>
<li><a href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li>
<li><a href="http://www.apache.org/foundation/thanks.html">Thanks</a></li>
<li class="divider"/>
<li><a href="http://www.apache.org/security">Security</a></li>
</ul>
</li>
<li><a href="./index.html">Home</a></li>
<li><a href="./downloads.html">Downloads</a></li>
<li><a href="./documentation.html">Documentation</a></li>
<li><a href="./examples-trunk/index.html">Examples</a></li>
<li><a href="./support.html">Support</a></li>
<li><a href="./contribute.html">Contribute</a></li>
<li><a href="./security/index.html">Security</a></li>
</ul>
<!-- Google CSE Search Box Begins -->
<FORM class="pull-right" id="searchbox_010475492895890475512:_t4iqjrgx90" action="http://www.google.com/cse">
<INPUT type="hidden" name="cx" value="010475492895890475512:_t4iqjrgx90">
<INPUT type="hidden" name="cof" value="FORID:0">
<INPUT size="18" width="130" style="width:130px" name="q" type="text" placeholder="Search">
</FORM>
<!--<SCRIPT type="text/javascript" src="http://www.google.com/coop/cse/brand?form=searchbox_010475492895890475512:_t4iqjrgx90"></SCRIPT>-->
<!-- Google CSE Search Box Ends -->
</div>
</div>
</div>
<div class="container">
<div class="page-header">
<small><a href="./index.html">Home</a></small><br>
<h1>Application Resources
<div style="float: right; position: relative; bottom: -10px; ">
<a onclick="javascript:gpshare()" class="gp-share sprite" title="Share on Google+">share [gp]</a>
<a onclick="javascript:fbshare()" class="fb-share sprite" title="Share on Facebook">share [fb]</a>
<a onclick="javascript:twshare()" class="tw-share sprite" title="Share on Twitter">share [tw]</a>
<a onclick="javascript:pinshare()" class="pin-share sprite" title="Share on Pinterest">share [pin]</a>
<a data-toggle="modal" href="#edit" class="edit-page" title="Contribute to this Page">contribute</a>
</div>
</h1>
</div>
<p><a name="ApplicationResources"></a></p>
<h1>Resources</h1>
<p>TomEE provides a simple but powerful way to define resources that can be injected into managed components inside your application, or looked up via JNDI. To use a resource, it needs to be defined in the <code>tomee.xml</code> configuration file, a <code>resources.xml</code> file within an application, or as a system property. Defining a resource in <code>tomee.xml</code> will make it available server-wide, whereas defining the resource within a <code>resources.xml</code> file makes it available to a specific application.</p>
<p>As a simple example, a JMS queue can be defined within <code>tomee.xml</code> with the following configuration.</p>
<pre><code>&lt;tomee&gt;
&lt;Resource id="MyQueue" type="javax.jms.Queue"/&gt;
&lt;/tomee&gt;
</code></pre>
<p>Once the resource has been defined, the server will create an instance of the resource during startup, and it will be available to be injected into managed components using the <code>@Resource</code> annotation, as shown below. The <code>name</code> attribute on the <code>@Resource</code> annotation should match the <code>id</code> attribute on the <code>Resource</code> tag.</p>
<pre><code>public class JmsClient {
@Resource(name="MyQueue")
private Queue queue;
public void sendMessage() {
// implementation here...
}
}
</code></pre>
<p>As an alternative to defining a resource in XML, resources can also be defined using system properties:</p>
<pre><code>MyQueue = new://Resource?type=javax.jms.Queue
</code></pre>
<p>Resources, or attributes for resources specified using system properties will override definitions specified in <code>tomee.xml</code>.
Server-wide resources can be looked up in JNDI under the following name: openejb:Resources/resource id.</p>
<h1>Defining Resources</h1>
<p><a name="DefiningResources"></a></p>
<p>The <code>&lt;Resource&gt;</code> tag has a number of attributes, and a resource may also have a number of fields that can be configured by adding properties to the body of the <code>Resource</code> tag.</p>
<p>For example, a DataSource resource needs a JDBC driver, URL, username and password to be able to connect to a database. That would be configured with the following syntax. Notice the key/value pair syntax for the properties within the <code>&lt;Resource&gt;</code> tag.</p>
<pre><code>&lt;Resource id="DB" type="DataSource"&gt;
JdbcDriver com.mysql.jdbc.Driver
JdbcUrl jdbc:mysql://localhost/test
UserName test
Password password
&lt;/Resource&gt;
</code></pre>
<p>Specifying the key/value pairs specific to a Resource can also be done when defining the resource via system properties. This is done be specifying an additional property for each key/value pair, using the resource ID as a prefix: <code>&lt;resourceId&gt;.&lt;propertyName&gt;=&lt;value&gt;</code>. The system properties equivalent of the resource above is:</p>
<pre><code>p.setProperty("DB", "new://Resource?type=DataSource");
p.setProperty("DB.JdbcDriver", "com.mysql.jdbc.Driver");
p.setProperty("DB,JdbcUrl", "jdbc:mysql://localhost/test");
p.setProperty("DB.UserName", "test");
p.setProperty("DB.Password", "password");
</code></pre>
<p>The <code>&lt;Resource&gt;</code> tag has a number of attributes which control the way that the resource get created.</p>
<ul>
<li>type</li>
</ul>
<p>A type that TomEE knows. The type is associated with a provider that knows how to create that type, and also any default properties that the resource should have if they are not specified in the resource definition. See <a href="https://github.com/apache/tomee/blob/tomee-1.7.x/tomee/tomee-webapp/src/main/resources/META-INF/org.apache.tomee/service-jar.xml">service-jar.xml</a> for an example set of service providers that come with TomEE.</p>
<ul>
<li>provider</li>
</ul>
<p>Explicitly specifies a provider to create the resource, using defaults for any properties not specified.</p>
<ul>
<li>class-name</li>
</ul>
<p>The fully qualified class that creates the resource. This might the resource class itself, which is created by calling the constructor, or a factory class that provides a specific factory method to create the resource.</p>
<ul>
<li>factory-name</li>
</ul>
<p>The name of the method to call to create the resource. If this is not specified, the constructor for the class specified by class-name will be used.</p>
<ul>
<li>constructor</li>
</ul>
<p>Specifies a comma separated list of constructor arguments. These can be other services, or attributes on the resource itself.</p>
<h1>Custom resources</h1>
<p>TomEE allows you to define resources using your own Java classes, and these can also be injected into managed components in the same way as known resource types are.</p>
<p>So the following simple resource</p>
<pre><code>public class Configuration {
private String url;
private String username;
private int poolSize;
// getters and setters
}
</code></pre>
<p>Can be defined in <code>tomee.xml</code> using the following configuration (note the <code>class-name</code> attribute):</p>
<pre><code>&lt;Resource id="config" class-name="org.superbiz.Configuration"&gt;
url http://localhost
username tomee
poolSize 20
&lt;/Resource&gt;
</code></pre>
<p>This resource must be available in TomEE's system classpath - i.e. it must be defined in a .jar within the <code>lib/</code> directory.</p>
<h1>Field and properties</h1>
<p>As shown above, a resource class can define a number of fields, and TomEE will attempt to apply the values from the resource definition onto those fields.</p>
<p>As an alternative to this, you can also add a properties field as shown below, and this will have any used properties from the resource configuration set added to it. So as an alternative to the above code, you could do:</p>
<pre><code>public class Configuration {
private Properties properties;
public Properties getProperties() {
return properties;
}
public void setProperties(final Properties properties) {
this.properties = properties;
}
}
</code></pre>
<p>Using the same resource definition:</p>
<pre><code>&lt;Resource id="config" class-name="org.superbiz.Configuration"&gt;
url http://localhost
username tomee
poolSize 20
&lt;/Resource&gt;
</code></pre>
<p>the url, username and poolSize values will now be available in the properties field, so for example, the username property could be accessed via properties.getProperty("username");</p>
<h1>Application resources</h1>
<p>Resources can also be defined within an application, and optionally use classes from the application's classpath. To define resources in a .war file, include a <code>WEB-INF/resources.xml</code>. For an ejb-jar module, use <code>META-INF/resources.xml</code>.</p>
<p>The format of <code>resources.xml</code> uses the same <code>&lt;Resource&gt;</code> tag as <code>tomee.xml</code>. One key difference is the root element of the XML is <code>&lt;resources&gt;</code> and not <code>&lt;tomee&gt;</code>.</p>
<pre><code>&lt;resources&gt;
&lt;Resource id="config" class-name="org.superbiz.Configuration"&gt;
url http://localhost
username tomee
poolSize 20
&lt;/Resource&gt;
&lt;/resources&gt;
</code></pre>
<p>This mechanism allows you to package your custom resources within your application, alongside your application code, rather than requiring a .jar file in the <code>lib/</code> directory.</p>
<p>Application resources are bound in JNDI under openejb:Resource/appname/resource id.</p>
<h1>Additional resource properties</h1>
<p>Resources are typically discovered, created, and bound to JNDI very early on in the deployment process, as other components depend on them. This may lead to problems where the final classpath for the application has not yet been determined, and therefore TomEE is unable to load your custom resource. </p>
<p>The following properties can be used to change this behavior.</p>
<ul>
<li>Lazy</li>
</ul>
<p>This is a boolean value, which when true, creates a proxy that defers the actual instantiation of the resource until the first time it is looked up from JNDI. This can be useful if the resource's classpath until the application is started (see below), or to improve startup time by not fully initializing resources that might not be used.</p>
<ul>
<li>UseAppClassLoader </li>
</ul>
<p>This boolean value forces a lazily instantiated resource to use the application classloader, instead of the classloader available when the resources were first processed.</p>
<ul>
<li>InitializeAfterDeployment</li>
</ul>
<p>This boolean setting forces a resource created with the Lazy property to be instantiated once the application has started, as opposed to waiting for it to be looked up. Use this flag if you require the resource to be loaded, irrespective of whether it is injected into a managed component or manually looked up.</p>
<p>By default, all of these settings are <code>false</code>, unless TomEE encounters a custom application resource that cannot be instantiated until the application has started. In this case, it will set these three flags to <code>true</code>, unless the <code>Lazy</code> flag has been explicitly set.</p>
<h1>Initializing resources</h1>
<h2>constructor</h2>
<p>By default, if no factory-name attribute and no constructor attribute is specified on the <code>Resource</code>, TomEE will instantiate the resource using its no-arg constructor. If you wish to pass constructor arguments, specify the arguments as a comma separated list:</p>
<pre><code>&lt;Resource id="config" class-name="org.superbiz.Configuration" constructor="id, poolSize"&gt;
url http://localhost
username tomee
poolSize 20
&lt;/Resource&gt;
</code></pre>
<h2>factory-name method</h2>
<p>In some circumstances, it may be desirable to add some additional logic to the creation process, or to use a factory pattern to create resources. TomEE also provides this facility via the <code>factory-name</code> method. The <code>factory-name</code> attribute on the resource can reference any no argument method that returns an object on the class specified in the <code>class-name</code> attribute.</p>
<p>For example:</p>
<pre><code>public class Factory {
private Properties properties;
public Object create() {
MyResource resource = new MyResource();
// some custom logic here, maybe using this.properties
return resource;
}
public Properties getProperties() {
return properties;
}
public void setProperties(final Properties properties) {
this.properties = properties;
}
}
&lt;resources&gt;
&lt;Resource id="MyResource" class-name="org.superbiz.Factory" factory-name="create"&gt;
UserName tomee
&lt;/Resource&gt;
&lt;/resources&gt;
</code></pre>
<h2>@PostConstruct / @PreDestroy</h2>
<p>As an alternative to using a factory method or a constructor, you can use @PostConstruct and @PreDestroy methods within your resource class (note that you cannot use this within a different factory class) to manage any additional creation or cleanup activities. TomEE will automatically call these methods when the application is started and destroyed. Using @PostConstruct will effectively force a lazily loaded resource to be instantiated when the application is starting - in the same way that the <code>InitializeAfterDeployment</code> property does.</p>
<pre><code>public class MyClass {
private Properties properties;
public Properties getProperties() {
return properties;
}
public void setProperties(final Properties properties) {
this.properties = properties;
}
@PostConstruct
public void postConstruct() throws MBeanRegistrationException {
// some custom initialization
}
}
}
</code></pre>
<h1>Examples</h1>
<p>The following examples demonstrate including custom resources within your application:</p>
<ul>
<li>resources-jmx-example</li>
<li>resources-declared-in-webapp</li>
</ul>
<div id="edit" class="modal hide fade in" style="display: none; ">
<div class="modal-header">
<a class="close" data-dismiss="modal">x</a>
<h3>Thank you for contributing to the documentation!</h3>
</div>
<div class="modal-body">
<h4>Any help with the documentation is greatly appreciated.</h4>
<p>All edits are reviewed before going live, so feel free to do much more than fix typos or links. If you see a page that could benefit from an entire rewrite, we'd be thrilled to review it. Don't be surprised if we like it so much we ask you for help with other pages :)</p>
<small>NOTICE: unless indicated otherwise on the pages in question, all editable content available from apache.org is presumed to be licensed under the Apache License (AL) version 2.0 and hence all submissions to apache.org treated as formal Contributions under the license terms.</small>
<!--[if gt IE 6]>
<h4>Internet Explorer Users</h4>
<p>If you are not an Apache committer, click the Yes link and enter a <i>anonymous</i> for the username and leave the password empty</p>
<![endif]-->
</div>
<div class="modal-footer">
Do you have an Apache ID?
<a href="javascript:void(location.href='https://cms.apache.org/redirect?uri='+escape(location.href))" class="btn">Yes</a>
<a href="javascript:void(location.href='https://anonymous:@cms.apache.org/redirect?uri='+escape(location.href))" class="btn">No</a>
</div>
</div>
<script src="./resources/js/bootstrap-modal.js"></script>
<footer>
<p>Copyright &copy; 1999-2016 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.
Apache TomEE, TomEE, Apache, the Apache feather logo, and the Apache TomEE project logo are trademarks of The Apache Software Foundation.
All other marks mentioned may be trademarks or registered trademarks of their respective owners.</p>
</footer>
</div> <!-- /container -->
<!-- Javascript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="./resources/js/bootstrap-dropdown.js"></script>
</body>
</html>