inicializacao.xml
4.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" []>
<chapter id="inicializacao">
<title>Inicialização</title>
<section>
<title>Introdução ao mecanismo</title>
<para>
Uma aplicação qualquer, seja do tipo Web ou desktop, geralmente necessita efetuar determinadas tarefas durante a sua
inicialização e ou finalização. Eis alguns exemplos: abertura de conexão a um servidor de banco de dados, carregamento de
parâmetros de configuração a partir de arquivos externos e execução de scripts específicos. Ou seja, normalmente essas ações
são definidas como funções estruturais da aplicação.
</para>
<para>
Para que a execução dessas ações ocorra de forma concisa, faz-se necessário o uso de um mecanismo padronizado para inicialização
do ambiente. O <emphasis>Demoiselle Framework</emphasis> fornece esse mecanismo através da especificação CDI introduzindo duas
anotações: <literal>@Startup</literal> e <literal>@Shutdown</literal>.
</para>
</section>
<section>
<title>Implementação na aplicação</title>
<para>
A fim de utilizar o mecanismo inerente do <emphasis>Demoiselle Framework</emphasis>, é preciso simplesmente anotar os métodos
contendo as instruções desejadas com <literal>@Startup</literal>, para a <emphasis>inicialização</emphasis>, ou
<literal>@Shutdown</literal>, para a <emphasis>finalização</emphasis>.
</para>
<tip>
<para>
O mecanismo de inicialização do <emphasis>Demoiselle Framework</emphasis> é independente da natureza da aplicação Java, isto é,
visa tanto aplicações do tipo Web quanto do tipo desktop (ex: Swing).
</para>
</tip>
<para>
As instruções contidas em um método anotado com <literal>@Startup</literal> serão executadas automaticamente quando a aplicação
Java for inicializada, seja ela hospedada em um contêiner Web ou executada através de um método <literal>main()</literal>.
Nenhum outro arquivo ou classe precisa ser definido. A anotação <literal>@Startup</literal> pode ser utilizada em conjunto com a anotação
<literal>@Priority</literal>, que recebe como parâmetro um número inteiro que serve para definir a prioridade de execução do respectivo
método, na existência de mais de um inicializador para a aplicação.
</para>
<para>
De maneira análoga, um método anotado com <literal>@Shutdown</literal> será executado no momento de finalização de uma aplicação,
obedecendo também à ordem de prioridade definida com a anotação <literal>@Priority</literal>.
</para>
<para>
Eis um exemplo de implementação de inicializador em uma aplicação:
</para>
<programlisting role="JAVA"><![CDATA[public class BookmarkInitializer {
@Startup
@Priority(1)
public void initialize() {
...
}
@Shutdown
@Priority(5)
public void finalize() {
...
}
}]]></programlisting>
<tip>
<para>
Para a definição de prioridade de execução de um método na inicialização ou finalização, podem ser
utilizadas as constantes <literal>MIN_PRIORITY</literal> ou <literal>MAX_PRIORITY</literal> presentes em
<literal>br.gov.frameworkdemoiselle.annotation.Priority</literal>.
</para>
</tip>
</section>
<section>
<title>Um exemplo prático</title>
<para>
Eis um interessante caso de uso de inicialização e finalização: rodar um servidor de modo standalone em paralelo à
execução da aplicação principal. Eis o código referente a essa implementação:
</para>
<programlisting role="JAVA"><![CDATA[import br.gov.frameworkdemoiselle.lifecycle.Shutdown;
import br.gov.frameworkdemoiselle.lifecycle.Startup;
import static br.gov.frameworkdemoiselle.annotation.Priority.MAX_PRIORITY;
import static br.gov.frameworkdemoiselle.annotation.Priority.MIN_PRIORITY;
public class DatabaseServer {
private final org.hsqldb.Server server;
public DatabaseServer() {
server = new Server();
server.setDatabaseName(0, "db");
server.setDatabasePath(0, "database/db");
server.setPort(9001);
server.setSilent(true);
}
@Startup
@Priority(MAX_PRIORITY)
public void startup() {
server.start();
}
@Shutdown
@Priority (MIN_PRIORITY)
public void shutdown() {
server.stop();
}
}]]></programlisting>
</section>
</chapter>