O servidor de aplicações JBOSS AS nas versões 3.2, 4.2, 5.1 e 6.1 possui o suporte para deploy de arquivos SAR (Service Archive). Esses arquivos são do tipo JAR, mas com algumas diferenças:
- A presença do arquivo jboss-service.xml no diretório META-INF que por sua vez, está dentro do diretório raiz do arquivo SAR.
- A presença da extensão ".sar" ao invés de usar a extensão ".jar".
Alguns servidores JBOSS AS (mais antigos) só reconhece o arquivo SAR com a sua devida extensão ".sar". Outros servidores (mais novos) reconhece o arquivo SAR tanto com a extensão ".sar" quanto com a extensão ".jar". A seguir, listamos os servidores de aplicações e os arquivos SAR reconhecidos.
- JBOSS AS 3.2.8 - Só reconhece arquivo SAR com a extensão ".sar".
- JBOSS AS 4.2.3 - Só reconhece arquivo SAR com a extensão ".sar".
- JBOSS AS 5.1.0 - Reconhece arquivo SAR com as extensões ".jar" e ".sar".
- JBOSS AS 6.1.0 - Reconhece arquivo SAR com as extensões ".jar" e ".sar".
Conteúdo de um arquivo jboss-service.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE server PUBLIC "-//JBoss//DTD MBean Service 3.2//EN"
"http://www.jboss.org/j2ee/dtd/jboss-service_3_2.dtd">
<server>
<!-- UUIDKeyGeneratorFactoryService -->
<mbean code="test.services.AnaliseService"
name="jboss:service=AnaliseServicesInJBOSS,type=Analise">
<depends>jboss:service=Naming </depends>
<depends>jboss:service=TransactionManager </depends>
</mbean>
</server>
Nesse arquivo temos a tag mbean dentro da tag server. Essa tag mbean define uma classe (test.services.AnaliseService) que extende a classe org.jboss.system.ServiceDynamicMBeanSupport do JAR jboss-system do diretório lib do JBOSS. Essa classe (com nome AnaliseService) que implementará todo o serviço que será oferecido ao container JBOSS quando fizer o respectivo deploy. É nessa idéia que o JBOSS AS trabalha com os arquivos SAR, para oferecer serviços ao container, de maneira o mais fracamente desacoplada possível, assim, podemos criar um serviço para fazer deploy de arquivos OSGi (por exemplo) mas sem precisar recompilar o servidor de aplicações ! Nisso, o servidor receberá novas extensões sem precisar ter o seu núcleo modificado! Isso é uma característica marcante dos servidores JBOSS AS, a extensibilidade! Pois com o tempo, nós mesmos podemos implementar serviços não existentes no JBOSS AS para as nossas aplicações. Nisso os serviços de realizar deploy de EJBs, EARs, etc são todos implementados na arquitetura dos arquivos SAR! E pelo arquivo xml jboss-service, definimos as configurações necessárias para disponibilizar os nossos serviços implementados dentro do arquivo SAR.
SERVIDOR
Agora vamos criar uma classe para implementarmos serviços que serão disponibilizados ao container do JBOSS AS. No arquivo jboss-service.xml apresentado anteriormente, definimos uma classe com o nome de "test.services.AnaliseService" então, vamos utilizar as configurações do arquivo jboss-service.xml e a seguir, mostraremos a implementação dessa classe.
//--------------------
package test.services;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import javax.naming.Context;
import javax.naming.InitialContext;
import org.jboss.system.ServiceDynamicMBeanSupport;
public class AnaliseService extends ServiceDynamicMBeanSupport implements
Serializable {
/**
*
*/
private static final long serialVersionUID = -4359452770360595777L;
public List
// TESTAR CHAMADA DO SERVIÇO ATRAVÉS DO EJB.
// TODO
final List
if (objects != null) {
for (int i = 0; i < objects.length; i++) {
// ACESSAR API DO CONTAINER JBOSS AS
// COLOCAR LISTENER PARA PEGAR OS DEPLOYERS
// OBTER OS DEPLOYERS. ASSIM PODEMOS CRIAR UMA IMPLEMENTAÇÃO
// PARA TRATAR EJBS, ETC.
// TODO
try {
Context ctx = new InitialContext();
ctx.rebind("AnaliseServiceName", this);
} catch (Exception e) {
log.error("Caught exception during startService()", e);
}
System.out.println("StartService [FIM] - Entrou aki - " + this.getClass().getName() + " - " + Calendar.getInstance().getTime());
}
@Override protected void stopService() throws Exception {
System.out.println("StopService [INICIO] - Entrou aki - " + this.getClass().getName() + " - " + Calendar.getInstance().getTime());
try {
Context ctx = new InitialContext();
ctx.unbind("AnaliseServiceName");
} catch (Exception e) {
log.error("Caught exception during stopService()", e);
}
System.out.println("StopService [FIM] - Entrou aki - " + this.getClass().getName() + " - " + Calendar.getInstance().getTime());
}
}
//--------------------
Com o serviço rodando dentro do container JBOSS, agora vamos criar um EJB que acessará esse serviço do arquivo SAR. Como o foco desse artigo não é ilustrar o processo de criar / configurar e disponibilizar EJBs, mostraremos a seguir o código de EJB na versão 3.0 como um cliente que acessará o serviço a cada um tempo definido (periodicamente, pela especificação EJB Timer).
// -----------------------
// Coloque esses métodos num EJB
// e chame o método initialize
// para iniciar o Timer
// e chamar os serviços do arquivo SAR
public void initialize() {
ctx.getTimerService().createTimer(5000, 5000, null);
System.out.println("Timers set");
}
@Timeout
public void handleTimeout(Timer timer) {
System.out.println("@Schedule called at: " + new java.util.Date());
Object a = null;
try {
Context ctx = getInitialContext();
a = ctx.lookup("AnaliseServiceName");
} catch (NamingException e) {
e.printStackTrace();
}
if (a instanceof AnaliseService) {
AnaliseService b = (AnaliseService) a;
b.test("Ola");
}
}
private InitialContext getInitialContext() throws NamingException {
final Properties properties = new Properties();
properties.put(Context.SECURITY_PRINCIPAL, "guest");
properties.put(Context.SECURITY_CREDENTIALS, "guest");
properties.put(Context.INITIAL_CONTEXT_FACTORY,
"org.jboss.security.jndi.JndiLoginInitialContextFactory");
properties.put(Context.PROVIDER_URL, "jnp://localhost:1099");
return new InitialContext(properties);
}
//-----------------------
Referências
http://www.javabeat.net/tips/117-sar-service-archive-file-in-jboss.html
http://docs.jboss.org/jbossas/admindevel326/html/ch2.chapter.html#d0e3832
Nenhum comentário:
Postar um comentário