blob: ff6b8b671eef89b6b7151c59021b1db7a0567f51 [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Apache TomEE</title>
<meta name="description"
content="Apache TomEE is a lightweight, yet powerful, JavaEE Application server with feature rich tooling." />
<meta name="keywords" content="tomee,asf,apache,javaee,jee,shade,embedded,test,junit,applicationcomposer,maven,arquillian" />
<meta name="author" content="Luka Cvetinovic for Codrops" />
<link rel="icon" href="../../favicon.ico">
<link rel="icon" type="image/png" href="../../favicon.png">
<meta name="msapplication-TileColor" content="#80287a">
<meta name="theme-color" content="#80287a">
<link rel="stylesheet" type="text/css" href="../../css/normalize.css">
<link rel="stylesheet" type="text/css" href="../../css/bootstrap.css">
<link rel="stylesheet" type="text/css" href="../../css/owl.css">
<link rel="stylesheet" type="text/css" href="../../css/animate.css">
<link rel="stylesheet" type="text/css" href="../../fonts/font-awesome-4.1.0/css/font-awesome.min.css">
<link rel="stylesheet" type="text/css" href="../../fonts/eleganticons/et-icons.css">
<link rel="stylesheet" type="text/css" href="../../css/jqtree.css">
<link rel="stylesheet" type="text/css" href="../../css/idea.css">
<link rel="stylesheet" type="text/css" href="../../css/cardio.css">
<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="preloader">
<img src="../../img/loader.gif" alt="Preloader image">
</div>
<nav class="navbar">
<div class="container">
<div class="row"> <div class="col-md-12">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/">
<span>
<img src="../../img/logo-active.png">
</span>
Apache TomEE
</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav navbar-right main-nav">
<li><a href="../../docs.html">Documentation</a></li>
<li><a href="../../community/index.html">Community</a></li>
<li><a href="../../security/security.html">Security</a></li>
<li><a href="../../download-ng.html">Downloads</a></li>
</ul>
</div>
<!-- /.navbar-collapse -->
</div></div>
</div>
<!-- /.container-fluid -->
</nav>
<div id="main-block" class="container main-block">
<div class="row title">
<div class="col-md-12">
<div class='page-header'>
<h1>Deployment ID</h1>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<h1 id="_what_is_a_deployment_id" class="sect0">What is a Deployment ID?</h1>
<div class="paragraph">
<p>Every bean deployed in OpenEJB has a unique deployment-id that
identifies it within the scope of the entire container system. The
server and container system refer beans at run-time using the bean&#8217;s
deployment id.</p>
</div>
<div class="sect1">
<h2 id="_like_ejb_name">Like ejb-name</h2>
<div class="sectionbody">
<div class="paragraph">
<p>This deployment id is much like the element of the ejb-jar.xml , with
one very important difference. The is only required to be unique within
the scope of the ejb-jar.xml in the bean&#8217;s jar. The deployment id is
required to be unique across all beans and jars in OpenEJB. This is a
subtle, but important, distinction.</p>
</div>
<div class="paragraph">
<p>Remember that the EJB specification was designed so that enterprise
beans could be create, packaged, and sold by vendors (EJB Providers).
Furthermore, users should be able to buy a packaged set of beans (a jar
with an ejb-jar.xml in it) and deploy it into an EJB Container without
modification.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_the_ejb_name_is_not_unique">The ejb-name is not unique</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Let&#8217;s consider this, what happens if two vendors each sell a package
(jar) that contains a bean with the PurchaseOrder? Both are completely
different in terms functionality and are different beans in every other
respect. The EJB spec says, this is fine, ejb-names only have to unique
within the jar and that jar&#8217;s ejb-jar.xml file. It&#8217;s ridiculous to
expect EJB Providers to call each other up and ask, "Are you already
using the name 'PurchaseOrder' in your jar?" Remember that the EJB
specification was designed so that enterprise beans could be create,
packaged, and sold by vendors (EJB Providers). Furthermore, users should
be able to buy a packaged set of beans (a jar with an ejb-jar.xml in it)
and deploy it into an EJB Container without modification. This is all
fine and dandy, but it still leaves it up to the EJB Container/Server
providers to settle the difference.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_the_deployment_id_is_unique">The deployment-id is unique</h2>
<div class="sectionbody">
<div class="paragraph">
<p>OpenEJB solves this with the OpenEJB-specific deployment id. By
requiring that each bean deployed into OpenEJB has a unique name, we can
guarantee that we are always referring to the right bean at all times.
Furthermore, it allows you to deploy different versions of the same
package several times in the same container system, each time giving the
beans new deployment ids.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_using_ejb_name_as_deployment_id_anyway">Using ejb-name as deployment-id anyway</h2>
<div class="sectionbody">
<div class="paragraph">
<p>If you&#8217;re lazy&#8201;&#8212;&#8201;as any truly great programmer should be&#8201;&#8212;&#8201;and don&#8217;t
want to type a deployment id for each bean every time you deploy a jar,
you can use the -D option of the Deploy Tool. This will throw caution to
the wind, and automatically assign the bean&#8217;s ejb-name as the value of
the bean&#8217;s OpenEJB deployment id. This leaves up to you to guarantee
that bean&#8217;s ejb-name will be unique across all beans and jars in the
container system. In other words, be very careful with the -D option!</p>
</div>
</div>
</div>
<h1 id="_how_is_it_used" class="sect0">How is it used?</h1>
<div class="sect1">
<h2 id="_in_the_container_system">In the container system</h2>
<div class="sectionbody">
<div class="paragraph">
<p>In the container system, the deployment id is used to index the bean in
a system-wide registry. This registry is refereed to on every call made
in the container system. Being able to safely hash and cache bean
information by id is a must. This stresses the importance of unique ids
for every bean deployed in OpenEJB.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_in_the_local_server">In the Local Server</h2>
<div class="sectionbody">
<div class="paragraph">
<p>The Local (IntraVM) Server is an integral part of the container system
and the two are, in many ways, inseparable. The Local Server takes care
of all bean to bean and client to bean invocations made inside the
virtual machine. For this reason, it often refered to as the IntraVM
Server.</p>
</div>
<div class="paragraph">
<p>For bean to bean communications, the Local Server must create a JNDI
namespace (JNDI ENC) for each bean as defined by the bean&#8217;s , , and
elements of the bean&#8217;s ejb-jar.xml file. Every bean literally gets its
very own JNDI namespace. When a bean makes a JNDI call, the Local Server
intercepts this call and uses the deployment id of the calling bean to
retrieve that bean&#8217;s private JNDI namespace from the container system&#8217;s
index. The Local Server then carries out the lookup on that bean&#8217;s
namespace.</p>
</div>
<div class="paragraph">
<p>All non-bean clients share one big global namespace. Since non-bean
clients are not deployed and do not have a deployment descriptor like an
ejb-jar.xml, the Local Server is unable to taylor a namespace for each
non-bean client as it can for bean clients. The Local server cannot
identify non-bean clients as they have no deployment id. All JNDI calls
made by clients that the Local Server cannot identify go to the public,
global namespace. The public, global JNDI namespace contains all beans
and resources in the container system. name.</p>
</div>
<div class="paragraph">
<p>Each bean is added to the public, global namespace using it&#8217;s deployment
id as its JNDI lookup. For example, if a bean had a deployment-id of
"/my/bean/foo", a non-bean client could lookup that bean as follows.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">...
Object bean = initialContext.lookup("/my/bean/Foo");
...</code></pre>
</div>
</div>
<div class="paragraph">
<p>If a bean in the container system made the above JNDI call, the Local
Server would see the bean&#8217;s identity (deployment id) hidden in the
Thread, go get the bean&#8217;s private JNDI namespace and finish the lookup
on that. Since all names in bean&#8217;s JNDI namespace are required start
with "java:comp/env", the lookup would fail and the bean would receive a
javax.naming.NameNotFoundException.</p>
</div>
<div class="paragraph">
<p>In short&#8230;&#8203;</p>
</div>
<div class="paragraph">
<p>For beans: - Each bean has it&#8217;s own private, personalized JNDI namespace
- The names in it are the same names it uses in its ejb-jar.xml - Beans
can only access their private namespace, period</p>
</div>
<div class="paragraph">
<p>For non-beans (everyone else): - Non-bean clients share the public,
global JNDI namespace - The names in it are the deployment ids of all
the beans - Non-bean clients can only access the one global namespace</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_in_the_remote_server">In the Remote Server</h2>
<div class="sectionbody">
<div class="paragraph">
<p>The Remote Server has a public, global namespace just as the Local
Server does. The difference being that the Remote Server only serves
clients outside the container system and outside the virtual machine.
So, all clients from the perspective of the Remote Server are non-bean
clients. As a result, the Remote Server only has the one public, global
JNDI namespace. Just as in the Local Server, the names in this namespace
consist of the deployment ids of the beans in the container system.</p>
</div>
<div class="paragraph">
<p>Just as before, clients can lookup beans from the Remote Server using
the bean&#8217;s deployment id. For example, if a bean had a deployment-id of
"/my/bean/foo", a client could lookup that bean as follows.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">...
Object bean = initialContext.lookup("/my/bean/Foo");
...</code></pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_in_the_corba_adapter">In the CORBA Adapter</h2>
<div class="sectionbody">
<div class="paragraph">
<p>The CORBA Adapter is separate than the Remote Server. It adapts the
OpenEJB Container System and the Local Server into OpenORB as an
embedded library. It provides users of OpenORB the ability to lookup and
execute beans (EJBs) via the RMI-IIOP protocol. All the EJBHome and
EJBObject interfaces of beans in OpenEJB are implemented by OpenORB as
CORBA stubs and ties.</p>
</div>
<div class="paragraph">
<p>The beans are exported into OpenORB&#8217;s naming service by deployment id.
So, just as with the Local Server and Remote Server, clients can lookup
beans using the bean&#8217;s deployment id. OpenORB has a JNDI implementation
of their naming service, so lookups can be done just as before.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">...
String[] args = ...
// The ORB and Object
org.omg.CORBA.ORB orb = null;
org.omg.CORBA.Object bean = null.
// The Naming Service and Object Name
org.omg.CosNaming.NamingContext context = null;
org.omg.CosNaming.NameComponent[] name = null;
// Get the ORB
orb = org.omg.CORBA.ORB.init( args, null );
// Get the Naming Service
org.omg.CORBA.Object ref = null;
ref = orb.resolve_initial_references("NameService");
context = org.omg.CosNaming.NamingContextHelper.narrow( ref );
// Get the Name as a component
// Note: the string is the bean's deployment id
name = new org.omg.CosNaming.NameComponent[ 1 ];
name[0] = new org.omg.CosNaming.NameComponent("/my/bean/foo","");
// Finally, get the bean as a CORBA object
// Equvalent to an InitialContext.lookup("/my/bean/foo");
bean = context.resolve( name );
...</code></pre>
</div>
</div>
</div>
</div>
<h1 id="_what_happens_if_there_is_a_duplicate_deployment_id" class="sect0">What happens if there is a duplicate deployment ID?</h1>
<div class="paragraph">
<p>The deployment ID uniquely identifies the bean in the OpenEJB container
system. Therefore, no two beans can share the same deployment ID.</p>
</div>
<div class="paragraph">
<p>If a bean attempts to use a deployment ID that is already in use by
another bean, the second bean and all beans in it&#8217;s jar will not be
loaded. In addition, the system will log a warning like the following
one asking you to redeploy the jar and choose an different deployment ID
for the bean.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-properties" data-lang="properties">WARN : Jar C:\openejb\beans\fooEjbs.jar cannot be loaded. The Deployment ID "/my/bean/foo" is already in use. Please redeploy this jar and assign a different deployment ID to the bean with the ejb-name "FooBean".</code></pre>
</div>
</div>
<div class="paragraph">
<p>For example, the acmeEjbs.jar contains a bean with the ejb-name
"DaffyDuckBean". The disneyEjbs.jar contains contains a bean with the
ejb-name "DonaldDuckBean".</p>
</div>
<div class="paragraph">
<p>We deploy the acmeEjbs.jar and give the "DaffyDuckBean" the deployment
ID of "/my/favorite/duck". Sometime afterwards, we deploy the
disneyEjbs.jar and assign the "DonaldDuckBean" the deployment ID
"/my/favorite/duck", having forgotten that we already gave that unique
ID to the "DaffyDuckBean" in the acmeEjbs.jar.</p>
</div>
<div class="paragraph">
<p>When the container system is started, the system will begin loading all
the beans one jar at a time. It will first load the acmeEjbs.jar and
index each bean by deployment ID. But, when the system reaches the
disneyEjbs.jar, it will discover that it cannot index the
"DonaldDuckBean" using the deployment ID "/my/favorite/duck" because
that index is already taken.</p>
</div>
<div class="paragraph">
<p>The system cannot load the "DonaldDuckBean" and must also ignore the
rest of the beans in the disneyEjbs.jar as they may need the
"DonaldDuckBean" bean to function properly. The disneyEjbs.jar is
skipped and the following warning is logged.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-properties" data-lang="properties">WARN : Jar C:\openejb\beans\disneyEjbs.jar cannot be loaded. The Deployment ID "/my/favorite/duck" is already in use. Please redeploy this jar and assign a different deployment ID to the bean with the ejb-name "DonaldDuckBean".</code></pre>
</div>
</div>
</div>
</div>
</div>
<footer>
<div class="container">
<div class="row">
<div class="col-sm-6 text-center-mobile">
<h3 class="white">Be simple. Be certified. Be Tomcat.</h3>
<h5 class="light regular light-white">"A good application in a good server"</h5>
<ul class="social-footer">
<li><a href="https://www.facebook.com/ApacheTomEE/"><i class="fa fa-facebook"></i></a></li>
<li><a href="https://twitter.com/apachetomee"><i class="fa fa-twitter"></i></a></li>
<li><a href="https://plus.google.com/communities/105208241852045684449"><i class="fa fa-google-plus"></i></a></li>
</ul>
</div>
<div class="col-sm-6 text-center-mobile">
<div class="row opening-hours">
<div class="col-sm-3 text-center-mobile">
<h5><a href="../../latest/docs/documentation.html" class="white">Documentation</a></h5>
<ul class="list-unstyled">
<li><a href="../../latest/docs/admin/configuration/index.html" class="regular light-white">How to configure</a></li>
<li><a href="../../latest/docs/admin/file-layout.html" class="regular light-white">Dir. Structure</a></li>
<li><a href="../../latest/docs/developer/testing/index.html" class="regular light-white">Testing</a></li>
<li><a href="../../latest/docs/admin/cluster/index.html" class="regular light-white">Clustering</a></li>
</ul>
</div>
<div class="col-sm-3 text-center-mobile">
<h5><a href="../../latest/examples/" class="white">Examples</a></h5>
<ul class="list-unstyled">
<li><a href="../../latest/examples/simple-cdi-interceptor.html" class="regular light-white">CDI Interceptor</a></li>
<li><a href="../../latest/examples/rest-cdi.html" class="regular light-white">REST with CDI</a></li>
<li><a href="../../latest/examples/ejb-examples.html" class="regular light-white">EJB</a></li>
<li><a href="../../latest/examples/jsf-managedBean-and-ejb.html" class="regular light-white">JSF</a></li>
</ul>
</div>
<div class="col-sm-3 text-center-mobile">
<h5><a href="../../community/index.html" class="white">Community</a></h5>
<ul class="list-unstyled">
<li><a href="../../community/contributors.html" class="regular light-white">Contributors</a></li>
<li><a href="../../community/social.html" class="regular light-white">Social</a></li>
<li><a href="../../community/sources.html" class="regular light-white">Sources</a></li>
</ul>
</div>
<div class="col-sm-3 text-center-mobile">
<h5><a href="../../security/index.html" class="white">Security</a></h5>
<ul class="list-unstyled">
<li><a href="http://apache.org/security" target="_blank" class="regular light-white">Apache Security</a></li>
<li><a href="http://apache.org/security/projects.html" target="_blank" class="regular light-white">Security Projects</a></li>
<li><a href="http://cve.mitre.org" target="_blank" class="regular light-white">CVE</a></li>
</ul>
</div>
</div>
</div>
</div>
<div class="row bottom-footer text-center-mobile">
<div class="col-sm-12 light-white">
<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>
</div>
</div>
</div>
</footer>
<!-- Holder for mobile navigation -->
<div class="mobile-nav">
<ul>
<li><a hef="../../latest/docs/admin/index.html">Administrators</a>
<li><a hef="../../latest/docs/developer/index.html">Developers</a>
<li><a hef="../../latest/docs/advanced/index.html">Advanced</a>
<li><a hef="../../community/index.html">Community</a>
</ul>
<a href="#" class="close-link"><i class="arrow_up"></i></a>
</div>
<!-- Scripts -->
<script src="../../js/jquery-1.11.1.min.js"></script>
<script src="../../js/owl.carousel.min.js"></script>
<script src="../../js/bootstrap.min.js"></script>
<script src="../../js/wow.min.js"></script>
<script src="../../js/typewriter.js"></script>
<script src="../../js/jquery.onepagenav.js"></script>
<script src="../../js/tree.jquery.js"></script>
<script src="../../js/highlight.pack.js"></script>
<script src="../../js/main.js"></script>
</body>
</html>