This is an automated email from the ASF dual-hosted git repository.
jlmonteiro pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tomee.git
The following commit(s) were added to refs/heads/master by this push:
new 5e0e5ab Translate to Portuguese: examples/access-timeout.
new b13c9e0 Merge pull request #507 from gabrielferreirapro/TOMEE-2534
5e0e5ab is described below
commit 5e0e5abfa699aef348e57081602fbc1afe972930
Author: Gabriel Ferreira <[email protected]>
AuthorDate: Tue Jul 9 08:10:25 2019 -0300
Translate to Portuguese: examples/access-timeout.
---
examples/access-timeout/README_pt.adoc | 217 +++++++++++++++++++++++++++++++++
1 file changed, 217 insertions(+)
diff --git a/examples/access-timeout/README_pt.adoc
b/examples/access-timeout/README_pt.adoc
new file mode 100644
index 0000000..f7f9ae0
--- /dev/null
+++ b/examples/access-timeout/README_pt.adoc
@@ -0,0 +1,217 @@
+= Anotação @AccessTimeout
+:index-group: EJB
+:jbake-type: page
+:jbake-status: published
+
+Antes de darmos uma olhada no `@AccessTimeout`, pode ajudar entender quando
uma chamada precisa "esperar".
+
+== Esperando...
+
+=== Stateful Bean
+
+[note]
+
+NOTE: Por padrão, é permitido que clientes façam chamadas concorrentes para um
stateful session object e o container é requerido para serializar cada
requisição concorrente. O container nunca permite acesso multi-thread a
instancia de um componente stateful. Por essa razão, métodos de leitura/escrita
bloqueiam metadados assim como componentes que gerenciam a própria concorrência
(bean-managed concurrency) não são aplicáveis a um stateful session bean e não
devem ser usados.
+
+Isso significa que quando um método `foo()` de uma instancia stateful esta
sendo executado e uma chega uma segunda requisição para esse ou outro método, o
container EJB serializa a segunda requisição. Isso não permite com que o método
seja executado concorrentemente mas espere ate o primeiro método ser processado.
+
+O cliente também tem de esperar quando o bean `@Stateful` esta em uma
transação e o cliente o invocar de fora dessa transação.
+
+=== Stateless Bean
+
+Se existir 20 instancias de um bean no pool e todas elas estiverem ocupadas,
quando uma nova requisição chegar, o processo *tem de esperar* ate algum bean
estar disponível no pool. (Nota: a semântica de pool, se houver, não é coberta
pela especificação. O server vendor pode ou não envolver uma condição de espera)
+
+=== Singleton Bean
+
+O container força um acesso single-thread por padrão para um componente
singleton. Isso é parecido com o que a anotação `@Lock(WRITE)` faz. Quando um
método anotado com `@Lock(WRITE)` é executado, todos os outros métodos
`@Lock(WRITE)` e `@Lock(READ)` que são chamados tem de esperar até que ele
termine sua execução.
+
+=== Resumindo
+
+ - `@Singleton` - Um método `@Lock(WRITE)` esta sendo invocado e o
gerenciamento de concorrência pelo container esta sendo usado. Todos os métodos
sao `@Lock(WRITE)` por padrão.
+ - `@Stateful` - Qualquer método de uma instancia pode estar sendo utilizado e
uma segunda chamada pode acontecer. Ou o bean `@Stateful` esta em uma transação
e o cliente o chama de fora dessa transação.
+ - `@Stateless` - Sem instancias disponíveis no pool. Como observado, a
semântica de pool (se houver) não é coberta pela especificação. Caso exista uma
semântica no server vendor que envolva uma condição de espera, a anotação
`@AccessTimeout` deveria ser aplicada.
+
+== `@AccessTimeout`
+
+A anotação `@AccessTimeout` é simplesmente uma conveniência em torno da tupla
`long` e `TimeUnit` comumente usadas na `java.util.concurrent` API.
+
+[source,java,numbered]
+----
+import java.util.concurrent.TimeUnit;
+@Target({METHOD, TYPE})
+@Retention(RUNTIME)
+public @interface AccessTimeout {
+ long value();
+ TimeUnit unit() default TimeUnit.MILLISECONDS;
+}
+----
+
+== Uso
+
+Um método ou uma classe pode ser anotada com `@AccessTimeout` para especificar
o temo máximo que uma chamada deve esperar para acessar o bean quando acontecer
uma condição de espera.
+
+A semântica para o `value` é a seguinte:
+
+ - `value` > 0 indica um tempo de espera que é especificado pelo elemento
`unit`.
+ - `value` de 0 significa que acesso concorrente não é permitido.
+ - `value` de -1 indica que a chamada do cliente vai ficar bloqueada por tempo
indeterminado ate que possa proceder.
+
+Simples!
+
+NOTE: Quando acontecer um timeout, qual exceção o cliente recebe?
+Citando a especificação: "if a client-invoked business method is in progress
on an instance when another client-invoked call, from the same or different
client, arrives at the same instance of a stateful session bean, if the second
client is a client of the bean's business interface or no-interface view, the
concurrent invocation must result in the second client receiving a
javax.ejb.ConcurrentAccessException[15]. If the EJB 2.1 client view is used,
the container must throw a java.rmi.Re [...]
+Ou seja pode receber `javax.ejb.ConcurrentAccessException`. Ou no caso de EJB
2.1 estar sendo utilizado pode receber `java.rmi.RemoteException` se for um
cliente externo ou `javax.ejb.EJBException` se for local.
+
+=== Sem padrão
+
+Note que o atributo `value` não tem um valor padrão. Isso foi intencional,
tendo a intenção de informar que se o `@AccessTimeout` não for explicitamente
usado, o comportamento sera o do server vendor.
+
+Alguns servidores vão esperar por um tempo pre determinado e lançar a exceção
`javax.ejb.ConcurrentAccessException`, outros podem lançar de imediato.
+
+== Exemplo
+
+Aqui nos temos um simples `@Singleton` bean que possui tres métodos síncronos
e um método anotado com `@Asynchronous`. O componente esta anotado com
`@Lock(WRITE)` então apenas uma thread pode acessar o `@Singleton` por vez.
Este é o comportamento padrão de um componente `@Singleton`, então usar a
anotação `@Lock(WRITE)` não é necessário mas é importante para deixar claro que
o componente tem um comportamento single-thread.
+
+[source,java,numbered]
+----
+@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() {
+ // faz alguma coisa
+ }
+
+ @AccessTimeout(value = 5, unit = TimeUnit.SECONDS)
+ public void doItSoon() {
+ // faz alguma coisa
+ }
+
+ @AccessTimeout(-1)
+ public void justDoIt() {
+ // faz alguma coisa
+ }
+}
+----
+
+O método `@Asynchronous` não tem uma relação direta com o `@AccessTimeout`,
mas serve como uma forma simple de travar ("lockar") o bean para realizarmos o
teste. Ele nos permite testar o comportamento concorrente do componente.
+
+[source,java,numbered]
+----
+public class BusyBeeTest extends TestCase {
+
+ public void test() throws Exception {
+
+ final Context context = EJBContainer.createEJBContainer().getContext();
+
+ final CountDownLatch ready = new CountDownLatch(1);
+
+ final BusyBee busyBee = (BusyBee)
context.lookup("java:global/access-timeout/BusyBee");
+
+ // Esse método assíncrono nunca termina.
+ busyBee.stayBusy(ready);
+
+ // Você ainda esta trabalhando abelhinha?
+ ready.await();
+
+
+ // Beleza, a abelha esta ocupada.
+
+
+ { // Timeout imediato
+ final long start = System.nanoTime();
+
+ try {
+ busyBee.doItNow();
+
+ fail("A abelha continua ocupada");
+ } catch (Exception e) {
+ // A abelha continua muito ocupada como esperado.
+ }
+
+ assertEquals(0, seconds(start));
+ }
+
+ { // Timeout em 5 segundos
+ final long start = System.nanoTime();
+
+ try {
+ busyBee.doItSoon();
+
+ fail("A abelha deve estar ocupada");
+ } catch (Exception e) {
+ // A abelha continua ocupada como esperado.
+ }
+
+ assertEquals(5, seconds(start));
+ }
+
+ // Esse método vai te fazer esperar para sempre, apenas teste se
estiver com bastante tempo :D
+ // busyBee.justDoIt();
+ }
+
+ private long seconds(long start) {
+ return TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - start);
+ }
+}
+----
+
+== Executando
+
+[source,bash]
+----
+mvn clean test
+----
+
+=== Saida
+[source,bash]
+----
+-------------------------------------------------------
+ T E S T S
+-------------------------------------------------------
+Running org.superbiz.accesstimeout.BusyBeeTest
+Apache OpenEJB 4.0.0-beta-1 build: 20111002-04:06
+http://tomee.apache.org/
+INFO - openejb.home = /Users/dblevins/examples/access-timeout
+INFO - openejb.base = /Users/dblevins/examples/access-timeout
+INFO - Using 'javax.ejb.embeddable.EJBContainer=true'
+INFO - Configuring Service(id=Default Security Service, type=SecurityService,
provider-id=Default Security Service)
+INFO - Configuring Service(id=Default Transaction Manager,
type=TransactionManager, provider-id=Default Transaction Manager)
+INFO - Found EjbModule in classpath:
/Users/dblevins/examples/access-timeout/target/classes
+INFO - Beginning load: /Users/dblevins/examples/access-timeout/target/classes
+INFO - Configuring enterprise application:
/Users/dblevins/examples/access-timeout
+INFO - Configuring Service(id=Default Singleton Container, type=Container,
provider-id=Default Singleton Container)
+INFO - Auto-creating a container for bean BusyBee: Container(type=SINGLETON,
id=Default Singleton Container)
+INFO - Configuring Service(id=Default Managed Container, type=Container,
provider-id=Default Managed Container)
+INFO - Auto-creating a container for bean
org.superbiz.accesstimeout.BusyBeeTest: Container(type=MANAGED, id=Default
Managed Container)
+INFO - Enterprise application "/Users/dblevins/examples/access-timeout" loaded.
+INFO - Assembling app: /Users/dblevins/examples/access-timeout
+INFO -
Jndi(name="java:global/access-timeout/BusyBee!org.superbiz.accesstimeout.BusyBee")
+INFO - Jndi(name="java:global/access-timeout/BusyBee")
+INFO -
Jndi(name="java:global/EjbModule748454644/org.superbiz.accesstimeout.BusyBeeTest!org.superbiz.accesstimeout.BusyBeeTest")
+INFO -
Jndi(name="java:global/EjbModule748454644/org.superbiz.accesstimeout.BusyBeeTest")
+INFO - Created Ejb(deployment-id=org.superbiz.accesstimeout.BusyBeeTest,
ejb-name=org.superbiz.accesstimeout.BusyBeeTest, container=Default Managed
Container)
+INFO - Created Ejb(deployment-id=BusyBee, ejb-name=BusyBee, container=Default
Singleton Container)
+INFO - Started Ejb(deployment-id=org.superbiz.accesstimeout.BusyBeeTest,
ejb-name=org.superbiz.accesstimeout.BusyBeeTest, container=Default Managed
Container)
+INFO - Started Ejb(deployment-id=BusyBee, ejb-name=BusyBee, container=Default
Singleton Container)
+INFO - Deployed Application(path=/Users/dblevins/examples/access-timeout)
+Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 6.071 sec
+
+Results :
+
+Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
+----
\ No newline at end of file