<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
		<id>https://dosideas.com/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Fguerra</id>
		<title>Dos Ideas. - Contribuciones del usuario [es]</title>
		<link rel="self" type="application/atom+xml" href="https://dosideas.com/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Fguerra"/>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/Especial:Contribuciones/Fguerra"/>
		<updated>2026-05-29T20:42:26Z</updated>
		<subtitle>Contribuciones del usuario</subtitle>
		<generator>MediaWiki 1.28.2</generator>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Mock_de_un_WS_mediante_Spring_WS&amp;diff=6571</id>
		<title>Mock de un WS mediante Spring WS</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Mock_de_un_WS_mediante_Spring_WS&amp;diff=6571"/>
				<updated>2012-03-29T17:58:26Z</updated>
		
		<summary type="html">&lt;p&gt;Fguerra: /* Fuente */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Introducción===&lt;br /&gt;
&lt;br /&gt;
En esta página explicaremos de qué forma podemos simular el entorno de un Web Service en memoria, de modo tal de poder realizar un test de componentes contra dicho entorno.&lt;br /&gt;
&lt;br /&gt;
===Requerimientos===&lt;br /&gt;
&lt;br /&gt;
Para mockear un Web Service mediante Spring WS, necesitaremos agregar a nuestro proyecto los siguientes jars:&lt;br /&gt;
* jaxb-api-2.0.jar&lt;br /&gt;
* jaxb-impl-2.0.3.jar&lt;br /&gt;
* xalan-2.7.1.jar (importante que sea esta versión o superior)&lt;br /&gt;
* xmlunit-1.1.jar&lt;br /&gt;
&lt;br /&gt;
===Ejemplo===&lt;br /&gt;
&lt;br /&gt;
Básicamente, el código para crear un test contra dicho entorno será como el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
@RunWith(SpringJUnit4ClassRunner.class)&lt;br /&gt;
&lt;br /&gt;
// indicamos a Spring que levante los archivos de configuración que veremos más adelante&lt;br /&gt;
@ContextConfiguration(&amp;quot;spring-configuration.xml&amp;quot;)&lt;br /&gt;
public class ClienteIntegracionTest {&lt;br /&gt;
&lt;br /&gt;
// Creamos el request a enviarle al WS&lt;br /&gt;
private String request = &amp;quot;&amp;lt;ns2:ClienteRequest xmlns:ns2='http://ejemplo.com.ar/'&amp;gt;&amp;lt;ns2:APELLIDO_RAZONSOCIAL&amp;gt;Una razon social&amp;lt;/ns2:APELLIDO_RAZONSOCIAL&amp;gt;&amp;lt;/ns2:ClienteRequest&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Creamos el response que nos responderá el WS&lt;br /&gt;
private String response = &amp;quot;&amp;lt;ns2:ClienteResponse xmlns:ns2='http://ejemplo.com.ar/'&amp;gt;&amp;lt;ns2:ID_CLIENTE&amp;gt;123&amp;lt;/ns2:ID_CLIENTE&amp;gt;&amp;lt;/ns2:ClienteResponse&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//Inyectamos el WebServiceTemplate &lt;br /&gt;
@Autowired&lt;br /&gt;
private WebServiceTemplate webServiceTemplate;&lt;br /&gt;
&lt;br /&gt;
// Mockeamos el WebServiceServer&lt;br /&gt;
private MockWebServiceServer server;&lt;br /&gt;
&lt;br /&gt;
// Clase nuestra que lo consumirá&lt;br /&gt;
@Autowired&lt;br /&gt;
private Cliente cliente;&lt;br /&gt;
&lt;br /&gt;
// En el Before levantamos el server pasandole como parámetro al constructor &lt;br /&gt;
// el webServiceTemplate&lt;br /&gt;
@Before&lt;br /&gt;
public void setup() {&lt;br /&gt;
server = MockWebServiceServer.createServer(webServiceTemplate);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Test&lt;br /&gt;
public void testInvocacionWs() {&lt;br /&gt;
&lt;br /&gt;
// Le damos comportamiento a nuestro WS con el request y el response&lt;br /&gt;
// antes configurado&lt;br /&gt;
server.expect(RequestMatchers.payload(new StringSource(request))).andRespond(ResponseCreators.withPayload(new StringSource(response)));&lt;br /&gt;
&lt;br /&gt;
cliente.invocarMetodoQueLlamaAlWs();&lt;br /&gt;
&lt;br /&gt;
// Nos aseguramos que el servicio fue invocado&lt;br /&gt;
server.verify();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dentro de los archivos de configuración que levante Spring, tendremos que configurarle los siguientes beans:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
 &amp;lt;bean id=&amp;quot;wsTemplate&amp;quot; class=&amp;quot;org.springframework.ws.client.core.WebServiceTemplate&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Url donde esta expuesto nuestro WS. En este test no irá a invocarlo, ya que se simula el entorno localmente --&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;defaultUri&amp;quot; value=&amp;quot;http://localhost:8080/&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;marshaller&amp;quot; ref=&amp;quot;marshaller&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;unmarshaller&amp;quot; ref=&amp;quot;marshaller&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/bean&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;bean id=&amp;quot;marshaller&amp;quot; class=&amp;quot;org.springframework.oxm.jaxb.Jaxb2Marshaller&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;classesToBeBound&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;list&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Listado de clases con las que esta mapeado cada Request y Response --&amp;gt;&lt;br /&gt;
    &amp;lt;value&amp;gt;com.dosideas.ejemplo.schemas.ClienteRequest&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;value&amp;gt;com.dosideas.ejemplo.schemas.ClienteResponse&amp;lt;/value&amp;gt;&lt;br /&gt;
   &amp;lt;/list&amp;gt;&lt;br /&gt;
  &amp;lt;/property&amp;gt;&lt;br /&gt;
 &amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, el método de nuestra clase cliente, deberá contener&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
public void invocarMetodoQueLlamaAlWs() {&lt;br /&gt;
...&lt;br /&gt;
ClienteRequest clienteRequest = new ClienteRequest();&lt;br /&gt;
...&lt;br /&gt;
ClienteResponse clienteResponse = (clienteResponse) webServiceTemplate&lt;br /&gt;
        .marshalSendAndReceive(clienteRequest);&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Fuente====&lt;br /&gt;
*[http://static.springsource.org/spring-ws/site/reference/html/client.html Spring MVC Test ]&lt;br /&gt;
*[http://www.developer.com/java/ent/integration-testing-support-in-spring-ws-2.0.html Otro ejemplo ]&lt;/div&gt;</summary>
		<author><name>Fguerra</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Mock_de_un_WS_mediante_Spring_WS&amp;diff=6570</id>
		<title>Mock de un WS mediante Spring WS</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Mock_de_un_WS_mediante_Spring_WS&amp;diff=6570"/>
				<updated>2012-03-29T17:57:09Z</updated>
		
		<summary type="html">&lt;p&gt;Fguerra: /* Ejemplo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Introducción===&lt;br /&gt;
&lt;br /&gt;
En esta página explicaremos de qué forma podemos simular el entorno de un Web Service en memoria, de modo tal de poder realizar un test de componentes contra dicho entorno.&lt;br /&gt;
&lt;br /&gt;
===Requerimientos===&lt;br /&gt;
&lt;br /&gt;
Para mockear un Web Service mediante Spring WS, necesitaremos agregar a nuestro proyecto los siguientes jars:&lt;br /&gt;
* jaxb-api-2.0.jar&lt;br /&gt;
* jaxb-impl-2.0.3.jar&lt;br /&gt;
* xalan-2.7.1.jar (importante que sea esta versión o superior)&lt;br /&gt;
* xmlunit-1.1.jar&lt;br /&gt;
&lt;br /&gt;
===Ejemplo===&lt;br /&gt;
&lt;br /&gt;
Básicamente, el código para crear un test contra dicho entorno será como el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
@RunWith(SpringJUnit4ClassRunner.class)&lt;br /&gt;
&lt;br /&gt;
// indicamos a Spring que levante los archivos de configuración que veremos más adelante&lt;br /&gt;
@ContextConfiguration(&amp;quot;spring-configuration.xml&amp;quot;)&lt;br /&gt;
public class ClienteIntegracionTest {&lt;br /&gt;
&lt;br /&gt;
// Creamos el request a enviarle al WS&lt;br /&gt;
private String request = &amp;quot;&amp;lt;ns2:ClienteRequest xmlns:ns2='http://ejemplo.com.ar/'&amp;gt;&amp;lt;ns2:APELLIDO_RAZONSOCIAL&amp;gt;Una razon social&amp;lt;/ns2:APELLIDO_RAZONSOCIAL&amp;gt;&amp;lt;/ns2:ClienteRequest&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Creamos el response que nos responderá el WS&lt;br /&gt;
private String response = &amp;quot;&amp;lt;ns2:ClienteResponse xmlns:ns2='http://ejemplo.com.ar/'&amp;gt;&amp;lt;ns2:ID_CLIENTE&amp;gt;123&amp;lt;/ns2:ID_CLIENTE&amp;gt;&amp;lt;/ns2:ClienteResponse&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//Inyectamos el WebServiceTemplate &lt;br /&gt;
@Autowired&lt;br /&gt;
private WebServiceTemplate webServiceTemplate;&lt;br /&gt;
&lt;br /&gt;
// Mockeamos el WebServiceServer&lt;br /&gt;
private MockWebServiceServer server;&lt;br /&gt;
&lt;br /&gt;
// Clase nuestra que lo consumirá&lt;br /&gt;
@Autowired&lt;br /&gt;
private Cliente cliente;&lt;br /&gt;
&lt;br /&gt;
// En el Before levantamos el server pasandole como parámetro al constructor &lt;br /&gt;
// el webServiceTemplate&lt;br /&gt;
@Before&lt;br /&gt;
public void setup() {&lt;br /&gt;
server = MockWebServiceServer.createServer(webServiceTemplate);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Test&lt;br /&gt;
public void testInvocacionWs() {&lt;br /&gt;
&lt;br /&gt;
// Le damos comportamiento a nuestro WS con el request y el response&lt;br /&gt;
// antes configurado&lt;br /&gt;
server.expect(RequestMatchers.payload(new StringSource(request))).andRespond(ResponseCreators.withPayload(new StringSource(response)));&lt;br /&gt;
&lt;br /&gt;
cliente.invocarMetodoQueLlamaAlWs();&lt;br /&gt;
&lt;br /&gt;
// Nos aseguramos que el servicio fue invocado&lt;br /&gt;
server.verify();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dentro de los archivos de configuración que levante Spring, tendremos que configurarle los siguientes beans:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
 &amp;lt;bean id=&amp;quot;wsTemplate&amp;quot; class=&amp;quot;org.springframework.ws.client.core.WebServiceTemplate&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Url donde esta expuesto nuestro WS. En este test no irá a invocarlo, ya que se simula el entorno localmente --&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;defaultUri&amp;quot; value=&amp;quot;http://localhost:8080/&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;marshaller&amp;quot; ref=&amp;quot;marshaller&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;unmarshaller&amp;quot; ref=&amp;quot;marshaller&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/bean&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;bean id=&amp;quot;marshaller&amp;quot; class=&amp;quot;org.springframework.oxm.jaxb.Jaxb2Marshaller&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;classesToBeBound&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;list&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Listado de clases con las que esta mapeado cada Request y Response --&amp;gt;&lt;br /&gt;
    &amp;lt;value&amp;gt;com.dosideas.ejemplo.schemas.ClienteRequest&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;value&amp;gt;com.dosideas.ejemplo.schemas.ClienteResponse&amp;lt;/value&amp;gt;&lt;br /&gt;
   &amp;lt;/list&amp;gt;&lt;br /&gt;
  &amp;lt;/property&amp;gt;&lt;br /&gt;
 &amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, el método de nuestra clase cliente, deberá contener&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
public void invocarMetodoQueLlamaAlWs() {&lt;br /&gt;
...&lt;br /&gt;
ClienteRequest clienteRequest = new ClienteRequest();&lt;br /&gt;
...&lt;br /&gt;
ClienteResponse clienteResponse = (clienteResponse) webServiceTemplate&lt;br /&gt;
        .marshalSendAndReceive(clienteRequest);&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Fuente====&lt;br /&gt;
*[http://static.springsource.org/spring-ws/site/reference/html/client.html Spring MVC Test ]&lt;/div&gt;</summary>
		<author><name>Fguerra</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Mock_de_un_WS_mediante_Spring_WS&amp;diff=6567</id>
		<title>Mock de un WS mediante Spring WS</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Mock_de_un_WS_mediante_Spring_WS&amp;diff=6567"/>
				<updated>2012-03-29T17:29:06Z</updated>
		
		<summary type="html">&lt;p&gt;Fguerra: /* Ejemplo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Introducción===&lt;br /&gt;
&lt;br /&gt;
En esta página explicaremos de qué forma podemos simular el entorno de un WS en memoria, de modo tal de poder realizar un test de componentes contra dicho entorno.&lt;br /&gt;
&lt;br /&gt;
===Requerimientos===&lt;br /&gt;
&lt;br /&gt;
Para mockear un WS mediante Spring WS, necesitaremos agregar a nuestro proyecto los siguientes jars:&lt;br /&gt;
* jaxb-api-2.0.jar&lt;br /&gt;
* jaxb-impl-2.0.3.jar&lt;br /&gt;
* xalan-2.7.1.jar (importante que sea esta versión o superior)&lt;br /&gt;
* xmlunit-1.1.jar&lt;br /&gt;
&lt;br /&gt;
===Ejemplo===&lt;br /&gt;
&lt;br /&gt;
Básicamente, el código para crear un test contra dicho entorno será como el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
@RunWith(SpringJUnit4ClassRunner.class)&lt;br /&gt;
&lt;br /&gt;
// indicamos a Spring que levante los archivos de configuración que veremos más adelante&lt;br /&gt;
@ContextConfiguration(&amp;quot;spring-configuration.xml&amp;quot;)&lt;br /&gt;
public class ClienteIntegracionTest {&lt;br /&gt;
&lt;br /&gt;
// Creamos el request a enviarle al WS&lt;br /&gt;
private String request = &amp;quot;&amp;lt;ns2:UserProfileCreateRequest xmlns:ns2='http://shekhar.com/usermanagement/schemas'&amp;gt; Shekhar Gulati 27 &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Creamos el response que nos responderá el WS&lt;br /&gt;
private String response = &amp;quot;&amp;lt;ns2:UserProfileCreateResponse xmlns:ns2='http://shekhar.com/usermanagement/schemas'&amp;gt; user created successfully &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//Inyectamos el WebServiceTemplate &lt;br /&gt;
@Autowired&lt;br /&gt;
private WebServiceTemplate webServiceTemplate;&lt;br /&gt;
&lt;br /&gt;
// Mockeamos el WebServiceServer&lt;br /&gt;
private MockWebServiceServer server;&lt;br /&gt;
&lt;br /&gt;
// Clase nuestra que lo consumirá&lt;br /&gt;
@Autowired&lt;br /&gt;
private Cliente cliente;&lt;br /&gt;
&lt;br /&gt;
// En el Before levantamos el server pasandole como parámetro al constructor &lt;br /&gt;
// el webServiceTemplate&lt;br /&gt;
@Before&lt;br /&gt;
public void setup() {&lt;br /&gt;
server = MockWebServiceServer.createServer(webServiceTemplate);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Test&lt;br /&gt;
public void testInvocacionWs() {&lt;br /&gt;
&lt;br /&gt;
// Le damos comportamiento a nuestro WS con el request y el response&lt;br /&gt;
// antes configurado&lt;br /&gt;
server.expect(RequestMatchers.payload(new StringSource(request))).andRespond(ResponseCreators.withPayload(new StringSource(response)));&lt;br /&gt;
&lt;br /&gt;
cliente.invocarMetodoQueLlamaAlWs();&lt;br /&gt;
&lt;br /&gt;
// Nos aseguramos que el servicio fue invocado&lt;br /&gt;
server.verify();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dentro de los archivos de configuración que levante Spring, tendremos que configurarle los siguientes beans:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
 &amp;lt;bean id=&amp;quot;wsTemplate&amp;quot; class=&amp;quot;org.springframework.ws.client.core.WebServiceTemplate&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Url donde esta expuesto nuestro WS. En este test no irá a invocarlo, ya que se simula el entorno localmente --&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;defaultUri&amp;quot; value=&amp;quot;http://localhost:8080/&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;marshaller&amp;quot; ref=&amp;quot;marshaller&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;unmarshaller&amp;quot; ref=&amp;quot;marshaller&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/bean&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;bean id=&amp;quot;marshaller&amp;quot; class=&amp;quot;org.springframework.oxm.jaxb.Jaxb2Marshaller&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;classesToBeBound&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;list&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Listado de clases con las que esta mapeado cada Request y Response --&amp;gt;&lt;br /&gt;
    &amp;lt;value&amp;gt;com.dosideas.ejemplo.schemas.ClienteRequest&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;value&amp;gt;com.dosideas.ejemplo.schemas.ClienteResponse&amp;lt;/value&amp;gt;&lt;br /&gt;
   &amp;lt;/list&amp;gt;&lt;br /&gt;
  &amp;lt;/property&amp;gt;&lt;br /&gt;
 &amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, el método de nuestra clase cliente, deberá contener&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
public void invocarMetodoQueLlamaAlWs() {&lt;br /&gt;
...&lt;br /&gt;
ClienteRequest clienteRequest = new ClienteRequest();&lt;br /&gt;
...&lt;br /&gt;
ClienteResponse clienteResponse = (clienteResponse) webServiceTemplate&lt;br /&gt;
        .marshalSendAndReceive(clienteRequest);&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Fuente====&lt;br /&gt;
*[http://static.springsource.org/spring-ws/site/reference/html/client.html Spring MVC Test ]&lt;/div&gt;</summary>
		<author><name>Fguerra</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Mock_de_un_WS_mediante_Spring_WS&amp;diff=6566</id>
		<title>Mock de un WS mediante Spring WS</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Mock_de_un_WS_mediante_Spring_WS&amp;diff=6566"/>
				<updated>2012-03-29T17:27:00Z</updated>
		
		<summary type="html">&lt;p&gt;Fguerra: /* Ejemplo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Introducción===&lt;br /&gt;
&lt;br /&gt;
En esta página explicaremos de qué forma podemos simular el entorno de un WS en memoria, de modo tal de poder realizar un test de componentes contra dicho entorno.&lt;br /&gt;
&lt;br /&gt;
===Requerimientos===&lt;br /&gt;
&lt;br /&gt;
Para mockear un WS mediante Spring WS, necesitaremos agregar a nuestro proyecto los siguientes jars:&lt;br /&gt;
* jaxb-api-2.0.jar&lt;br /&gt;
* jaxb-impl-2.0.3.jar&lt;br /&gt;
* xalan-2.7.1.jar (importante que sea esta versión o superior)&lt;br /&gt;
* xmlunit-1.1.jar&lt;br /&gt;
&lt;br /&gt;
===Ejemplo===&lt;br /&gt;
&lt;br /&gt;
Básicamente, el código para crear un test contra dicho entorno será como el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
@RunWith(SpringJUnit4ClassRunner.class)&lt;br /&gt;
&lt;br /&gt;
// indicamos a Spring que levante los archivos de configuración que veremos más adelante&lt;br /&gt;
@ContextConfiguration(&amp;quot;spring-configuration.xml&amp;quot;)&lt;br /&gt;
public class ClienteIntegracionTest {&lt;br /&gt;
&lt;br /&gt;
// Creamos el request a enviarle al WS&lt;br /&gt;
private String request = &amp;quot;&amp;lt;ns2:UserProfileCreateRequest xmlns:ns2='http://shekhar.com/usermanagement/schemas'&amp;gt; Shekhar Gulati 27 &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Creamos el response que nos responderá el WS&lt;br /&gt;
private String response = &amp;quot;&amp;lt;ns2:UserProfileCreateResponse xmlns:ns2='http://shekhar.com/usermanagement/schemas'&amp;gt; user created successfully &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//Inyectamos el WebServiceTemplate &lt;br /&gt;
@Autowired&lt;br /&gt;
private WebServiceTemplate webServiceTemplate;&lt;br /&gt;
&lt;br /&gt;
// Mockeamos el WebServiceServer&lt;br /&gt;
private MockWebServiceServer server;&lt;br /&gt;
&lt;br /&gt;
// Clase nuestra que lo consumirá&lt;br /&gt;
@Autowired&lt;br /&gt;
private Cliente cliente;&lt;br /&gt;
&lt;br /&gt;
// En el Before levantamos el server pasandole como parámetro al constructor &lt;br /&gt;
// el webServiceTemplate&lt;br /&gt;
@Before&lt;br /&gt;
public void setup() {&lt;br /&gt;
server = MockWebServiceServer.createServer(webServiceTemplate);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Test&lt;br /&gt;
public void testInvocacionWs() {&lt;br /&gt;
&lt;br /&gt;
// Le damos comportamiento a nuestro WS con el request y el response&lt;br /&gt;
// antes configurado&lt;br /&gt;
server.expect(RequestMatchers.payload(new StringSource(request))).andRespond(ResponseCreators.withPayload(new StringSource(response)));&lt;br /&gt;
&lt;br /&gt;
cliente.invocarMetodoQueLlamaAlWs();&lt;br /&gt;
&lt;br /&gt;
// Nos aseguramos que el servicio fue invocado&lt;br /&gt;
server.verify();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dentro de los archivos de configuración que levante Spring, tendremos que configurarle los siguientes beans:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
 &amp;lt;bean id=&amp;quot;wsTemplate&amp;quot; class=&amp;quot;org.springframework.ws.client.core.WebServiceTemplate&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Url donde esta expuesto nuestro WS. En este test no irá a invocarlo, ya que se simula el entorno localmente --&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;defaultUri&amp;quot; value=&amp;quot;http://localhost:8080/&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;marshaller&amp;quot; ref=&amp;quot;marshaller&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;unmarshaller&amp;quot; ref=&amp;quot;marshaller&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/bean&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;bean id=&amp;quot;marshaller&amp;quot; class=&amp;quot;org.springframework.oxm.jaxb.Jaxb2Marshaller&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;classesToBeBound&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;list&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Listado de clases con las que esta mapeado cada Request y Response --&amp;gt;&lt;br /&gt;
    &amp;lt;value&amp;gt;com.dosideas.ejemplo.schemas.ClienteRequest&amp;lt;/value&amp;gt;&lt;br /&gt;
    &amp;lt;value&amp;gt;com.dosideas.ejemplo.schemas.ClienteResponse&amp;lt;/value&amp;gt;&lt;br /&gt;
   &amp;lt;/list&amp;gt;&lt;br /&gt;
  &amp;lt;/property&amp;gt;&lt;br /&gt;
 &amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Fuente====&lt;br /&gt;
*[http://static.springsource.org/spring-ws/site/reference/html/client.html Spring MVC Test ]&lt;/div&gt;</summary>
		<author><name>Fguerra</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Mock_de_un_WS_mediante_Spring_WS&amp;diff=6565</id>
		<title>Mock de un WS mediante Spring WS</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Mock_de_un_WS_mediante_Spring_WS&amp;diff=6565"/>
				<updated>2012-03-29T17:23:43Z</updated>
		
		<summary type="html">&lt;p&gt;Fguerra: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Introducción===&lt;br /&gt;
&lt;br /&gt;
En esta página explicaremos de qué forma podemos simular el entorno de un WS en memoria, de modo tal de poder realizar un test de componentes contra dicho entorno.&lt;br /&gt;
&lt;br /&gt;
===Requerimientos===&lt;br /&gt;
&lt;br /&gt;
Para mockear un WS mediante Spring WS, necesitaremos agregar a nuestro proyecto los siguientes jars:&lt;br /&gt;
* jaxb-api-2.0.jar&lt;br /&gt;
* jaxb-impl-2.0.3.jar&lt;br /&gt;
* xalan-2.7.1.jar (importante que sea esta versión o superior)&lt;br /&gt;
* xmlunit-1.1.jar&lt;br /&gt;
&lt;br /&gt;
===Ejemplo===&lt;br /&gt;
&lt;br /&gt;
Básicamente, el código para crear un test contra dicho entorno será como el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
@RunWith(SpringJUnit4ClassRunner.class)&lt;br /&gt;
&lt;br /&gt;
// indicamos a Spring que levante los archivos de configuración que veremos más adelante&lt;br /&gt;
@ContextConfiguration(&amp;quot;spring-configuration.xml&amp;quot;)&lt;br /&gt;
public class ClienteIntegracionTest {&lt;br /&gt;
&lt;br /&gt;
// Creamos el request a enviarle al WS&lt;br /&gt;
private String request = &amp;quot;&amp;lt;ns2:UserProfileCreateRequest xmlns:ns2='http://shekhar.com/usermanagement/schemas'&amp;gt; Shekhar Gulati 27 &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Creamos el response que nos responderá el WS&lt;br /&gt;
private String response = &amp;quot;&amp;lt;ns2:UserProfileCreateResponse xmlns:ns2='http://shekhar.com/usermanagement/schemas'&amp;gt; user created successfully &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//Inyectamos el WebServiceTemplate &lt;br /&gt;
@Autowired&lt;br /&gt;
private WebServiceTemplate webServiceTemplate;&lt;br /&gt;
&lt;br /&gt;
// Mockeamos el WebServiceServer&lt;br /&gt;
private MockWebServiceServer server;&lt;br /&gt;
&lt;br /&gt;
// Clase nuestra que lo consumirá&lt;br /&gt;
@Autowired&lt;br /&gt;
private Cliente cliente;&lt;br /&gt;
&lt;br /&gt;
// En el Before levantamos el server pasandole como parámetro al constructor &lt;br /&gt;
// el webServiceTemplate&lt;br /&gt;
@Before&lt;br /&gt;
public void setup() {&lt;br /&gt;
server = MockWebServiceServer.createServer(webServiceTemplate);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Test&lt;br /&gt;
public void testInvocacionWs() {&lt;br /&gt;
&lt;br /&gt;
// Le damos comportamiento a nuestro WS con el request y el response&lt;br /&gt;
// antes configurado&lt;br /&gt;
server.expect(RequestMatchers.payload(new StringSource(request))).andRespond(ResponseCreators.withPayload(new StringSource(response)));&lt;br /&gt;
&lt;br /&gt;
cliente.invocarMetodoQueLlamaAlWs();&lt;br /&gt;
&lt;br /&gt;
// Nos aseguramos que el servicio fue invocado&lt;br /&gt;
server.verify();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Fuente====&lt;br /&gt;
*[http://static.springsource.org/spring-ws/site/reference/html/client.html Spring MVC Test ]&lt;/div&gt;</summary>
		<author><name>Fguerra</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Mock_de_un_WS_mediante_Spring_WS&amp;diff=6564</id>
		<title>Mock de un WS mediante Spring WS</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Mock_de_un_WS_mediante_Spring_WS&amp;diff=6564"/>
				<updated>2012-03-29T17:18:50Z</updated>
		
		<summary type="html">&lt;p&gt;Fguerra: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Introducción===&lt;br /&gt;
&lt;br /&gt;
En esta página explicaremos de qué forma podemos simular el entorno de un WS en memoria, de modo tal de poder realizar un test de componentes contra dicho entorno.&lt;br /&gt;
&lt;br /&gt;
===Requerimientos===&lt;br /&gt;
&lt;br /&gt;
Para mockear un WS mediante Spring WS, necesitaremos agregar a nuestro proyecto los siguientes jars:&lt;br /&gt;
* jaxb-api-2.0.jar&lt;br /&gt;
* jaxb-impl-2.0.3.jar&lt;br /&gt;
* xalan-2.7.1.jar (importante que sea esta versión o superior)&lt;br /&gt;
* xmlunit-1.1.jar&lt;br /&gt;
&lt;br /&gt;
===Ejemplo===&lt;br /&gt;
&lt;br /&gt;
Básicamente, el código para crear un test contra dicho entorno será como el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
@RunWith(SpringJUnit4ClassRunner.class)&lt;br /&gt;
@ContextConfiguration(&amp;quot;profile-service-client.xml&amp;quot;)&lt;br /&gt;
public class ProfileServiceClientIntegrationTest {&lt;br /&gt;
&lt;br /&gt;
private String request = &amp;quot;&amp;lt;ns2:UserProfileCreateRequest xmlns:ns2='http://shekhar.com/usermanagement/schemas'&amp;gt; Shekhar Gulati 27 &amp;quot;;&lt;br /&gt;
private String response = &amp;quot;&amp;lt;ns2:UserProfileCreateResponse xmlns:ns2='http://shekhar.com/usermanagement/schemas'&amp;gt; user created successfully &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
@Autowired&lt;br /&gt;
private WebServiceTemplate webServiceTemplate;&lt;br /&gt;
private MockWebServiceServer server;&lt;br /&gt;
@Autowired&lt;br /&gt;
private ProfileServiceClient client;&lt;br /&gt;
&lt;br /&gt;
@Before&lt;br /&gt;
public void setup() {&lt;br /&gt;
server = MockWebServiceServer.createServer(webServiceTemplate);//1&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Test&lt;br /&gt;
public void testInvokeProfileServiceAndGetASuccessResponse() {&lt;br /&gt;
server.expect(RequestMatchers.payload(new StringSource(request))).andRespond(ResponseCreators.withPayload(new StringSource(response)));//2&lt;br /&gt;
Assert.assertEquals(&amp;quot;user created successfully&amp;quot;,client.invokeProfileServiceAndGetASuccessResponse());//3&lt;br /&gt;
server.verify();//4&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Fuente=====&lt;br /&gt;
*[http://static.springsource.org/spring-ws/site/reference/html/client.html Spring MVC Test ]&lt;/div&gt;</summary>
		<author><name>Fguerra</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Mock_de_un_WS_mediante_Spring_WS&amp;diff=6563</id>
		<title>Mock de un WS mediante Spring WS</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Mock_de_un_WS_mediante_Spring_WS&amp;diff=6563"/>
				<updated>2012-03-29T17:18:18Z</updated>
		
		<summary type="html">&lt;p&gt;Fguerra: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Introducción===&lt;br /&gt;
&lt;br /&gt;
En esta página explicaremos de qué forma podemos simular el entorno de un WS en memoria, de modo tal de poder realizar un test de componentes contra dicho entorno.&lt;br /&gt;
&lt;br /&gt;
===Requerimientos===&lt;br /&gt;
&lt;br /&gt;
Para mockear un WS mediante Spring WS, necesitaremos agregar a nuestro proyecto los siguientes jars:&lt;br /&gt;
* jaxb-api-2.0.jar&lt;br /&gt;
* jaxb-impl-2.0.3.jar&lt;br /&gt;
* xalan-2.7.1.jar (importante que sea esta versión o superior)&lt;br /&gt;
* xmlunit-1.1.jar&lt;br /&gt;
&lt;br /&gt;
===Ejemplo===&lt;br /&gt;
&lt;br /&gt;
Básicamente, el código para crear un test contra dicho entorno será como el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
@RunWith(SpringJUnit4ClassRunner.class)&lt;br /&gt;
@ContextConfiguration(&amp;quot;profile-service-client.xml&amp;quot;)&lt;br /&gt;
public class ProfileServiceClientIntegrationTest {&lt;br /&gt;
&lt;br /&gt;
private String request = &amp;quot;&amp;lt;ns2:UserProfileCreateRequest xmlns:ns2='http://shekhar.com/usermanagement/schemas'&amp;gt; Shekhar Gulati 27 &amp;quot;;&lt;br /&gt;
private String response = &amp;quot;&amp;lt;ns2:UserProfileCreateResponse xmlns:ns2='http://shekhar.com/usermanagement/schemas'&amp;gt; user created successfully &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
@Autowired&lt;br /&gt;
private WebServiceTemplate webServiceTemplate;&lt;br /&gt;
private MockWebServiceServer server;&lt;br /&gt;
@Autowired&lt;br /&gt;
private ProfileServiceClient client;&lt;br /&gt;
&lt;br /&gt;
@Before&lt;br /&gt;
public void setup() {&lt;br /&gt;
server = MockWebServiceServer.createServer(webServiceTemplate);//1&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Test&lt;br /&gt;
public void testInvokeProfileServiceAndGetASuccessResponse() {&lt;br /&gt;
server.expect(RequestMatchers.payload(new StringSource(request))).andRespond(ResponseCreators.withPayload(new StringSource(response)));//2&lt;br /&gt;
Assert.assertEquals(&amp;quot;user created successfully&amp;quot;,client.invokeProfileServiceAndGetASuccessResponse());//3&lt;br /&gt;
server.verify();//4&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Fuente= &lt;br /&gt;
*[http://static.springsource.org/spring-ws/site/reference/html/client.html Spring MVC Test ]&lt;/div&gt;</summary>
		<author><name>Fguerra</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Mock_de_un_WS_mediante_Spring_WS&amp;diff=6562</id>
		<title>Mock de un WS mediante Spring WS</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Mock_de_un_WS_mediante_Spring_WS&amp;diff=6562"/>
				<updated>2012-03-29T17:14:10Z</updated>
		
		<summary type="html">&lt;p&gt;Fguerra: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Introducción===&lt;br /&gt;
&lt;br /&gt;
En esta página explicaremos de qué forma podemos simular el entorno de un WS en memoria, de modo tal de poder realizar un test de componentes contra dicho entorno.&lt;br /&gt;
&lt;br /&gt;
===Requerimientos===&lt;br /&gt;
&lt;br /&gt;
Para mockear un WS mediante Spring WS, necesitaremos agregar a nuestro proyecto los siguientes jars:&lt;br /&gt;
* jaxb-api-2.0.jar&lt;br /&gt;
* jaxb-impl-2.0.3.jar&lt;br /&gt;
* xalan-2.7.1.jar (importante que sea esta versión o superior)&lt;br /&gt;
* xmlunit-1.1.jar&lt;br /&gt;
&lt;br /&gt;
===Ejemplo===&lt;br /&gt;
&lt;br /&gt;
Básicamente, el código para crear un test contra dicho entorno será como el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
@RunWith(SpringJUnit4ClassRunner.class)&lt;br /&gt;
@ContextConfiguration(&amp;quot;profile-service-client.xml&amp;quot;)&lt;br /&gt;
public class ProfileServiceClientIntegrationTest {&lt;br /&gt;
&lt;br /&gt;
private String request = &amp;quot;&amp;lt;ns2:UserProfileCreateRequest xmlns:ns2='http://shekhar.com/usermanagement/schemas'&amp;gt; Shekhar Gulati 27 &amp;quot;;&lt;br /&gt;
private String response = &amp;quot;&amp;lt;ns2:UserProfileCreateResponse xmlns:ns2='http://shekhar.com/usermanagement/schemas'&amp;gt; user created successfully &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
@Autowired&lt;br /&gt;
private WebServiceTemplate webServiceTemplate;&lt;br /&gt;
private MockWebServiceServer server;&lt;br /&gt;
@Autowired&lt;br /&gt;
private ProfileServiceClient client;&lt;br /&gt;
&lt;br /&gt;
@Before&lt;br /&gt;
public void setup() {&lt;br /&gt;
server = MockWebServiceServer.createServer(webServiceTemplate);//1&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@Test&lt;br /&gt;
public void testInvokeProfileServiceAndGetASuccessResponse() {&lt;br /&gt;
server.expect(RequestMatchers.payload(new StringSource(request))).andRespond(ResponseCreators.withPayload(new StringSource(response)));//2&lt;br /&gt;
Assert.assertEquals(&amp;quot;user created successfully&amp;quot;,client.invokeProfileServiceAndGetASuccessResponse());//3&lt;br /&gt;
server.verify();//4&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fguerra</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Mock_de_un_WS_mediante_Spring_WS&amp;diff=6561</id>
		<title>Mock de un WS mediante Spring WS</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Mock_de_un_WS_mediante_Spring_WS&amp;diff=6561"/>
				<updated>2012-03-29T15:55:16Z</updated>
		
		<summary type="html">&lt;p&gt;Fguerra: Página creada con '===Requerimientos===  Para mockear un WS mediante Spring WS, necesitaremos agregar a nuestro proyecto los siguientes jars: * jaxb-api-2.0.jar * jaxb-impl-2.0.3.jar * xalan-2.7.1…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Requerimientos===&lt;br /&gt;
&lt;br /&gt;
Para mockear un WS mediante Spring WS, necesitaremos agregar a nuestro proyecto los siguientes jars:&lt;br /&gt;
* jaxb-api-2.0.jar&lt;br /&gt;
* jaxb-impl-2.0.3.jar&lt;br /&gt;
* xalan-2.7.1.jar (importante que sea esta versión)&lt;br /&gt;
* xmlunit-1.1.jar&lt;/div&gt;</summary>
		<author><name>Fguerra</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Web_Service&amp;diff=6560</id>
		<title>Web Service</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Web_Service&amp;diff=6560"/>
				<updated>2012-03-29T15:52:51Z</updated>
		
		<summary type="html">&lt;p&gt;Fguerra: /* Ver también */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Web Service]]&lt;br /&gt;
Un servicio web (en inglés Web service) es un conjunto de protocolos y estándares que sirven para intercambiar datos entre aplicaciones. Distintas aplicaciones de software desarrolladas en lenguajes de programación diferentes, y ejecutadas sobre cualquier plataforma, pueden utilizar los servicios web para intercambiar datos en redes de ordenadores como Internet. La interoperabilidad se consigue mediante la adopción de estándares abiertos.&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [[Apache CXF]]&lt;br /&gt;
* [[WSDL]]&lt;br /&gt;
* [[Web Service Con Spring]]&lt;br /&gt;
* [[JAX-WS]]&lt;br /&gt;
* [[Clientes De Web Service]]&lt;br /&gt;
* [[Cliente Web Service con Ant y Axis2]]&lt;br /&gt;
* [[Parámetros Para Web Service]]&lt;br /&gt;
* [[Invocar Web Service Desde Eclipse]]&lt;br /&gt;
* [[StackTrace Dentro De AxisFault]]&lt;br /&gt;
* [[Dirección IP En WebService]]&lt;br /&gt;
* [[Autenticación HTTP Básica en cliente con Axis2]]&lt;br /&gt;
* [[SoapUI]]&lt;br /&gt;
* [[Mock de un WS mediante Spring WS]]&lt;br /&gt;
* [http://es.wikipedia.org/wiki/Web_service Web Service en la Wikipedia]&lt;br /&gt;
* [http://ws.apache.org/axis2/ Axis2]&lt;/div&gt;</summary>
		<author><name>Fguerra</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Log4J&amp;diff=6465</id>
		<title>Log4J</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Log4J&amp;diff=6465"/>
				<updated>2011-12-28T13:19:05Z</updated>
		
		<summary type="html">&lt;p&gt;Fguerra: /* Modificar log4j en ejecución */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Java]]&lt;br /&gt;
Log4J es una librería para resolver el log de aplicaciones [[Java]].&lt;br /&gt;
&lt;br /&gt;
==Los Appender==&lt;br /&gt;
Log4J utiliza &amp;quot;appenders&amp;quot; para guardar el log generado por las aplicaciones. Un appender es el encargado de procesar un mensaje de log enviado por la aplicación. Usualmente se encarga de almacenarlo en algún medio persistente, como ser un archivo. &lt;br /&gt;
&lt;br /&gt;
Existen distintos appenders para guardar logs en archivos, base de datos o colas de mensajeria. &lt;br /&gt;
&lt;br /&gt;
===JMSAppnder===&lt;br /&gt;
&lt;br /&gt;
Log4J cuenta con un Appender especial que redirecciona los eventos de log a un Topic [[JMS]].&lt;br /&gt;
&lt;br /&gt;
El appender a utilizar es ''org.apache.log4j.net.JMSAppender'', el cual se encarga de enviar los eventos de log a un Topic asociado. Un topic es parecido a una cola, pero con la diferencia que los mensajes se distribuyen a todos los suscriptores de la misma. Si no hay suscriptores, el mensaje se pierde.&lt;br /&gt;
&lt;br /&gt;
El JMSAppnder es muy útil en un ambiente en cluster, para centralizar la información de los log en un único lugar.&lt;br /&gt;
&lt;br /&gt;
==== Ejemplo de uso ====&lt;br /&gt;
&lt;br /&gt;
En la práctica, utilizar log4j con este appender es igual que en cualquier otro caso. En el archivo de configuración ''log4j.properties'' es necesario agregar el appender en cuestión.&lt;br /&gt;
&lt;br /&gt;
 log4j.logger.com.zim=DEBUG, jms&lt;br /&gt;
 log4j.appender.jms=org.apache.log4j.net.JMSAppender&lt;br /&gt;
 log4j.appender.jms.InitialContextFactoryName=weblogic.jndi.WLInitialContextFactory&lt;br /&gt;
 log4j.appender.jms.ProviderURL=t3://miApplicationServer:7001&lt;br /&gt;
 log4j.appender.jms.TopicConnectionFactoryBindingName=JmsZimCF&lt;br /&gt;
 log4j.appender.jms.TopicBindingName=ZimTopic&lt;br /&gt;
 log4j.appender.jms.locationInfo=true&lt;br /&gt;
&lt;br /&gt;
En el ejemplo, utilizamos el Connection Factory ''JmsZmiCF'' para conectarnos al topic ''ZimTopic'' (ambos teniendo que estar configurados en algún [[Servidor de Aplicaciones]]).&lt;br /&gt;
&lt;br /&gt;
Con esta configuración todos los logs de las clases que pertenezcan al paquete &amp;quot;com.zim&amp;quot; se enviaran como mensajes al topic. Al Topic se envian objetos de tipo ''LoggingEvent'', clase que contiene la información de un evento de log.&lt;br /&gt;
&lt;br /&gt;
Luego, podrá haber distintos suscriptores que tomen las acciones necesarias sobre el mensaje. Por ejemplo, podriamos tener suscriptores que guarden el log en una base de datos, u otros que envien un mail o sms.&lt;br /&gt;
&lt;br /&gt;
====Sobre el locationInfo====&lt;br /&gt;
&lt;br /&gt;
Por default, el atributo locationInfo está en &amp;quot;false&amp;quot;. Esto hace que NO se envien los datos para el objeto ''LocationInfo'' de ''LoggingEvent''. Al setearlo en true, el objeto ''LocationInfo'' contendrá la información sobre la clase, método y número de línea en donde ocurrió el error.&lt;br /&gt;
&lt;br /&gt;
====Procesando el mensaje====&lt;br /&gt;
&lt;br /&gt;
Luego, queda tan solo decidir qué hacer con el mensaje. Usualmente, será un [[Message Driven Bean]] que procese de alguna manera el mensaje que envia Log4J.&lt;br /&gt;
&lt;br /&gt;
¿Y qué envia exactamente? Log4J enviará un ''ObjectMessage'' de JMS, que contiene una instancia de ''LoggingEvent'', la cual contiene la información relativa al log que generó la aplicación.&lt;br /&gt;
&lt;br /&gt;
===SMTPAppender===&lt;br /&gt;
&lt;br /&gt;
Es un Appender muy útil para la generación de alarmas vía mail. &lt;br /&gt;
&lt;br /&gt;
NOTA 1: Por estar pensado para casos de error (o tal vez por bug) sólo se envía el mail cuando el nivel de log es ERROR o superior. &lt;br /&gt;
&lt;br /&gt;
NOTA 2: Utilizar la versión de log4j 1.2.16 o superior (en las anteriores hay algún inconveniente sobre todo si se utiliza smtp.gmail.com).&lt;br /&gt;
&lt;br /&gt;
==== Ejemplo de uso ====&lt;br /&gt;
&lt;br /&gt;
Configuración en ''log4j.properties'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
# Acordate!!! Nivel ERROR o superior&lt;br /&gt;
&lt;br /&gt;
log4j.logger.com.demo.smtpAppender.MyService=ERROR, mailAppender&lt;br /&gt;
&lt;br /&gt;
# SMTP appender para alarmas via mail&lt;br /&gt;
&lt;br /&gt;
log4j.appender.mailAppender=org.apache.log4j.net.SMTPAppender&lt;br /&gt;
log4j.appender.mailAppender.Threshold=WARN&lt;br /&gt;
log4j.appender.mailAppender.BufferSize=10&lt;br /&gt;
log4j.appender.mailAppender.To=&amp;lt;mails_destino_separados_por_coma&amp;gt;&lt;br /&gt;
log4j.appender.mailAppender.From=&amp;lt;mail_from&amp;gt;&lt;br /&gt;
log4j.appender.mailAppender.SMTPHost=&amp;lt;smtp_host&amp;gt;&lt;br /&gt;
log4j.appender.mailAppender.SMTPPort=&amp;lt;puerto&amp;gt;&lt;br /&gt;
log4j.appender.mailAppender.SMTPUsername=&amp;lt;username&amp;gt;&lt;br /&gt;
log4j.appender.mailAppender.SMTPPassword=&amp;lt;password&amp;gt;&lt;br /&gt;
log4j.appender.mailAppender.SMTPProtocol=smtps&lt;br /&gt;
log4j.appender.mailAppender.Subject=Alarma generada con Log4J&lt;br /&gt;
log4j.appender.mailAppender.layout=org.apache.log4j.PatternLayout&lt;br /&gt;
log4j.appender.mailAppender.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esta configuración los logs de nivel error o superior de la clase MyService enviarán un mail con la información que se loguee.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Log4j en J2EE, en servidores WebLogic==&lt;br /&gt;
&lt;br /&gt;
Si queres compartir los mismos componentes log4j en un módulo EJB y Web, y el EJB se usa localmente, en el ear tienen que estar el EJB y el Web. El log4-*.jar en /APP-INF/lib, y log4.properties en /APP-INF/classes. /APP-INF/ en la raíz del ear. &lt;br /&gt;
&lt;br /&gt;
Y dentro del build-impl.xml del ear, los sgtes. pasos para la tarea que crea el META-INF:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;copy todir=&amp;quot;${build.dir}/APP-INF/lib&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;fileset file=&amp;quot;${log4j.jar}&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/copy&amp;gt;&lt;br /&gt;
&amp;lt;copy todir=&amp;quot;${build.dir}/APP-INF/classes&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;fileset file=&amp;quot;${log4j.properties}&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/copy&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Log4J en Debug==&lt;br /&gt;
&lt;br /&gt;
Se puede usar el argumento '''-Dlog4j.debug''' como parametro para la JVM y muestra algunas cosas de log4J por consola, como por ejemplo, el archivo desde donde está levantando las propiedades.&lt;br /&gt;
&lt;br /&gt;
==Obtención del Logger==&lt;br /&gt;
Existe una serie de variantes para definir y obtener el logger de una clase:&lt;br /&gt;
&lt;br /&gt;
===Los modificadores===&lt;br /&gt;
====private====&lt;br /&gt;
Por lo general queremos que el logger se reporte como la clase que se está ejecutando. Utilizando private nos aseguramos que una clase que herede tenga que declarar su propio Logger y no usará accidentalmente el de la superclase. Contrariamente, si queremos por granularidad que utilice el de la superclase, habrá que declararlo como protected.&lt;br /&gt;
&lt;br /&gt;
====final====&lt;br /&gt;
La referencia al logger es la misma durante todo el ciclo de vida de una clase (si se declara static) o de un objeto (si es atributo de instancia). Por lo tanto, declarándola final se expresa esto, se protege a una asignación errónea y se mejora la performance.&lt;br /&gt;
&lt;br /&gt;
====static====&lt;br /&gt;
La creación del Logger está administrada por una fábrica a la que le pedimos las instancias. Es responsabilidad de la fábrica darnos la instancia correcta. En este caso, la motivación de utilizar static no es la de tener una sola copia. La motivación es que los logger no deben serializarse, deberían ser transient. Siendo static es una variable de la clase y no un atributo de la instancia, por lo que no será serializado. La razón de no marcarlo como transient (que sería conceptualmente más acertado) es que se debería implementar un mecanismo para que cuando la instancia es des-serializada, vuelva a obtener una copia del logger.&lt;br /&gt;
&lt;br /&gt;
====transient====&lt;br /&gt;
Los logger no deben ser serializados, por eso deberían ser marcados como transient. Es más fácil marcarlos como static ya que de esta forma no es necesario volver a obtenerlos cuando la clase es des-serializada. Si la clase no es serializable, no es necesario.&lt;br /&gt;
&lt;br /&gt;
===Clave para la obtención del logger===&lt;br /&gt;
El logger se le pide a la fábrica a través de una clave. Esta clave es de tipo String. El método está sobrecargado para recibir también un objeto de tipo class que luego la fábrica convertirá a String.&lt;br /&gt;
&lt;br /&gt;
====String====&lt;br /&gt;
 private static final Logger log = Logger.getLogger(&amp;quot;com.foo.bar.Blah&amp;quot;);&lt;br /&gt;
Utilizando un String se obtiene un logger independientemente de la clase donde se esté. Si lo que se busca el logger para la clase, esta es la forma más riesgosa ya que no está verificada por el compilador.&lt;br /&gt;
&lt;br /&gt;
====Objeto class====&lt;br /&gt;
 private static final Logger log = Logger.getLogger(Blah.class);&lt;br /&gt;
Utilizando un objeto de tipo Class permite que el compilador verifique el nombre de la clase. También se actualiza si se utiliza alguna herramienta o IDE para cambiar el nomre de la clase.&lt;br /&gt;
&lt;br /&gt;
====método getClass()====&lt;br /&gt;
 private transient Logger log = Logger.getLogger(getClass());&lt;br /&gt;
En este caso la clave se genera en tiempo de ejecución pidiendo al objeto su clase a través del método getClass(). Esto tiene la ventaja de que siempre tendrá el nombre apropiado de la clase. Tiene la restricción de que sólo se podrá utilizar si el logger es un atributo de  instancia (no static).&lt;br /&gt;
&lt;br /&gt;
Otra particularidad es que el método getClass() invocado en una clase padre responderá desde la clase hija.&lt;br /&gt;
&lt;br /&gt;
En caso de que el objeto sea serializable habrá que agregar el modificador transient para que no se serialice el logger.&lt;br /&gt;
&lt;br /&gt;
===Conclusión===&lt;br /&gt;
La forma práctica de no cometer errores es la de utilizar la combinación más restrictiva y cambiarla sólo si se tiene alguna razón claramente justificada e implementando los mecanismos necesarios.&lt;br /&gt;
&lt;br /&gt;
Forma típica:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
public class Blah {&lt;br /&gt;
    private static final Logger log = Logger.getLogger(Blah.class);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Log4JMDC ==&lt;br /&gt;
MDC es una característica de [[Log4J]] que permite agregar información adicional (de forma &amp;quot;clave=valor&amp;quot;), que luego puede ser referenciada en el patrón de log. Aquí entonces podemos almacenar datos generales (como ser, el nombre de usuario) y mostrarlos en todos los logs que se generen. &lt;br /&gt;
&lt;br /&gt;
En el patrón de log, se pueden hacer referencia a las variables del MDC usando: &lt;br /&gt;
 %X{clave}&lt;br /&gt;
&lt;br /&gt;
Los datos del MDC se guardan en el thread en ejecución. Un uso común es crear un Filter web, y allí guardar el nombre de usuario logueado en el entorno MDC, para que luego pueda loguearse. &lt;br /&gt;
&lt;br /&gt;
=== Filter web con MDC ===&lt;br /&gt;
El siguiente es un filter web común que guarda la variable &amp;quot;username&amp;quot; en el MDC, para luego referenciarla en patrón de log4j.xml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * To change this template, choose Tools | Templates&lt;br /&gt;
 * and open the template in the editor.&lt;br /&gt;
 */&lt;br /&gt;
package com.dosideas.mdc.filter;&lt;br /&gt;
&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import javax.servlet.*;&lt;br /&gt;
import org.apache.log4j.MDC;&lt;br /&gt;
import org.springframework.security.core.Authentication;&lt;br /&gt;
import org.springframework.security.core.context.SecurityContextHolder;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Adds MDC information for Log4j. In particular, it adds the username (if&lt;br /&gt;
 * available) to MDC.&lt;br /&gt;
 */&lt;br /&gt;
public class Log4jMDCFilter implements Filter {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {&lt;br /&gt;
&lt;br /&gt;
        String username = obtenerNombreDeUsuarioLogueado();&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            MDC.put(&amp;quot;username&amp;quot;, username);&lt;br /&gt;
            chain.doFilter(request, response);&lt;br /&gt;
        } finally {&lt;br /&gt;
            MDC.remove(&amp;quot;username&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void init(FilterConfig filterConfig) throws ServletException { }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void destroy() { }&lt;br /&gt;
&lt;br /&gt;
    private String obtenerNombreDeUsuarioLogueado() { .... }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego, en el archivo log4j.xml podemos hacer uso de la variable username (noten el valor del atributo &amp;quot;ConversionPattern&amp;quot;): &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE log4j:configuration SYSTEM &amp;quot;log4j.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;log4j:configuration xmlns:log4j=&amp;quot;http://jakarta.apache.org/log4j/&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;appender name=&amp;quot;console&amp;quot; class=&amp;quot;org.apache.log4j.ConsoleAppender&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;param name=&amp;quot;Target&amp;quot; value=&amp;quot;System.out&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;layout class=&amp;quot;org.apache.log4j.PatternLayout&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;param name=&amp;quot;ConversionPattern&amp;quot; value=&amp;quot;%-5p %d{ISO8601} [%X{username}] %c - %m%n&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/layout&amp;gt;&lt;br /&gt;
    &amp;lt;/appender&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;root&amp;gt;&lt;br /&gt;
        &amp;lt;priority value =&amp;quot;debug&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;appender-ref ref=&amp;quot;console&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/root&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/log4j:configuration&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modificar log4j en ejecución ==&lt;br /&gt;
Utilizando un listener de spring se puede configurar la ruta del archivo log4j.properties (fuera del empaquetado) y el tiempo en que se vuelve a leer el mismo, lo cual nos permite modificar sus valores en ejecucion sin necesidad de redeployar la aplicacion. &lt;br /&gt;
&lt;br /&gt;
Para esto se configura dentro del web.xml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;listener&amp;gt;&lt;br /&gt;
  &amp;lt;listener-class&amp;gt;org.springframework.web.util.Log4jConfigListener&amp;lt;/listener-class&amp;gt;&lt;br /&gt;
&amp;lt;/listener&amp;gt;&lt;br /&gt;
&amp;lt;context-param&amp;gt;&lt;br /&gt;
        &amp;lt;param-name&amp;gt;log4jConfigLocation&amp;lt;/param-name&amp;gt;&lt;br /&gt;
        &amp;lt;param-value&amp;gt;file:/path/log4j.properties&amp;lt;/param-value&amp;gt;&lt;br /&gt;
&amp;lt;/context-param&amp;gt;&lt;br /&gt;
&amp;lt;context-param&amp;gt;&lt;br /&gt;
        &amp;lt;param-name&amp;gt;log4jRefreshInterval&amp;lt;/param-name&amp;gt;&lt;br /&gt;
        &amp;lt;param-value&amp;gt;5000&amp;lt;/param-value&amp;gt;&lt;br /&gt;
&amp;lt;/context-param&amp;gt;   &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un error con el que nos podemos topar al momento de agregar esta configuración e intentar desplegar en Weblogic es el siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;Cannot set web app root system property when WAR file is not expanded&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ante este error, la solución es agregar en el weblogic.xml dentro del tag &amp;lt;weblogic-web-app&amp;gt; el siguiente código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;container-descriptor&amp;gt;&lt;br /&gt;
        &amp;lt;show-archived-real-path-enabled&amp;gt;true&amp;lt;/show-archived-real-path-enabled&amp;gt;&lt;br /&gt;
&amp;lt;/container-descriptor&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [http://logging.apache.org/log4j Web oficial de Log4J]&lt;br /&gt;
* [http://logging.apache.org/log4j/docs/api/org/apache/log4j/spi/LoggingEvent.html Javadoc del LogginEvent]&lt;br /&gt;
* [http://www.slideshare.net/Emmerson_Miranda/log4j-1215-short-manual Introducción a Log4j]&lt;br /&gt;
* [http://books.google.com.ar/books?id=vHvY008Zq-YC&amp;amp;pg=PA158&amp;amp;lpg=PA158&amp;amp;dq=weblogic+same+class+loader+log4j&amp;amp;source=bl&amp;amp;ots=yh8Z3e1X7C&amp;amp;sig=x81fCioIEn5nGAZNRg8kLNcOk0Y&amp;amp;hl=es&amp;amp;ei=x267Sum5HprKtgfD1NXEDQ&amp;amp;sa=X&amp;amp;oi=book_result&amp;amp;ct=result&amp;amp;resnum=7#v=onepage&amp;amp;q=weblogic%20same%20class%20loader%20log4j&amp;amp;f=false Pro Apache Log4j]&lt;/div&gt;</summary>
		<author><name>Fguerra</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Log4J&amp;diff=6464</id>
		<title>Log4J</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Log4J&amp;diff=6464"/>
				<updated>2011-12-28T13:18:44Z</updated>
		
		<summary type="html">&lt;p&gt;Fguerra: /* Modificar log4j en ejecución */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Java]]&lt;br /&gt;
Log4J es una librería para resolver el log de aplicaciones [[Java]].&lt;br /&gt;
&lt;br /&gt;
==Los Appender==&lt;br /&gt;
Log4J utiliza &amp;quot;appenders&amp;quot; para guardar el log generado por las aplicaciones. Un appender es el encargado de procesar un mensaje de log enviado por la aplicación. Usualmente se encarga de almacenarlo en algún medio persistente, como ser un archivo. &lt;br /&gt;
&lt;br /&gt;
Existen distintos appenders para guardar logs en archivos, base de datos o colas de mensajeria. &lt;br /&gt;
&lt;br /&gt;
===JMSAppnder===&lt;br /&gt;
&lt;br /&gt;
Log4J cuenta con un Appender especial que redirecciona los eventos de log a un Topic [[JMS]].&lt;br /&gt;
&lt;br /&gt;
El appender a utilizar es ''org.apache.log4j.net.JMSAppender'', el cual se encarga de enviar los eventos de log a un Topic asociado. Un topic es parecido a una cola, pero con la diferencia que los mensajes se distribuyen a todos los suscriptores de la misma. Si no hay suscriptores, el mensaje se pierde.&lt;br /&gt;
&lt;br /&gt;
El JMSAppnder es muy útil en un ambiente en cluster, para centralizar la información de los log en un único lugar.&lt;br /&gt;
&lt;br /&gt;
==== Ejemplo de uso ====&lt;br /&gt;
&lt;br /&gt;
En la práctica, utilizar log4j con este appender es igual que en cualquier otro caso. En el archivo de configuración ''log4j.properties'' es necesario agregar el appender en cuestión.&lt;br /&gt;
&lt;br /&gt;
 log4j.logger.com.zim=DEBUG, jms&lt;br /&gt;
 log4j.appender.jms=org.apache.log4j.net.JMSAppender&lt;br /&gt;
 log4j.appender.jms.InitialContextFactoryName=weblogic.jndi.WLInitialContextFactory&lt;br /&gt;
 log4j.appender.jms.ProviderURL=t3://miApplicationServer:7001&lt;br /&gt;
 log4j.appender.jms.TopicConnectionFactoryBindingName=JmsZimCF&lt;br /&gt;
 log4j.appender.jms.TopicBindingName=ZimTopic&lt;br /&gt;
 log4j.appender.jms.locationInfo=true&lt;br /&gt;
&lt;br /&gt;
En el ejemplo, utilizamos el Connection Factory ''JmsZmiCF'' para conectarnos al topic ''ZimTopic'' (ambos teniendo que estar configurados en algún [[Servidor de Aplicaciones]]).&lt;br /&gt;
&lt;br /&gt;
Con esta configuración todos los logs de las clases que pertenezcan al paquete &amp;quot;com.zim&amp;quot; se enviaran como mensajes al topic. Al Topic se envian objetos de tipo ''LoggingEvent'', clase que contiene la información de un evento de log.&lt;br /&gt;
&lt;br /&gt;
Luego, podrá haber distintos suscriptores que tomen las acciones necesarias sobre el mensaje. Por ejemplo, podriamos tener suscriptores que guarden el log en una base de datos, u otros que envien un mail o sms.&lt;br /&gt;
&lt;br /&gt;
====Sobre el locationInfo====&lt;br /&gt;
&lt;br /&gt;
Por default, el atributo locationInfo está en &amp;quot;false&amp;quot;. Esto hace que NO se envien los datos para el objeto ''LocationInfo'' de ''LoggingEvent''. Al setearlo en true, el objeto ''LocationInfo'' contendrá la información sobre la clase, método y número de línea en donde ocurrió el error.&lt;br /&gt;
&lt;br /&gt;
====Procesando el mensaje====&lt;br /&gt;
&lt;br /&gt;
Luego, queda tan solo decidir qué hacer con el mensaje. Usualmente, será un [[Message Driven Bean]] que procese de alguna manera el mensaje que envia Log4J.&lt;br /&gt;
&lt;br /&gt;
¿Y qué envia exactamente? Log4J enviará un ''ObjectMessage'' de JMS, que contiene una instancia de ''LoggingEvent'', la cual contiene la información relativa al log que generó la aplicación.&lt;br /&gt;
&lt;br /&gt;
===SMTPAppender===&lt;br /&gt;
&lt;br /&gt;
Es un Appender muy útil para la generación de alarmas vía mail. &lt;br /&gt;
&lt;br /&gt;
NOTA 1: Por estar pensado para casos de error (o tal vez por bug) sólo se envía el mail cuando el nivel de log es ERROR o superior. &lt;br /&gt;
&lt;br /&gt;
NOTA 2: Utilizar la versión de log4j 1.2.16 o superior (en las anteriores hay algún inconveniente sobre todo si se utiliza smtp.gmail.com).&lt;br /&gt;
&lt;br /&gt;
==== Ejemplo de uso ====&lt;br /&gt;
&lt;br /&gt;
Configuración en ''log4j.properties'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
# Acordate!!! Nivel ERROR o superior&lt;br /&gt;
&lt;br /&gt;
log4j.logger.com.demo.smtpAppender.MyService=ERROR, mailAppender&lt;br /&gt;
&lt;br /&gt;
# SMTP appender para alarmas via mail&lt;br /&gt;
&lt;br /&gt;
log4j.appender.mailAppender=org.apache.log4j.net.SMTPAppender&lt;br /&gt;
log4j.appender.mailAppender.Threshold=WARN&lt;br /&gt;
log4j.appender.mailAppender.BufferSize=10&lt;br /&gt;
log4j.appender.mailAppender.To=&amp;lt;mails_destino_separados_por_coma&amp;gt;&lt;br /&gt;
log4j.appender.mailAppender.From=&amp;lt;mail_from&amp;gt;&lt;br /&gt;
log4j.appender.mailAppender.SMTPHost=&amp;lt;smtp_host&amp;gt;&lt;br /&gt;
log4j.appender.mailAppender.SMTPPort=&amp;lt;puerto&amp;gt;&lt;br /&gt;
log4j.appender.mailAppender.SMTPUsername=&amp;lt;username&amp;gt;&lt;br /&gt;
log4j.appender.mailAppender.SMTPPassword=&amp;lt;password&amp;gt;&lt;br /&gt;
log4j.appender.mailAppender.SMTPProtocol=smtps&lt;br /&gt;
log4j.appender.mailAppender.Subject=Alarma generada con Log4J&lt;br /&gt;
log4j.appender.mailAppender.layout=org.apache.log4j.PatternLayout&lt;br /&gt;
log4j.appender.mailAppender.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esta configuración los logs de nivel error o superior de la clase MyService enviarán un mail con la información que se loguee.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Log4j en J2EE, en servidores WebLogic==&lt;br /&gt;
&lt;br /&gt;
Si queres compartir los mismos componentes log4j en un módulo EJB y Web, y el EJB se usa localmente, en el ear tienen que estar el EJB y el Web. El log4-*.jar en /APP-INF/lib, y log4.properties en /APP-INF/classes. /APP-INF/ en la raíz del ear. &lt;br /&gt;
&lt;br /&gt;
Y dentro del build-impl.xml del ear, los sgtes. pasos para la tarea que crea el META-INF:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;copy todir=&amp;quot;${build.dir}/APP-INF/lib&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;fileset file=&amp;quot;${log4j.jar}&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/copy&amp;gt;&lt;br /&gt;
&amp;lt;copy todir=&amp;quot;${build.dir}/APP-INF/classes&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;fileset file=&amp;quot;${log4j.properties}&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/copy&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Log4J en Debug==&lt;br /&gt;
&lt;br /&gt;
Se puede usar el argumento '''-Dlog4j.debug''' como parametro para la JVM y muestra algunas cosas de log4J por consola, como por ejemplo, el archivo desde donde está levantando las propiedades.&lt;br /&gt;
&lt;br /&gt;
==Obtención del Logger==&lt;br /&gt;
Existe una serie de variantes para definir y obtener el logger de una clase:&lt;br /&gt;
&lt;br /&gt;
===Los modificadores===&lt;br /&gt;
====private====&lt;br /&gt;
Por lo general queremos que el logger se reporte como la clase que se está ejecutando. Utilizando private nos aseguramos que una clase que herede tenga que declarar su propio Logger y no usará accidentalmente el de la superclase. Contrariamente, si queremos por granularidad que utilice el de la superclase, habrá que declararlo como protected.&lt;br /&gt;
&lt;br /&gt;
====final====&lt;br /&gt;
La referencia al logger es la misma durante todo el ciclo de vida de una clase (si se declara static) o de un objeto (si es atributo de instancia). Por lo tanto, declarándola final se expresa esto, se protege a una asignación errónea y se mejora la performance.&lt;br /&gt;
&lt;br /&gt;
====static====&lt;br /&gt;
La creación del Logger está administrada por una fábrica a la que le pedimos las instancias. Es responsabilidad de la fábrica darnos la instancia correcta. En este caso, la motivación de utilizar static no es la de tener una sola copia. La motivación es que los logger no deben serializarse, deberían ser transient. Siendo static es una variable de la clase y no un atributo de la instancia, por lo que no será serializado. La razón de no marcarlo como transient (que sería conceptualmente más acertado) es que se debería implementar un mecanismo para que cuando la instancia es des-serializada, vuelva a obtener una copia del logger.&lt;br /&gt;
&lt;br /&gt;
====transient====&lt;br /&gt;
Los logger no deben ser serializados, por eso deberían ser marcados como transient. Es más fácil marcarlos como static ya que de esta forma no es necesario volver a obtenerlos cuando la clase es des-serializada. Si la clase no es serializable, no es necesario.&lt;br /&gt;
&lt;br /&gt;
===Clave para la obtención del logger===&lt;br /&gt;
El logger se le pide a la fábrica a través de una clave. Esta clave es de tipo String. El método está sobrecargado para recibir también un objeto de tipo class que luego la fábrica convertirá a String.&lt;br /&gt;
&lt;br /&gt;
====String====&lt;br /&gt;
 private static final Logger log = Logger.getLogger(&amp;quot;com.foo.bar.Blah&amp;quot;);&lt;br /&gt;
Utilizando un String se obtiene un logger independientemente de la clase donde se esté. Si lo que se busca el logger para la clase, esta es la forma más riesgosa ya que no está verificada por el compilador.&lt;br /&gt;
&lt;br /&gt;
====Objeto class====&lt;br /&gt;
 private static final Logger log = Logger.getLogger(Blah.class);&lt;br /&gt;
Utilizando un objeto de tipo Class permite que el compilador verifique el nombre de la clase. También se actualiza si se utiliza alguna herramienta o IDE para cambiar el nomre de la clase.&lt;br /&gt;
&lt;br /&gt;
====método getClass()====&lt;br /&gt;
 private transient Logger log = Logger.getLogger(getClass());&lt;br /&gt;
En este caso la clave se genera en tiempo de ejecución pidiendo al objeto su clase a través del método getClass(). Esto tiene la ventaja de que siempre tendrá el nombre apropiado de la clase. Tiene la restricción de que sólo se podrá utilizar si el logger es un atributo de  instancia (no static).&lt;br /&gt;
&lt;br /&gt;
Otra particularidad es que el método getClass() invocado en una clase padre responderá desde la clase hija.&lt;br /&gt;
&lt;br /&gt;
En caso de que el objeto sea serializable habrá que agregar el modificador transient para que no se serialice el logger.&lt;br /&gt;
&lt;br /&gt;
===Conclusión===&lt;br /&gt;
La forma práctica de no cometer errores es la de utilizar la combinación más restrictiva y cambiarla sólo si se tiene alguna razón claramente justificada e implementando los mecanismos necesarios.&lt;br /&gt;
&lt;br /&gt;
Forma típica:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
public class Blah {&lt;br /&gt;
    private static final Logger log = Logger.getLogger(Blah.class);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Log4JMDC ==&lt;br /&gt;
MDC es una característica de [[Log4J]] que permite agregar información adicional (de forma &amp;quot;clave=valor&amp;quot;), que luego puede ser referenciada en el patrón de log. Aquí entonces podemos almacenar datos generales (como ser, el nombre de usuario) y mostrarlos en todos los logs que se generen. &lt;br /&gt;
&lt;br /&gt;
En el patrón de log, se pueden hacer referencia a las variables del MDC usando: &lt;br /&gt;
 %X{clave}&lt;br /&gt;
&lt;br /&gt;
Los datos del MDC se guardan en el thread en ejecución. Un uso común es crear un Filter web, y allí guardar el nombre de usuario logueado en el entorno MDC, para que luego pueda loguearse. &lt;br /&gt;
&lt;br /&gt;
=== Filter web con MDC ===&lt;br /&gt;
El siguiente es un filter web común que guarda la variable &amp;quot;username&amp;quot; en el MDC, para luego referenciarla en patrón de log4j.xml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * To change this template, choose Tools | Templates&lt;br /&gt;
 * and open the template in the editor.&lt;br /&gt;
 */&lt;br /&gt;
package com.dosideas.mdc.filter;&lt;br /&gt;
&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import javax.servlet.*;&lt;br /&gt;
import org.apache.log4j.MDC;&lt;br /&gt;
import org.springframework.security.core.Authentication;&lt;br /&gt;
import org.springframework.security.core.context.SecurityContextHolder;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Adds MDC information for Log4j. In particular, it adds the username (if&lt;br /&gt;
 * available) to MDC.&lt;br /&gt;
 */&lt;br /&gt;
public class Log4jMDCFilter implements Filter {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {&lt;br /&gt;
&lt;br /&gt;
        String username = obtenerNombreDeUsuarioLogueado();&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            MDC.put(&amp;quot;username&amp;quot;, username);&lt;br /&gt;
            chain.doFilter(request, response);&lt;br /&gt;
        } finally {&lt;br /&gt;
            MDC.remove(&amp;quot;username&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void init(FilterConfig filterConfig) throws ServletException { }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void destroy() { }&lt;br /&gt;
&lt;br /&gt;
    private String obtenerNombreDeUsuarioLogueado() { .... }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego, en el archivo log4j.xml podemos hacer uso de la variable username (noten el valor del atributo &amp;quot;ConversionPattern&amp;quot;): &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE log4j:configuration SYSTEM &amp;quot;log4j.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;log4j:configuration xmlns:log4j=&amp;quot;http://jakarta.apache.org/log4j/&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;appender name=&amp;quot;console&amp;quot; class=&amp;quot;org.apache.log4j.ConsoleAppender&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;param name=&amp;quot;Target&amp;quot; value=&amp;quot;System.out&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;layout class=&amp;quot;org.apache.log4j.PatternLayout&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;param name=&amp;quot;ConversionPattern&amp;quot; value=&amp;quot;%-5p %d{ISO8601} [%X{username}] %c - %m%n&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/layout&amp;gt;&lt;br /&gt;
    &amp;lt;/appender&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;root&amp;gt;&lt;br /&gt;
        &amp;lt;priority value =&amp;quot;debug&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;appender-ref ref=&amp;quot;console&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/root&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/log4j:configuration&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modificar log4j en ejecución ==&lt;br /&gt;
Utilizando un listener de spring se puede configurar la ruta del archivo log4j.properties (fuera del empaquetado) y el tiempo en que se vuelve a leer el mismo, lo cual nos permite modificar sus valores en ejecucion sin necesidad de redeployar la aplicacion. &lt;br /&gt;
&lt;br /&gt;
Para esto se configura dentro del web.xml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;listener&amp;gt;&lt;br /&gt;
  &amp;lt;listener-class&amp;gt;org.springframework.web.util.Log4jConfigListener&amp;lt;/listener-class&amp;gt;&lt;br /&gt;
&amp;lt;/listener&amp;gt;&lt;br /&gt;
&amp;lt;context-param&amp;gt;&lt;br /&gt;
        &amp;lt;param-name&amp;gt;log4jConfigLocation&amp;lt;/param-name&amp;gt;&lt;br /&gt;
        &amp;lt;param-value&amp;gt;file:/path/log4j.properties&amp;lt;/param-value&amp;gt;&lt;br /&gt;
&amp;lt;/context-param&amp;gt;&lt;br /&gt;
&amp;lt;context-param&amp;gt;&lt;br /&gt;
        &amp;lt;param-name&amp;gt;log4jRefreshInterval&amp;lt;/param-name&amp;gt;&lt;br /&gt;
        &amp;lt;param-value&amp;gt;5000&amp;lt;/param-value&amp;gt;&lt;br /&gt;
&amp;lt;/context-param&amp;gt;   &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un error con el que nos podemos topar al momento de agregar esta configuración e intentar desplegar en Weblogic es el siguiente:&lt;br /&gt;
&lt;br /&gt;
Cannot set web app root system property when WAR file is not expanded&lt;br /&gt;
&lt;br /&gt;
Ante este error, la solución es agregar en el weblogic.xml dentro del tag &amp;lt;weblogic-web-app&amp;gt; el siguiente código:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;container-descriptor&amp;gt;&lt;br /&gt;
        &amp;lt;show-archived-real-path-enabled&amp;gt;true&amp;lt;/show-archived-real-path-enabled&amp;gt;&lt;br /&gt;
&amp;lt;/container-descriptor&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [http://logging.apache.org/log4j Web oficial de Log4J]&lt;br /&gt;
* [http://logging.apache.org/log4j/docs/api/org/apache/log4j/spi/LoggingEvent.html Javadoc del LogginEvent]&lt;br /&gt;
* [http://www.slideshare.net/Emmerson_Miranda/log4j-1215-short-manual Introducción a Log4j]&lt;br /&gt;
* [http://books.google.com.ar/books?id=vHvY008Zq-YC&amp;amp;pg=PA158&amp;amp;lpg=PA158&amp;amp;dq=weblogic+same+class+loader+log4j&amp;amp;source=bl&amp;amp;ots=yh8Z3e1X7C&amp;amp;sig=x81fCioIEn5nGAZNRg8kLNcOk0Y&amp;amp;hl=es&amp;amp;ei=x267Sum5HprKtgfD1NXEDQ&amp;amp;sa=X&amp;amp;oi=book_result&amp;amp;ct=result&amp;amp;resnum=7#v=onepage&amp;amp;q=weblogic%20same%20class%20loader%20log4j&amp;amp;f=false Pro Apache Log4j]&lt;/div&gt;</summary>
		<author><name>Fguerra</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Log4J&amp;diff=6463</id>
		<title>Log4J</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Log4J&amp;diff=6463"/>
				<updated>2011-12-27T20:01:39Z</updated>
		
		<summary type="html">&lt;p&gt;Fguerra: /* Modificar log4j en ejecución */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Java]]&lt;br /&gt;
Log4J es una librería para resolver el log de aplicaciones [[Java]].&lt;br /&gt;
&lt;br /&gt;
==Los Appender==&lt;br /&gt;
Log4J utiliza &amp;quot;appenders&amp;quot; para guardar el log generado por las aplicaciones. Un appender es el encargado de procesar un mensaje de log enviado por la aplicación. Usualmente se encarga de almacenarlo en algún medio persistente, como ser un archivo. &lt;br /&gt;
&lt;br /&gt;
Existen distintos appenders para guardar logs en archivos, base de datos o colas de mensajeria. &lt;br /&gt;
&lt;br /&gt;
===JMSAppnder===&lt;br /&gt;
&lt;br /&gt;
Log4J cuenta con un Appender especial que redirecciona los eventos de log a un Topic [[JMS]].&lt;br /&gt;
&lt;br /&gt;
El appender a utilizar es ''org.apache.log4j.net.JMSAppender'', el cual se encarga de enviar los eventos de log a un Topic asociado. Un topic es parecido a una cola, pero con la diferencia que los mensajes se distribuyen a todos los suscriptores de la misma. Si no hay suscriptores, el mensaje se pierde.&lt;br /&gt;
&lt;br /&gt;
El JMSAppnder es muy útil en un ambiente en cluster, para centralizar la información de los log en un único lugar.&lt;br /&gt;
&lt;br /&gt;
==== Ejemplo de uso ====&lt;br /&gt;
&lt;br /&gt;
En la práctica, utilizar log4j con este appender es igual que en cualquier otro caso. En el archivo de configuración ''log4j.properties'' es necesario agregar el appender en cuestión.&lt;br /&gt;
&lt;br /&gt;
 log4j.logger.com.zim=DEBUG, jms&lt;br /&gt;
 log4j.appender.jms=org.apache.log4j.net.JMSAppender&lt;br /&gt;
 log4j.appender.jms.InitialContextFactoryName=weblogic.jndi.WLInitialContextFactory&lt;br /&gt;
 log4j.appender.jms.ProviderURL=t3://miApplicationServer:7001&lt;br /&gt;
 log4j.appender.jms.TopicConnectionFactoryBindingName=JmsZimCF&lt;br /&gt;
 log4j.appender.jms.TopicBindingName=ZimTopic&lt;br /&gt;
 log4j.appender.jms.locationInfo=true&lt;br /&gt;
&lt;br /&gt;
En el ejemplo, utilizamos el Connection Factory ''JmsZmiCF'' para conectarnos al topic ''ZimTopic'' (ambos teniendo que estar configurados en algún [[Servidor de Aplicaciones]]).&lt;br /&gt;
&lt;br /&gt;
Con esta configuración todos los logs de las clases que pertenezcan al paquete &amp;quot;com.zim&amp;quot; se enviaran como mensajes al topic. Al Topic se envian objetos de tipo ''LoggingEvent'', clase que contiene la información de un evento de log.&lt;br /&gt;
&lt;br /&gt;
Luego, podrá haber distintos suscriptores que tomen las acciones necesarias sobre el mensaje. Por ejemplo, podriamos tener suscriptores que guarden el log en una base de datos, u otros que envien un mail o sms.&lt;br /&gt;
&lt;br /&gt;
====Sobre el locationInfo====&lt;br /&gt;
&lt;br /&gt;
Por default, el atributo locationInfo está en &amp;quot;false&amp;quot;. Esto hace que NO se envien los datos para el objeto ''LocationInfo'' de ''LoggingEvent''. Al setearlo en true, el objeto ''LocationInfo'' contendrá la información sobre la clase, método y número de línea en donde ocurrió el error.&lt;br /&gt;
&lt;br /&gt;
====Procesando el mensaje====&lt;br /&gt;
&lt;br /&gt;
Luego, queda tan solo decidir qué hacer con el mensaje. Usualmente, será un [[Message Driven Bean]] que procese de alguna manera el mensaje que envia Log4J.&lt;br /&gt;
&lt;br /&gt;
¿Y qué envia exactamente? Log4J enviará un ''ObjectMessage'' de JMS, que contiene una instancia de ''LoggingEvent'', la cual contiene la información relativa al log que generó la aplicación.&lt;br /&gt;
&lt;br /&gt;
===SMTPAppender===&lt;br /&gt;
&lt;br /&gt;
Es un Appender muy útil para la generación de alarmas vía mail. &lt;br /&gt;
&lt;br /&gt;
NOTA 1: Por estar pensado para casos de error (o tal vez por bug) sólo se envía el mail cuando el nivel de log es ERROR o superior. &lt;br /&gt;
&lt;br /&gt;
NOTA 2: Utilizar la versión de log4j 1.2.16 o superior (en las anteriores hay algún inconveniente sobre todo si se utiliza smtp.gmail.com).&lt;br /&gt;
&lt;br /&gt;
==== Ejemplo de uso ====&lt;br /&gt;
&lt;br /&gt;
Configuración en ''log4j.properties'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
# Acordate!!! Nivel ERROR o superior&lt;br /&gt;
&lt;br /&gt;
log4j.logger.com.demo.smtpAppender.MyService=ERROR, mailAppender&lt;br /&gt;
&lt;br /&gt;
# SMTP appender para alarmas via mail&lt;br /&gt;
&lt;br /&gt;
log4j.appender.mailAppender=org.apache.log4j.net.SMTPAppender&lt;br /&gt;
log4j.appender.mailAppender.Threshold=WARN&lt;br /&gt;
log4j.appender.mailAppender.BufferSize=10&lt;br /&gt;
log4j.appender.mailAppender.To=&amp;lt;mails_destino_separados_por_coma&amp;gt;&lt;br /&gt;
log4j.appender.mailAppender.From=&amp;lt;mail_from&amp;gt;&lt;br /&gt;
log4j.appender.mailAppender.SMTPHost=&amp;lt;smtp_host&amp;gt;&lt;br /&gt;
log4j.appender.mailAppender.SMTPPort=&amp;lt;puerto&amp;gt;&lt;br /&gt;
log4j.appender.mailAppender.SMTPUsername=&amp;lt;username&amp;gt;&lt;br /&gt;
log4j.appender.mailAppender.SMTPPassword=&amp;lt;password&amp;gt;&lt;br /&gt;
log4j.appender.mailAppender.SMTPProtocol=smtps&lt;br /&gt;
log4j.appender.mailAppender.Subject=Alarma generada con Log4J&lt;br /&gt;
log4j.appender.mailAppender.layout=org.apache.log4j.PatternLayout&lt;br /&gt;
log4j.appender.mailAppender.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Con esta configuración los logs de nivel error o superior de la clase MyService enviarán un mail con la información que se loguee.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Log4j en J2EE, en servidores WebLogic==&lt;br /&gt;
&lt;br /&gt;
Si queres compartir los mismos componentes log4j en un módulo EJB y Web, y el EJB se usa localmente, en el ear tienen que estar el EJB y el Web. El log4-*.jar en /APP-INF/lib, y log4.properties en /APP-INF/classes. /APP-INF/ en la raíz del ear. &lt;br /&gt;
&lt;br /&gt;
Y dentro del build-impl.xml del ear, los sgtes. pasos para la tarea que crea el META-INF:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;copy todir=&amp;quot;${build.dir}/APP-INF/lib&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;fileset file=&amp;quot;${log4j.jar}&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/copy&amp;gt;&lt;br /&gt;
&amp;lt;copy todir=&amp;quot;${build.dir}/APP-INF/classes&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;fileset file=&amp;quot;${log4j.properties}&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/copy&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Log4J en Debug==&lt;br /&gt;
&lt;br /&gt;
Se puede usar el argumento '''-Dlog4j.debug''' como parametro para la JVM y muestra algunas cosas de log4J por consola, como por ejemplo, el archivo desde donde está levantando las propiedades.&lt;br /&gt;
&lt;br /&gt;
==Obtención del Logger==&lt;br /&gt;
Existe una serie de variantes para definir y obtener el logger de una clase:&lt;br /&gt;
&lt;br /&gt;
===Los modificadores===&lt;br /&gt;
====private====&lt;br /&gt;
Por lo general queremos que el logger se reporte como la clase que se está ejecutando. Utilizando private nos aseguramos que una clase que herede tenga que declarar su propio Logger y no usará accidentalmente el de la superclase. Contrariamente, si queremos por granularidad que utilice el de la superclase, habrá que declararlo como protected.&lt;br /&gt;
&lt;br /&gt;
====final====&lt;br /&gt;
La referencia al logger es la misma durante todo el ciclo de vida de una clase (si se declara static) o de un objeto (si es atributo de instancia). Por lo tanto, declarándola final se expresa esto, se protege a una asignación errónea y se mejora la performance.&lt;br /&gt;
&lt;br /&gt;
====static====&lt;br /&gt;
La creación del Logger está administrada por una fábrica a la que le pedimos las instancias. Es responsabilidad de la fábrica darnos la instancia correcta. En este caso, la motivación de utilizar static no es la de tener una sola copia. La motivación es que los logger no deben serializarse, deberían ser transient. Siendo static es una variable de la clase y no un atributo de la instancia, por lo que no será serializado. La razón de no marcarlo como transient (que sería conceptualmente más acertado) es que se debería implementar un mecanismo para que cuando la instancia es des-serializada, vuelva a obtener una copia del logger.&lt;br /&gt;
&lt;br /&gt;
====transient====&lt;br /&gt;
Los logger no deben ser serializados, por eso deberían ser marcados como transient. Es más fácil marcarlos como static ya que de esta forma no es necesario volver a obtenerlos cuando la clase es des-serializada. Si la clase no es serializable, no es necesario.&lt;br /&gt;
&lt;br /&gt;
===Clave para la obtención del logger===&lt;br /&gt;
El logger se le pide a la fábrica a través de una clave. Esta clave es de tipo String. El método está sobrecargado para recibir también un objeto de tipo class que luego la fábrica convertirá a String.&lt;br /&gt;
&lt;br /&gt;
====String====&lt;br /&gt;
 private static final Logger log = Logger.getLogger(&amp;quot;com.foo.bar.Blah&amp;quot;);&lt;br /&gt;
Utilizando un String se obtiene un logger independientemente de la clase donde se esté. Si lo que se busca el logger para la clase, esta es la forma más riesgosa ya que no está verificada por el compilador.&lt;br /&gt;
&lt;br /&gt;
====Objeto class====&lt;br /&gt;
 private static final Logger log = Logger.getLogger(Blah.class);&lt;br /&gt;
Utilizando un objeto de tipo Class permite que el compilador verifique el nombre de la clase. También se actualiza si se utiliza alguna herramienta o IDE para cambiar el nomre de la clase.&lt;br /&gt;
&lt;br /&gt;
====método getClass()====&lt;br /&gt;
 private transient Logger log = Logger.getLogger(getClass());&lt;br /&gt;
En este caso la clave se genera en tiempo de ejecución pidiendo al objeto su clase a través del método getClass(). Esto tiene la ventaja de que siempre tendrá el nombre apropiado de la clase. Tiene la restricción de que sólo se podrá utilizar si el logger es un atributo de  instancia (no static).&lt;br /&gt;
&lt;br /&gt;
Otra particularidad es que el método getClass() invocado en una clase padre responderá desde la clase hija.&lt;br /&gt;
&lt;br /&gt;
En caso de que el objeto sea serializable habrá que agregar el modificador transient para que no se serialice el logger.&lt;br /&gt;
&lt;br /&gt;
===Conclusión===&lt;br /&gt;
La forma práctica de no cometer errores es la de utilizar la combinación más restrictiva y cambiarla sólo si se tiene alguna razón claramente justificada e implementando los mecanismos necesarios.&lt;br /&gt;
&lt;br /&gt;
Forma típica:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
public class Blah {&lt;br /&gt;
    private static final Logger log = Logger.getLogger(Blah.class);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Log4JMDC ==&lt;br /&gt;
MDC es una característica de [[Log4J]] que permite agregar información adicional (de forma &amp;quot;clave=valor&amp;quot;), que luego puede ser referenciada en el patrón de log. Aquí entonces podemos almacenar datos generales (como ser, el nombre de usuario) y mostrarlos en todos los logs que se generen. &lt;br /&gt;
&lt;br /&gt;
En el patrón de log, se pueden hacer referencia a las variables del MDC usando: &lt;br /&gt;
 %X{clave}&lt;br /&gt;
&lt;br /&gt;
Los datos del MDC se guardan en el thread en ejecución. Un uso común es crear un Filter web, y allí guardar el nombre de usuario logueado en el entorno MDC, para que luego pueda loguearse. &lt;br /&gt;
&lt;br /&gt;
=== Filter web con MDC ===&lt;br /&gt;
El siguiente es un filter web común que guarda la variable &amp;quot;username&amp;quot; en el MDC, para luego referenciarla en patrón de log4j.xml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java5&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * To change this template, choose Tools | Templates&lt;br /&gt;
 * and open the template in the editor.&lt;br /&gt;
 */&lt;br /&gt;
package com.dosideas.mdc.filter;&lt;br /&gt;
&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import javax.servlet.*;&lt;br /&gt;
import org.apache.log4j.MDC;&lt;br /&gt;
import org.springframework.security.core.Authentication;&lt;br /&gt;
import org.springframework.security.core.context.SecurityContextHolder;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Adds MDC information for Log4j. In particular, it adds the username (if&lt;br /&gt;
 * available) to MDC.&lt;br /&gt;
 */&lt;br /&gt;
public class Log4jMDCFilter implements Filter {&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {&lt;br /&gt;
&lt;br /&gt;
        String username = obtenerNombreDeUsuarioLogueado();&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            MDC.put(&amp;quot;username&amp;quot;, username);&lt;br /&gt;
            chain.doFilter(request, response);&lt;br /&gt;
        } finally {&lt;br /&gt;
            MDC.remove(&amp;quot;username&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void init(FilterConfig filterConfig) throws ServletException { }&lt;br /&gt;
&lt;br /&gt;
    @Override&lt;br /&gt;
    public void destroy() { }&lt;br /&gt;
&lt;br /&gt;
    private String obtenerNombreDeUsuarioLogueado() { .... }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luego, en el archivo log4j.xml podemos hacer uso de la variable username (noten el valor del atributo &amp;quot;ConversionPattern&amp;quot;): &lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE log4j:configuration SYSTEM &amp;quot;log4j.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;log4j:configuration xmlns:log4j=&amp;quot;http://jakarta.apache.org/log4j/&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;appender name=&amp;quot;console&amp;quot; class=&amp;quot;org.apache.log4j.ConsoleAppender&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;param name=&amp;quot;Target&amp;quot; value=&amp;quot;System.out&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;layout class=&amp;quot;org.apache.log4j.PatternLayout&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;param name=&amp;quot;ConversionPattern&amp;quot; value=&amp;quot;%-5p %d{ISO8601} [%X{username}] %c - %m%n&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/layout&amp;gt;&lt;br /&gt;
    &amp;lt;/appender&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;root&amp;gt;&lt;br /&gt;
        &amp;lt;priority value =&amp;quot;debug&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;appender-ref ref=&amp;quot;console&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/root&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/log4j:configuration&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modificar log4j en ejecución ==&lt;br /&gt;
Utilizando un listener de spring se puede configurar la ruta del archivo log4j.properties (fuera del empaquetado) y el tiempo en que se vuelve a leer el mismo, lo cual nos permite modificar sus valores en ejecucion sin necesidad de redeployar la aplicacion. &lt;br /&gt;
&lt;br /&gt;
Para esto se configura dentro del web.xml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
&amp;lt;listener&amp;gt;&lt;br /&gt;
  &amp;lt;listener-class&amp;gt;org.springframework.web.util.Log4jConfigListener&amp;lt;/listener-class&amp;gt;&lt;br /&gt;
&amp;lt;/listener&amp;gt;&lt;br /&gt;
&amp;lt;context-param&amp;gt;&lt;br /&gt;
        &amp;lt;param-name&amp;gt;log4jConfigLocation&amp;lt;/param-name&amp;gt;&lt;br /&gt;
        &amp;lt;param-value&amp;gt;file:/path/log4j.properties&amp;lt;/param-value&amp;gt;&lt;br /&gt;
&amp;lt;/context-param&amp;gt;&lt;br /&gt;
&amp;lt;context-param&amp;gt;&lt;br /&gt;
        &amp;lt;param-name&amp;gt;log4jRefreshInterval&amp;lt;/param-name&amp;gt;&lt;br /&gt;
        &amp;lt;param-value&amp;gt;5000&amp;lt;/param-value&amp;gt;&lt;br /&gt;
&amp;lt;/context-param&amp;gt;   &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [http://logging.apache.org/log4j Web oficial de Log4J]&lt;br /&gt;
* [http://logging.apache.org/log4j/docs/api/org/apache/log4j/spi/LoggingEvent.html Javadoc del LogginEvent]&lt;br /&gt;
* [http://www.slideshare.net/Emmerson_Miranda/log4j-1215-short-manual Introducción a Log4j]&lt;br /&gt;
* [http://books.google.com.ar/books?id=vHvY008Zq-YC&amp;amp;pg=PA158&amp;amp;lpg=PA158&amp;amp;dq=weblogic+same+class+loader+log4j&amp;amp;source=bl&amp;amp;ots=yh8Z3e1X7C&amp;amp;sig=x81fCioIEn5nGAZNRg8kLNcOk0Y&amp;amp;hl=es&amp;amp;ei=x267Sum5HprKtgfD1NXEDQ&amp;amp;sa=X&amp;amp;oi=book_result&amp;amp;ct=result&amp;amp;resnum=7#v=onepage&amp;amp;q=weblogic%20same%20class%20loader%20log4j&amp;amp;f=false Pro Apache Log4j]&lt;/div&gt;</summary>
		<author><name>Fguerra</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Cache_De_Hibernate&amp;diff=6276</id>
		<title>Cache De Hibernate</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Cache_De_Hibernate&amp;diff=6276"/>
				<updated>2011-09-07T12:48:27Z</updated>
		
		<summary type="html">&lt;p&gt;Fguerra: Deshecha la edición 5830 de 31.193.8.94 (disc.)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Hibernate]]&lt;br /&gt;
Uso y configuración de la funcionalidad de cache en Hibernate.&lt;br /&gt;
&lt;br /&gt;
Generalmente todos los cache se basan en almacenar objetos en memoria para acelerar accesos posteriores, pero debemos aclarar que en Hibernate hay dos tipos de cache: el Primer Nivel y el Segundo Nivel.&lt;br /&gt;
&lt;br /&gt;
===Cache de Primer Nivel===&lt;br /&gt;
Es el que mantiene automáticamente Hibernate cuando dentro de una transacción interactuamos con la base de datos, en éste caso se mantienen en memoria los objetos que fueron cargados y si mas adelante en el flujo del proceso volvemos a necesitarlos van a ser retornados desde el cache, ahorrando accesos sobre la base de datos.&lt;br /&gt;
Lo podemos considerar como un cache de corta duración ya que es válido solamente entre el begin y el commit de una transacción, en forma aislada a las demás.&lt;br /&gt;
Hibernate lo maneja por defecto, no hay que configurar nada, si por alguna razón queremos deshabilitar o evitar el uso del cache, podemos usar un tipo especial de session: StatelessSession, se obtiene de la sessionFactory con el método openStatelessSession(). &lt;br /&gt;
Se usa en el caso de los procesos batch, por ejemplo cuando se tiene que hacer inserts o updates masivos, así se evita que cada vez que se hace el save de un objeto, el mismo se quede en memoria y en el correr del proceso se produzca un error del tipo OutOfMemoryError. La StatelessSession no interactúa con el Cache de Primer Nivel ni con el Cache de Segundo Nivel, es casi como si se utilizara JDBC directamente.&lt;br /&gt;
&lt;br /&gt;
===Cache de Segundo Nivel===&lt;br /&gt;
El Cache de Segundo Nivel permite ir varios pasos mas adelante en la mejora de la performance. La diferencia fundamental es que éste tipo de cache es válido para todas las transacciones y puede persistir en memoria durante todo el tiempo en que el aplicativo esté online, lo podríamos considerar como un cache global.&lt;br /&gt;
&lt;br /&gt;
Para habilitar el Cache de Segundo Nivel hay que realizar lo siguiente:&lt;br /&gt;
#Seleccionar un Proveedor de Cache. Por ejemplo [[EhCache]].&lt;br /&gt;
#Agregar en el hibernate.cfg.xml los siguientes properties:&lt;br /&gt;
  &amp;lt;property name=&amp;quot;hibernate.cache.provider_class&amp;quot;&amp;gt;org.hibernate.cache.EhCacheProvider&amp;lt;/property&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;hibernate.cache.use_structured_entries&amp;quot;&amp;gt;true&amp;lt;/property&amp;gt;&lt;br /&gt;
#Poner en el classpath del aplicativo el archivo de configuración ehcache.xml, según las instrucciones del proveedor.&lt;br /&gt;
#Agregar en el mapping de las clases que se queren seleccionar como &amp;quot;cacheables&amp;quot; la siguiente entrada:&lt;br /&gt;
  &amp;lt;cache usage=&amp;quot;nonstrict-read-write&amp;quot;&amp;gt;&amp;lt;/cache&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hibernate define cuatro niveles de cache que determinan el aislamiento:&lt;br /&gt;
&lt;br /&gt;
*'''transactional''': Garantiza un nivel de aislamiento hasta repeatable read. Es el nivel más estricto. Solamente se puede utilizar en clusters, es decir, con cachés distribuidas.&lt;br /&gt;
*''''read-write''': Mantiene un aislamiento hasta el nivel de commited.&lt;br /&gt;
*'''nonstrict read-write''': No ofrece garantía de consistencia entre el caché y la base de datos. Es una es'trategia ideal para almacenar datos que no cambian habitualmente y que no sean demasiado críticos.&lt;br /&gt;
*'''read-only''': Es la estrategia de concurrencia menos estricta. Recomendada para datos que nunca cambian.&lt;br /&gt;
&lt;br /&gt;
Otro tema importante es definir qué entidades se van a &amp;quot;cachear&amp;quot;, los candidatos naturales son por ejemplo las clases que representan: provincias, países, monedas o similares.&lt;br /&gt;
Hay que tener en cuenta que cuando se tienen relaciones one-to-many hacia éstas entidades, se debe configurarlas como fetch=select, no como fetch=join porque si no Hibernate va a &amp;quot;levantar&amp;quot; la relación haciendo un join en lugar de intentar obtener el objeto desde el cache.&lt;br /&gt;
&lt;br /&gt;
===Query Cache===&lt;br /&gt;
Para mejorar la performance y rendimiento de las aplicaciones podemos utilizar Query Cache.&lt;br /&gt;
&lt;br /&gt;
Si lo que interesa es &amp;quot;cachear&amp;quot; el resultado exacto de una consulta, no objetos individuales. Por ejemplo, si tenemos un método en un DAO que retorna la lista de Paises registrados en la base de datos, es muy probable que siempre retorne el mismo resultado ya que esa tabla no cambia a menudo, entonces es recomendable establecer la consulta como &amp;quot;cacheable&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Hay que tener en cuenta que el query cache solo almacena los identificadores de los objetos del resultado, es decir que lo debemos usar combinado con el Cache de Segundo Nivel.&lt;br /&gt;
Los pasos serían:&lt;br /&gt;
&lt;br /&gt;
#Establecer el property hibernate.cache.use_query_cache=true en el hibernate.cfg.xml&lt;br /&gt;
#Configurar la entidad Pais como &amp;quot;cacheable&amp;quot;&lt;br /&gt;
#Establecer la consulta como &amp;quot;cacheable&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
  List paises = sess.createQuery(&amp;quot;from Pais&amp;quot;)&lt;br /&gt;
                              .setCacheable(true)&lt;br /&gt;
                              .list();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por lo tanto, la primera vez que se ejecuta la consulta, se retorna la lista de Paises desde la tabla mediante un select, pero a partir de ese momento toda vez que se repita el query, el resultado va a ser retornado desde el cache, evitando la comunicación con la base de datos.&lt;br /&gt;
&lt;br /&gt;
====¿Que pasa si agrego un nuevo Pais?====&lt;br /&gt;
Entonces el query dejaría de ser válido, solo si agregamos un nuevo Pais pasando por la session de Hibernate, el query se invalida automáticamente para que la próxima vez que se ejecute la consulta vuelva a obtener el resultado desde la base de datos.&lt;br /&gt;
Es importante aclarar que el comportamiento anterior no se cumple si se inserta un Pais por afuera del aplicativo, es decir con un insert directo a la tabla, o si se tiene dos aplicativos separados que apuntan a la misma base de datos, en ese caso habría que usar JNDI para que todos compartan la misma SessionFactory.&lt;br /&gt;
&lt;br /&gt;
Es recomendable usar el query cache solo en los casos en que una consulta se repite constantemente y la entidad resultado no cambia frecuentemente, por ejemplo: Países, Provincias, etc.&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [[Hibernate]]&lt;br /&gt;
* [[Hibernate Con Spring]]&lt;br /&gt;
* [http://www.hibernate.org/ Web oficial de Hibernate]&lt;br /&gt;
* [http://www.hibernate.org/hib_docs/v3/reference/en/html/tutorial.html#tutorial-firstapp Tutorial de Hibernate]&lt;/div&gt;</summary>
		<author><name>Fguerra</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Cache_De_Hibernate&amp;diff=6275</id>
		<title>Cache De Hibernate</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Cache_De_Hibernate&amp;diff=6275"/>
				<updated>2011-09-07T12:48:10Z</updated>
		
		<summary type="html">&lt;p&gt;Fguerra: Deshecha la edición 5881 de 89.135.83.116 (disc.)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Hibernate]]&lt;br /&gt;
Uso y configuración de la funcionalidad de cache en Hibernate.&lt;br /&gt;
&lt;br /&gt;
Generalmente todos los cache se basan en almacenar objetos en memoria para acelerar accesos posteriores, pero debemos aclarar que en Hibernate hay dos tipos de cache: el Primer Nivel y el Segundo Nivel.&lt;br /&gt;
&lt;br /&gt;
Whoa, things just got a whole lot esaier.&lt;br /&gt;
&lt;br /&gt;
===Cache de Segundo Nivel===&lt;br /&gt;
El Cache de Segundo Nivel permite ir varios pasos mas adelante en la mejora de la performance. La diferencia fundamental es que éste tipo de cache es válido para todas las transacciones y puede persistir en memoria durante todo el tiempo en que el aplicativo esté online, lo podríamos considerar como un cache global.&lt;br /&gt;
&lt;br /&gt;
Para habilitar el Cache de Segundo Nivel hay que realizar lo siguiente:&lt;br /&gt;
#Seleccionar un Proveedor de Cache. Por ejemplo [[EhCache]].&lt;br /&gt;
#Agregar en el hibernate.cfg.xml los siguientes properties:&lt;br /&gt;
  &amp;lt;property name=&amp;quot;hibernate.cache.provider_class&amp;quot;&amp;gt;org.hibernate.cache.EhCacheProvider&amp;lt;/property&amp;gt;&lt;br /&gt;
  &amp;lt;property name=&amp;quot;hibernate.cache.use_structured_entries&amp;quot;&amp;gt;true&amp;lt;/property&amp;gt;&lt;br /&gt;
#Poner en el classpath del aplicativo el archivo de configuración ehcache.xml, según las instrucciones del proveedor.&lt;br /&gt;
#Agregar en el mapping de las clases que se queren seleccionar como &amp;quot;cacheables&amp;quot; la siguiente entrada:&lt;br /&gt;
  &amp;lt;cache usage=&amp;quot;nonstrict-read-write&amp;quot;&amp;gt;&amp;lt;/cache&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hibernate define cuatro niveles de cache que determinan el aislamiento:&lt;br /&gt;
&lt;br /&gt;
*'''transactional''': Garantiza un nivel de aislamiento hasta repeatable read. Es el nivel más estricto. Solamente se puede utilizar en clusters, es decir, con cachés distribuidas.&lt;br /&gt;
*''''read-write''': Mantiene un aislamiento hasta el nivel de commited.&lt;br /&gt;
*'''nonstrict read-write''': No ofrece garantía de consistencia entre el caché y la base de datos. Es una es'trategia ideal para almacenar datos que no cambian habitualmente y que no sean demasiado críticos.&lt;br /&gt;
*'''read-only''': Es la estrategia de concurrencia menos estricta. Recomendada para datos que nunca cambian.&lt;br /&gt;
&lt;br /&gt;
Otro tema importante es definir qué entidades se van a &amp;quot;cachear&amp;quot;, los candidatos naturales son por ejemplo las clases que representan: provincias, países, monedas o similares.&lt;br /&gt;
Hay que tener en cuenta que cuando se tienen relaciones one-to-many hacia éstas entidades, se debe configurarlas como fetch=select, no como fetch=join porque si no Hibernate va a &amp;quot;levantar&amp;quot; la relación haciendo un join en lugar de intentar obtener el objeto desde el cache.&lt;br /&gt;
&lt;br /&gt;
===Query Cache===&lt;br /&gt;
Para mejorar la performance y rendimiento de las aplicaciones podemos utilizar Query Cache.&lt;br /&gt;
&lt;br /&gt;
Si lo que interesa es &amp;quot;cachear&amp;quot; el resultado exacto de una consulta, no objetos individuales. Por ejemplo, si tenemos un método en un DAO que retorna la lista de Paises registrados en la base de datos, es muy probable que siempre retorne el mismo resultado ya que esa tabla no cambia a menudo, entonces es recomendable establecer la consulta como &amp;quot;cacheable&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Hay que tener en cuenta que el query cache solo almacena los identificadores de los objetos del resultado, es decir que lo debemos usar combinado con el Cache de Segundo Nivel.&lt;br /&gt;
Los pasos serían:&lt;br /&gt;
&lt;br /&gt;
#Establecer el property hibernate.cache.use_query_cache=true en el hibernate.cfg.xml&lt;br /&gt;
#Configurar la entidad Pais como &amp;quot;cacheable&amp;quot;&lt;br /&gt;
#Establecer la consulta como &amp;quot;cacheable&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
  List paises = sess.createQuery(&amp;quot;from Pais&amp;quot;)&lt;br /&gt;
                              .setCacheable(true)&lt;br /&gt;
                              .list();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por lo tanto, la primera vez que se ejecuta la consulta, se retorna la lista de Paises desde la tabla mediante un select, pero a partir de ese momento toda vez que se repita el query, el resultado va a ser retornado desde el cache, evitando la comunicación con la base de datos.&lt;br /&gt;
&lt;br /&gt;
====¿Que pasa si agrego un nuevo Pais?====&lt;br /&gt;
Entonces el query dejaría de ser válido, solo si agregamos un nuevo Pais pasando por la session de Hibernate, el query se invalida automáticamente para que la próxima vez que se ejecute la consulta vuelva a obtener el resultado desde la base de datos.&lt;br /&gt;
Es importante aclarar que el comportamiento anterior no se cumple si se inserta un Pais por afuera del aplicativo, es decir con un insert directo a la tabla, o si se tiene dos aplicativos separados que apuntan a la misma base de datos, en ese caso habría que usar JNDI para que todos compartan la misma SessionFactory.&lt;br /&gt;
&lt;br /&gt;
Es recomendable usar el query cache solo en los casos en que una consulta se repite constantemente y la entidad resultado no cambia frecuentemente, por ejemplo: Países, Provincias, etc.&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [[Hibernate]]&lt;br /&gt;
* [[Hibernate Con Spring]]&lt;br /&gt;
* [http://www.hibernate.org/ Web oficial de Hibernate]&lt;br /&gt;
* [http://www.hibernate.org/hib_docs/v3/reference/en/html/tutorial.html#tutorial-firstapp Tutorial de Hibernate]&lt;/div&gt;</summary>
		<author><name>Fguerra</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Actualizacion_Dinamica_Con_Hibernate&amp;diff=6274</id>
		<title>Actualizacion Dinamica Con Hibernate</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Actualizacion_Dinamica_Con_Hibernate&amp;diff=6274"/>
				<updated>2011-09-07T12:47:09Z</updated>
		
		<summary type="html">&lt;p&gt;Fguerra: Deshecha la edición 6262 de 203.229.219.153 (disc.)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Hibernate]]&lt;br /&gt;
[[Hibernate]], al iniciar, lee el archivo de configuracion ''hibernate.cfg.xml''. De manera predeterminada se generan y se levantan a memoria todas las sentencias de select, insert, update, delete de cada clase.&lt;br /&gt;
&lt;br /&gt;
Estas sentencias son las básicas por ID.&lt;br /&gt;
&lt;br /&gt;
Con respecto a los UPDATE esto presenta el inconveniente que ante un update de un solo campo del objeto, hibernate me genera el update de todos los campos del objeto.&lt;br /&gt;
&lt;br /&gt;
Para las bases de datos esto es poco beneficioso ya que estamos generando mas undo (guardar en el rollback el valor anterior de los campos) del necesario.&lt;br /&gt;
&lt;br /&gt;
Y pensemos lo malo que puede ser este comportamiento si ademas por el update de alguno de los campos, en la base de datos se dispara un trigger, independientemente si el valor es distinto o no.&lt;br /&gt;
&lt;br /&gt;
Estaríamos generando no solo undo innecesariamente, sino que tambien estaríamos aumentando el procesamiento.&lt;br /&gt;
&lt;br /&gt;
Para evitar esto Hibernate permite configurar la clase como '''dynamic-update'''&lt;br /&gt;
&lt;br /&gt;
===Dynamic-Update en archivo XML===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code xml&amp;gt;&lt;br /&gt;
 &amp;lt;class name=&amp;quot;Message&amp;quot; table=&amp;quot;MESSAGES&amp;quot; dynamic-update=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
 &amp;lt;/class&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Dynamic-Update con anotaciones===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
 @Entity&lt;br /&gt;
 @org.hibernate.annotations.Entity(dynamicUpdate = true)&lt;br /&gt;
 @Table(name=&amp;quot;MESSAGES&amp;quot;)&lt;br /&gt;
 @SequenceGenerator(name=&amp;quot;seq&amp;quot;, sequenceName = &amp;quot;MESSAGES_SEQ&amp;quot;, allocationSize=1)&lt;br /&gt;
 public class Message {&lt;br /&gt;
   ...&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En estas anotaciones vemos que además de usar las anotaciones estandar de JPA, estamos usando extensiones propias de Hibernate. Es el caso de la annotation Entity.&lt;br /&gt;
&lt;br /&gt;
Utilizar la Entity de Hibernate no nos libra de tener que utilizar la anotación estandar Entity, ya que cada tiene funcionalidad diferente. La de Hibernate no incluye el significado de la estandar, solo la extiende.&lt;br /&gt;
&lt;br /&gt;
Las annotations standard estan en la libreria ''ejb3-persistence.jar'' y para usarlas debemos importar el package ''javax.persistence.*''&lt;br /&gt;
&lt;br /&gt;
Para el caso de las anotaciones propias de Hibernate se recomienda no importar el package y escribirlas completas para diferenciarlas de las estandar.&lt;br /&gt;
&lt;br /&gt;
==Ver también==&lt;br /&gt;
* [[Hibernate]]&lt;/div&gt;</summary>
		<author><name>Fguerra</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Cache_De_Hibernate&amp;diff=6273</id>
		<title>Cache De Hibernate</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Cache_De_Hibernate&amp;diff=6273"/>
				<updated>2011-09-07T12:43:27Z</updated>
		
		<summary type="html">&lt;p&gt;Fguerra: Deshecha la edición 6263 de 58.64.172.138 (disc.)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Hibernate]]&lt;br /&gt;
Uso y configuración de la funcionalidad de cache en Hibernate.&lt;br /&gt;
&lt;br /&gt;
Generalmente todos los cache se basan en almacenar objetos en memoria para acelerar accesos posteriores, pero debemos aclarar que en Hibernate hay dos tipos de cache: el Primer Nivel y el Segundo Nivel.&lt;br /&gt;
&lt;br /&gt;
Whoa, things just got a whole lot esaier.&lt;br /&gt;
&lt;br /&gt;
God help me, I put aside a whole afternoon to fgirue this out.&lt;br /&gt;
&lt;br /&gt;
===Query Cache===&lt;br /&gt;
Para mejorar la performance y rendimiento de las aplicaciones podemos utilizar Query Cache.&lt;br /&gt;
&lt;br /&gt;
Si lo que interesa es &amp;quot;cachear&amp;quot; el resultado exacto de una consulta, no objetos individuales. Por ejemplo, si tenemos un método en un DAO que retorna la lista de Paises registrados en la base de datos, es muy probable que siempre retorne el mismo resultado ya que esa tabla no cambia a menudo, entonces es recomendable establecer la consulta como &amp;quot;cacheable&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Hay que tener en cuenta que el query cache solo almacena los identificadores de los objetos del resultado, es decir que lo debemos usar combinado con el Cache de Segundo Nivel.&lt;br /&gt;
Los pasos serían:&lt;br /&gt;
&lt;br /&gt;
#Establecer el property hibernate.cache.use_query_cache=true en el hibernate.cfg.xml&lt;br /&gt;
#Configurar la entidad Pais como &amp;quot;cacheable&amp;quot;&lt;br /&gt;
#Establecer la consulta como &amp;quot;cacheable&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
  List paises = sess.createQuery(&amp;quot;from Pais&amp;quot;)&lt;br /&gt;
                              .setCacheable(true)&lt;br /&gt;
                              .list();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por lo tanto, la primera vez que se ejecuta la consulta, se retorna la lista de Paises desde la tabla mediante un select, pero a partir de ese momento toda vez que se repita el query, el resultado va a ser retornado desde el cache, evitando la comunicación con la base de datos.&lt;br /&gt;
&lt;br /&gt;
====¿Que pasa si agrego un nuevo Pais?====&lt;br /&gt;
Entonces el query dejaría de ser válido, solo si agregamos un nuevo Pais pasando por la session de Hibernate, el query se invalida automáticamente para que la próxima vez que se ejecute la consulta vuelva a obtener el resultado desde la base de datos.&lt;br /&gt;
Es importante aclarar que el comportamiento anterior no se cumple si se inserta un Pais por afuera del aplicativo, es decir con un insert directo a la tabla, o si se tiene dos aplicativos separados que apuntan a la misma base de datos, en ese caso habría que usar JNDI para que todos compartan la misma SessionFactory.&lt;br /&gt;
&lt;br /&gt;
Es recomendable usar el query cache solo en los casos en que una consulta se repite constantemente y la entidad resultado no cambia frecuentemente, por ejemplo: Países, Provincias, etc.&lt;br /&gt;
&lt;br /&gt;
== Ver también ==&lt;br /&gt;
* [[Hibernate]]&lt;br /&gt;
* [[Hibernate Con Spring]]&lt;br /&gt;
* [http://www.hibernate.org/ Web oficial de Hibernate]&lt;br /&gt;
* [http://www.hibernate.org/hib_docs/v3/reference/en/html/tutorial.html#tutorial-firstapp Tutorial de Hibernate]&lt;/div&gt;</summary>
		<author><name>Fguerra</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Archivo:Imagen_5.jpg&amp;diff=5745</id>
		<title>Archivo:Imagen 5.jpg</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Archivo:Imagen_5.jpg&amp;diff=5745"/>
				<updated>2011-04-28T14:29:53Z</updated>
		
		<summary type="html">&lt;p&gt;Fguerra: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Fguerra</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Archivo:Imagen_4.jpg&amp;diff=5744</id>
		<title>Archivo:Imagen 4.jpg</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Archivo:Imagen_4.jpg&amp;diff=5744"/>
				<updated>2011-04-28T14:29:25Z</updated>
		
		<summary type="html">&lt;p&gt;Fguerra: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Fguerra</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Archivo:Imagen_3.jpg&amp;diff=5743</id>
		<title>Archivo:Imagen 3.jpg</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Archivo:Imagen_3.jpg&amp;diff=5743"/>
				<updated>2011-04-28T14:29:10Z</updated>
		
		<summary type="html">&lt;p&gt;Fguerra: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Fguerra</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Archivo:Imagen_2.jpg&amp;diff=5742</id>
		<title>Archivo:Imagen 2.jpg</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Archivo:Imagen_2.jpg&amp;diff=5742"/>
				<updated>2011-04-28T14:27:58Z</updated>
		
		<summary type="html">&lt;p&gt;Fguerra: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Fguerra</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Archivo:Imagen_1.jpg&amp;diff=5741</id>
		<title>Archivo:Imagen 1.jpg</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Archivo:Imagen_1.jpg&amp;diff=5741"/>
				<updated>2011-04-28T14:27:16Z</updated>
		
		<summary type="html">&lt;p&gt;Fguerra: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Fguerra</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=BEA_Aqualogic_BPM_5.7_(Fuego)&amp;diff=5740</id>
		<title>BEA Aqualogic BPM 5.7 (Fuego)</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=BEA_Aqualogic_BPM_5.7_(Fuego)&amp;diff=5740"/>
				<updated>2011-04-28T14:25:17Z</updated>
		
		<summary type="html">&lt;p&gt;Fguerra: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Comunicando con Base de Datos con PBL (Process Business Language)===&lt;br /&gt;
&lt;br /&gt;
Para ejecutar comandos SQL en Aqualogic BPM 5.7 hay que seguir los siguientes pasos: &lt;br /&gt;
&lt;br /&gt;
====Primer paso====&lt;br /&gt;
&lt;br /&gt;
Se debe crear nuevo &amp;quot;External Resource&amp;quot;, haciendo click derecho en el directorio del proyecto &amp;quot;External Resources&amp;quot;, del tipo &amp;quot;SQL Database&amp;quot;. Los campos se deben completar con la información de la base de datos que queremos consultar y con un nombre significativo.&lt;br /&gt;
&lt;br /&gt;
====Segundo paso====&lt;br /&gt;
 &lt;br /&gt;
Se debe crear un nuevo &amp;quot;BPM Object&amp;quot;, haciendo click derecho sobre el modulo deseado en el directorio de &amp;quot;Catalog&amp;quot;, y luego crear un método en nuestro objeto, haciendo click derecho sobre el objeto y seleccionando la opción &amp;quot;New Method&amp;quot;. Ahora se debe editar el nuevo método, expandiendo el objeto bpm y haciendo doble click sobre el nombre del método creado. Ahora podemos editarlo e incluir el código necesario para comunicarnos con la BD a través de una clase propia de Fuego, un ejemplo de implementación puede ser el siguiente: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
String queryAEjecutar =&amp;quot;SELECT campo1, campo2, campo3 FROM nombreTabla WHERE nombreColumna in (?,?)&amp;quot;; &lt;br /&gt;
&lt;br /&gt;
String nombreDeLaBDCreada = &amp;quot;NombreBD&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
String[] arrayDeParametros = {&amp;quot;valor1&amp;quot;, &amp;quot;valor2&amp;quot;};&lt;br /&gt;
&lt;br /&gt;
Iterator &amp;lt;Any[Any]&amp;gt; iterator = DynamicSQL.executeQuery(sentence : queryAEjecutar, implname : nombreDeLaBDCreada, inParameters : arrayDeParametros);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como se puede observar, el resultado de realizar la consulta va a ser un iterador, que luego puede ser recorrido con un &amp;quot;foreach&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;&lt;br /&gt;
foreach (e in iterator) {&lt;br /&gt;
&lt;br /&gt;
   logMessage(&amp;quot;campo1: &amp;quot;+e[&amp;quot;campo1&amp;quot;], severity : INFO);&lt;br /&gt;
&lt;br /&gt;
   logMessage(&amp;quot;campo2: &amp;quot;+e[&amp;quot;campo2&amp;quot;], severity : INFO);&lt;br /&gt;
&lt;br /&gt;
   logMessage(&amp;quot;campo3: &amp;quot;+e[&amp;quot;campo3&amp;quot;], severity : INFO);&lt;br /&gt;
&lt;br /&gt;
   logMessage(&amp;quot;nombreColumna: &amp;quot;+e[&amp;quot;nombreColumna&amp;quot;], severity : INFO);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Versionando con CVS ===&lt;br /&gt;
El producto Aqualogic BPM 5.7 incluye un cliente de CVS que permite agregar, remover, actualizar en un repositorio CVS.&lt;br /&gt;
&lt;br /&gt;
==== Configurar el cliente CVS ====&lt;br /&gt;
* Levantar el Studio BPM.&lt;br /&gt;
* File -&amp;gt; Preference -&amp;gt;Default Version Control&lt;br /&gt;
** Version Control Manger: CVS&lt;br /&gt;
** Host: host del servidor CVS&lt;br /&gt;
** User Name: usuario del CVS&lt;br /&gt;
** User Password: password del usuario CVS&lt;br /&gt;
** path: ruta dentro del repositorio donde se guardará el proyecto.&lt;br /&gt;
&lt;br /&gt;
==== Subir el proyecto al CVS ====&lt;br /&gt;
* Levantar el Studio BPM.&lt;br /&gt;
* Abrir el proyecto a versionar.&lt;br /&gt;
* File -&amp;gt; Project Preference -&amp;gt; Project Version Control.&lt;br /&gt;
** Version Control Manager: CVS (nos carga la información ingresada en el punto anterior).&lt;br /&gt;
* File -&amp;gt; VCS -&amp;gt; Store project in repository&lt;br /&gt;
** Path: directorio en el que se creará el proyecto en el repositorio.&lt;br /&gt;
** Si es la primera vez que se sube un proyecto de Aqualogic BPM, pedirá que se ingrese la ruta del directorio donde se creará el &amp;quot;common catalog&amp;quot;&lt;br /&gt;
*** Common catalog: Es un catalogo de componente, el cual puede ser compartido por otros proyectos de Aqualogic BPM.&lt;br /&gt;
En el repositorio quedarán creados 2 directorios, el del proyecto y el del common catalog, ademas se crearán 2 alias en el CVS que apuntan al proyecto y al common catalog.&lt;br /&gt;
&lt;br /&gt;
==== Obtener el proyecto del CVS ====&lt;br /&gt;
* Levantar el Studio BPM.&lt;br /&gt;
* File -&amp;gt; Project Preference -&amp;gt; Project Version Control.&lt;br /&gt;
* File -&amp;gt; Import -&amp;gt; Project -&amp;gt; from Repository.&lt;br /&gt;
** Version Control Manager: CVS&lt;br /&gt;
** En la siguiente pantalla, seleccionar el proyecto del repositorio.&lt;br /&gt;
&lt;br /&gt;
==== Trabajar con proyectos versionados ====&lt;br /&gt;
Aqualogic BPM 5.7, posee una política restrictiva de edición para los proyecto versionados.&lt;br /&gt;
La política, consiste en que todo el proyecto se encuentra en modo lectura y solo un usuario puede editar un determinado archivo versionado (Ej.: un proceso).&lt;br /&gt;
===== Editar un procesos =====&lt;br /&gt;
* Seleccionar el proceso a editar.&lt;br /&gt;
* Menú contextual -&amp;gt; VCS -&amp;gt; edit.&lt;br /&gt;
Esto habilita al usuario a modificar el proceso. En caso de que exitiera otro usuario modificando el proceso nos aparecerá un mensaje de error.&lt;br /&gt;
&lt;br /&gt;
===== Grabar los cambios realizados en un proceso =====&lt;br /&gt;
* Seleccionar el proceso que se esta editando.&lt;br /&gt;
* Menú contextual -&amp;gt; VCS -&amp;gt; commit.&lt;br /&gt;
Este paso es importante, debido a que si se libera la edición del proceso sin realizar el commit se perderán los cambios.&lt;br /&gt;
&lt;br /&gt;
===== Liberar la edición del proceso =====&lt;br /&gt;
* Seleccionar el proceso que se esta editando.&lt;br /&gt;
* Menú contextual -&amp;gt; VCS -&amp;gt; unedit.&lt;br /&gt;
&lt;br /&gt;
===Pasaje de Parametros===&lt;br /&gt;
&lt;br /&gt;
Para pasar parámetros al proceso desde una actividad de creación (aquellas que dan inicio al proceso) que tenga asociada un ScreenFlow, hay que seguir los siguientes pasos.&lt;br /&gt;
&lt;br /&gt;
El primer paso es decirle al proceso que va a recibir parametros de la siguiente manera:&lt;br /&gt;
&lt;br /&gt;
* Doble click en la tarea &amp;quot;begin&amp;quot; y luego en &amp;quot;Argument Mapping&amp;quot;&lt;br /&gt;
[[Archivo:Imagen 1.jpg]]&lt;br /&gt;
* Click en el botón que parece una flecha violeta hacia abajo y ahí agregamos el nombre del parametro que va a recibir. Es recomendable utilizar nombres descriptivos ya que sino se puede volver bastante confuso.&lt;br /&gt;
[[Archivo:Imagen 2.jpg]]&lt;br /&gt;
* Ahora lo único que falta es mapear el parámetro a una variable del proceso (puede ser creada en la misma pantalla haciendo click sobre el botón que está al lado del de crear parametros)&lt;br /&gt;
[[Archivo:Imagen 3.jpg]]&lt;br /&gt;
&lt;br /&gt;
El segundo paso es realizar un proceso similar al primer paso, con la diferencia que debe hacerce en la tarea &amp;quot;end&amp;quot; del ScreenFlow asociado a la actividad de creación.&lt;br /&gt;
&lt;br /&gt;
El tercer paso es mapear las salidas del ScreenFlow con las Entradas del proceso de la siguiente manera:&lt;br /&gt;
&lt;br /&gt;
* Doble click en la actividad que tiene asociada el ScreenFlow, luego en &amp;quot;Argument Mapping&amp;quot; y luego en la barra de la izquiera seleccionar &amp;quot;NombreDelScreenFlow Out&amp;quot;&lt;br /&gt;
[[Archivo:Imagen 4.jpg]]&lt;br /&gt;
* Luego solo basta con mapear los argumentos, seleccionando los nombres&lt;br /&gt;
[[Archivo:Imagen 5.jpg]]&lt;br /&gt;
&lt;br /&gt;
===Incluir un jar y utilizarlo===&lt;br /&gt;
Una vez que tenemos creado nuestro proyecto BPM podemos llegar a necesitar utilizar ciertas clases de java, tanto para modelar entidades como para invocar servicios externos a nuestro proyecto.&lt;br /&gt;
&lt;br /&gt;
En el caso que necesitemos incluír alguna librería al proyecto BPM los pasos a realizar son los siguientes:&lt;br /&gt;
&lt;br /&gt;
* En &amp;quot;Recursos externos&amp;quot; hacer botón derecho y seleccionar la opción &amp;quot;Nuevo recurso externo&amp;quot;.&lt;br /&gt;
* Seleccionar un nombre y en tipo seleccionar &amp;quot;Biblioteca de clase Java&amp;quot;. &lt;br /&gt;
* Le damos clic al botón &amp;quot;Agregar&amp;quot; y buscamos el jar correspondiente que vamos a querer incluír.&lt;br /&gt;
* Aceptar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finalizado estos pasos vamos a ver que se agregó a &amp;quot;Recursos externos&amp;quot; la librería que acabamos de incluir. Lo siguiente va a ser crear un módulo desde el cual invocar a las clases de nuestro jar. Para esto tenemos que hacer lo siguiente:&lt;br /&gt;
&lt;br /&gt;
* En &amp;quot;Catálogo&amp;quot; hacemos botón derecho y seleccionamos la opción &amp;quot;Crear módulo&amp;quot;.&lt;br /&gt;
* Le ponemos un nombre y le damos Aceptar.&lt;br /&gt;
* Realizado esto, veremos que se agregó un módulo al Catálogo. Lo que tenemos que hacer ahora es indicarle a ese módulo que contenga la configuración de nuestro jar. Para esto hacemos clic derecho sobre el módulo &amp;gt; Componente de catálogo &amp;gt; Java.&lt;br /&gt;
* Seleccionamos la opción &amp;quot;Usar una configuración existente&amp;quot; (está marcada por defecto) y en el combo seleccionamos nuestro recurso externo que agregamos antes. &lt;br /&gt;
* Luego, seleccionaremos las clases Java que quiero incluír en mi módulo.&lt;br /&gt;
* Se hará la carga de clases automáticamente.&lt;br /&gt;
* Finalizado esto deberíamos ver dentro de &amp;quot;Catálogo&amp;quot; nuestro módulo nuevo y al amplicar su contenido ver el árbol de las clases que incluímos en él.&lt;br /&gt;
&lt;br /&gt;
Para poder usar estas clases que incluímos, dentro de una actividad se podrán crear instancias de esta forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;ClaseDeMiBiblioteca instancia = new ClaseDeMiBiblioteca();&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e invocar a sus métodos de esta forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code java&amp;gt;ObjetoRespuesta respuesta = (ObjetoRespuesta) instancia.metodo(arg1 : parametroAEnviar);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Tratamiento de excepciones de servicios externos===&lt;br /&gt;
Puede suceder que, al momento de invocar algún servicio externo a nuestro proyecto de BPM, este retorne como respuesta una excepción. Para poder darle un comportamiento a nuestro proceso en BPM se puede utilizar una transición del tipo &amp;quot;Excepción&amp;quot; entre dos actividades.&lt;br /&gt;
&lt;br /&gt;
Para dar un ejemplo concreto vamos a imaginarnos 2 actividades a las que llamaremos &amp;quot;Inicio&amp;quot; y &amp;quot;Comportamiento correcto&amp;quot;. La actividad &amp;quot;Inicio&amp;quot; invocará a un servicio, y si sale todo bien, se pasará luego a la actividad &amp;quot;Comportamiento correcto&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
[[Archivo:1.jpg]]&lt;br /&gt;
&lt;br /&gt;
Ahora, puede suceder que cuando &amp;quot;Inicio&amp;quot; invoca al servicio, éste devuelva una Excepción. ¿Qué hacemos en ese caso? Creamos una actividad (en nuestro ejemplo es &amp;quot;Comportamiento excepción&amp;quot;), la cual nuestro sistema ejecutará en caso de que el servicio falle, y le asociamos una transición entre &amp;quot;Inicio&amp;quot; y esta nueva actividad de esta forma:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Para crear dicha transición, debemos crear la actividad a la cual asociarla, dale doble clic y luego seleccionar como tipo de transición aquella que dice &amp;quot;Excepción&amp;quot;. Para indicarle para qué tipo de Excepción queremos que se siga dicho flujo, en &amp;quot;Nombre de excepción&amp;quot; deberemos cargar la clase con la excepción que puede llegar.&lt;br /&gt;
&lt;br /&gt;
=== Ver también  ===&lt;br /&gt;
* [[Oracle BPM]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Oracle]]&lt;/div&gt;</summary>
		<author><name>Fguerra</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Archivo:2.jpg&amp;diff=5739</id>
		<title>Archivo:2.jpg</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Archivo:2.jpg&amp;diff=5739"/>
				<updated>2011-04-28T14:22:09Z</updated>
		
		<summary type="html">&lt;p&gt;Fguerra: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Fguerra</name></author>	</entry>

	<entry>
		<id>https://dosideas.com/wiki/index.php?title=Archivo:1.jpg&amp;diff=5738</id>
		<title>Archivo:1.jpg</title>
		<link rel="alternate" type="text/html" href="https://dosideas.com/wiki/index.php?title=Archivo:1.jpg&amp;diff=5738"/>
				<updated>2011-04-28T14:21:31Z</updated>
		
		<summary type="html">&lt;p&gt;Fguerra: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Fguerra</name></author>	</entry>

	</feed>