blob: b64ae9f203fdaacc336d2f0143caf631d95f91a2 [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>@AccessTimeout a forma Meta-anotação</h1>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="sect1">
<h2 id="_indrodução">Indrodução</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Qualquer anotação que recebe parâmetros podem se beneficiar das meta-anotações. Aquí observamos como <code>@AccessTimeout</code> pode ser mais fácil de entender e administrar mediante meta-anotações.
Usaremos [access-timeout](../access-timeout/README.html) como nosso exemplo de caso de uso.</p>
</div>
<div class="paragraph">
<p>O valor dos parâmetros do fornecido para o <code>@AccessTimeout</code> tem um efeito dramático em que a anotação realmente faz. Além disso, <code>@ AccessTimeout</code> tem um desses designs
onde <code>-1</code> e <code>0</code> tem um significado totalmente diferente. Um quer dizer "espere para sempre", o outro "nunca espere". Só alguns com sorte podem lembrar qual é qual.
Para o resto de nós é uma fonte constante de erros.</p>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<i class="fa icon-tip" title="Tip"></i>
</td>
<td class="content">
Meta-Anotações. ao resgate!
</td>
</tr>
</table>
</div>
</div>
</div>
<div class="sect1">
<h2 id="__strong_em_criando_meta_anotações_em_strong"><strong><em>Criando Meta-Anotações.</em></strong></h2>
<div class="sectionbody">
<div class="paragraph">
<p>Com respeito as melhores práticas, colocaremos nossas meta-anotações em um pacote chamado <code>api</code>, para este exemplo que nós da <code>org.superbiz.accesstimeout.api</code>. O pacote <code>org.superbiz.api</code> também vai funcionar.</p>
</div>
<div class="paragraph">
<p>A ideia básica é ter um pacote onde anotações "aprovadas" sejam usadas e proibir uso de versões não-meta-anotações. Toda a configuração
estará centralizada no pacote <code>api</code> e alterações nos valores de tempo limite estarão localizadas nesse pacote e refletidas automaticamente em todo o aplicativo.</p>
</div>
<div class="paragraph">
<p>Um efeito secundário interessante desta abordagem é que se o pacote <code>api</code> onde as definições de meta-anotação existem localizados em um jar separado, então efetivamente alguém
pode trocar toda a configuração de uma aplicação simplesmente substituindo o jar <code>api</code>.</p>
</div>
<div class="sect2">
<h3 id="__metatype_span_class_small_a_meta_anotação_root_span">@Metatype <span class="small">A Meta-Anotação "root"</span></h3>
<div class="paragraph">
<p>Como todo o uso de meta-anotação, primeiro devemos criar nossa própria meta-anotação "root". Isto é tão facil como criar uma anotação
chamada <code>Metatype</code> que esta anotada com esta mesma anotação e tem um <code>ElementType.ANNOTATION_TYPE</code> como seu objetivo.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">package org.superbiz.accesstimeout.api;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Metatype
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Metatype {
}</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="__awaitnever">@AwaitNever</h3>
<div class="paragraph">
<p>Quando a anotação <code>@AccessTimeout</code> tem o valor de <code>0</code> que tem a implicação que nunca deve esperar para acessar o bean. Se o bean esta ocupado, aquele que o chama imediatamente
receberá uma <code>ConcurrentAccessException</code>. Isto é difícil de lembrar e definitivamente não é auto-documentado para aqueles que nunca conheceram os detalhes.</p>
</div>
<div class="paragraph">
<p>Para criar uma versão de meta-anotação <code>@AccessTimeout(0)</code> nós simplesmente devemos pensar um bom nome de anotação, criar essa anotação e anota-la com ambas <code>@AccessTimeout</code>
e <code>@Metatype</code></p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">package org.superbiz.accesstimeout.api;
import javax.ejb.AccessTimeout;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Metatype
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@AccessTimeout(0)
public @interface AwaitNever {
}</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="__awaitforever">@AwaitForever</h3>
<div class="paragraph">
<p>Assim como <code>0</code> tem seu significado especial como "nunca esperar" , o valor de <code>-1</code> quer dizer "espere para sempre."</p>
</div>
<div class="paragraph">
<p>Enquanto estamos exigindo, o que podemos fazer com meta-anotações,
tecnicamente "espere para sempre" não é a melhor descrição. Atualmente os métodos de <code>javax.util.concurrent</code> APIs usam "await" em vez de "wait". Um (wait) provavelmente implica
um comando de espera, que neste caso não é , o outro (await) em vez disso, significa que esperar é possível, mas não é certo. Então, usaremos "await" no nome de nossas anotações.</p>
</div>
<div class="paragraph">
<p>Nós fazemos o nosso próprio <code>@AwaitForever</code> e a anotamos com <code>@AccessTimeout(0)</code> e <code>@Metatype</code></p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">package org.superbiz.accesstimeout.api;
import javax.ejb.AccessTimeout;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Metatype
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@AccessTimeout(-1)
public @interface AwaitForever {
}</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="__awaitbriefly">@AwaitBriefly</h3>
<div class="paragraph">
<p>Tanto os valores de <code>-1</code> e <code>0</code> a <code>@AccessTimeout</code> eles não incluem o escopo completo da anotação. Aqui é onde podemos especificar o máximo de minutos , segundos,
milisegundos,etc. onde se pode esperar acessar a instância do bean.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">@Metatype
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
@AccessTimeout(value = 5, unit = TimeUnit.SECONDS)
public @interface AwaitBriefly {
}</code></pre>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_configuração_vs_operação">Configuração vs Operação</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Depois de criar algumas meta-anotações e a diversão se tornar vulgar, você começa a se perguntar qual será a melhor maneira de se beneficiar das meta-anotações.</p>
</div>
<div class="paragraph">
<p>Você realmente tem que começar a pensar como você quer usar a meta-anotação e colocar o chapéu de designer. O dilema fundamental é
<strong>configuração vs operação</strong> e a resposta é subjetiva; Quanta flexibilidade você deseja projetar em sua aplicação e onde?</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_nomes_de_configuração_span_class_small_descrevendo_a_configuração_span">Nomes de configuração <span class="small">descrevendo a configuração</span></h2>
<div class="sectionbody">
<div class="paragraph">
<p>A abordagem mais simples é chamar suas meta-anotações depois da <strong>configuração</strong> que encapsulam. Nós seguimos este formato até agora com <code>@AwaitNever</code> e <code>@AwaitForever</code>
para que seja claro o conteúdo de cada meta-anotação (<code>@AccessTimeout(-1)</code> e <code>@AccessTimeout(0)</code> respectivamente).</p>
</div>
<div class="paragraph">
<p>Os <strong>contras</strong> desta abordagem é que você vai querer alterar as configurações deste aplicativo apenas alterando as meta-anotações&#8201;&#8212;&#8201;este é um dos grandes beneficios
das meta-anotações&#8201;&#8212;&#8201;mas isto podería trocar o significado da anotação. Certamente , a anotação <code>@AwaitNever</code> não pode ter outro valor que '0' se estiver na altura do nome.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_nomes_de_operação_span_class_small_descrevendo_o_código_span">Nomes de operação <span class="small">descrevendo o código</span></h2>
<div class="sectionbody">
<div class="paragraph">
<p>A abordagem alternativa é chamar as meta-anotações depois de <strong>operações</strong> a que se aplica. Brevemente descrever, descrever o próprio código e não a configuração. Assim que,
nomes como <code>@OrderCheckTimeout</code> ou <code>@TwitterUpdateTimeout</code>. Estes nomes são provas de troca de configuração. Isso não mudará se a configuração mudar e, de fato, eles podem facilitar o controle de
localizador de grãos sobre a configuração do aplicativo.</p>
</div>
<div class="paragraph">
<p>Os <strong>contras</strong> desta abordagem é que requer muito mais deliberação e consideração, se, mencionar mais anotações. Suas habilidades como arquiteto, designer e capacidade de pensar como
administrador serão postas a prova. Você tem que ser bom para usar o chapéu dev-ops.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_pragmatismo_span_class_small_o_melhor_dos_dois_mundos_span">Pragmatismo <span class="small">o melhor dos dois mundos</span></h2>
<div class="sectionbody">
<div class="paragraph">
<p>Felizmente, as meta-anotações são recursivas. Você pode fazer um pouco dos dois.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">@Metatype
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@AwaitBriefly
public @interface TwitterUpdateTimeout {
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>Claro ainda temos que ser muito deliberado em como usar as anotações. Quando se usa uma "configuração" chamada meta-anotação no código pode ser usada para dizer a si mesmo
"Você não quer reconfigurá-lo depois". Se isso não parecer certo, faça um esforço extra para criar uma operação chamada anotação e use-a no código.</p>
</div>
</div>
</div>
<h1 id="_aplicando_a_meta_anotação" class="sect0">Aplicando a Meta-Anotação</h1>
<div class="paragraph">
<p>Juntando tudo , talvez assim é como deveríamos aplicar nossas meta-anotações para o exemplo [access-timeout](../access-timeout/README.html).</p>
</div>
<div class="sect2">
<h3 id="_antes">Antes</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">package org.superbiz.accesstimeout;
import javax.ejb.AccessTimeout;
import javax.ejb.Asynchronous;
import javax.ejb.Lock;
import javax.ejb.Singleton;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import static javax.ejb.LockType.WRITE;
/**
* @version $Revision$ $Date$
*/
@Singleton
@Lock(WRITE)
public class BusyBee {
@Asynchronous
public Future stayBusy(CountDownLatch ready) {
ready.countDown();
try {
new CountDownLatch(1).await();
} catch (InterruptedException e) {
Thread.interrupted();
}
return null;
}
@AccessTimeout(0)
public void doItNow() {
// do something
}
@AccessTimeout(value = 5, unit = TimeUnit.SECONDS)
public void doItSoon() {
// do something
}
@AccessTimeout(-1)
public void justDoIt() {
// do something
}
}</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_depois">Depois</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">package org.superbiz.accesstimeout;
import org.superbiz.accesstimeout.api.AwaitBriefly;
import org.superbiz.accesstimeout.api.AwaitForever;
import org.superbiz.accesstimeout.api.AwaitNever;
import javax.ejb.Asynchronous;
import javax.ejb.Lock;
import javax.ejb.Singleton;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Future;
import static javax.ejb.LockType.WRITE;
/**
* @version $Revision$ $Date$
*/
@Singleton
@Lock(WRITE)
public class BusyBee {
@Asynchronous
public Future stayBusy(CountDownLatch ready) {
ready.countDown();
try {
new CountDownLatch(1).await();
} catch (InterruptedException e) {
Thread.interrupted();
}
return null;
}
@AwaitNever
public void doItNow() {
// do something
}
@AwaitBriefly
public void doItSoon() {
// do something
}
@AwaitForever
public void justDoIt() {
// do something
}
}</code></pre>
</div>
</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/" 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>