Hugo: Buenas noches (mira hacia los costados, vergüenza). Gracias (al que le dio el micrófono). (Mirando al público). Les robo un segundito de su tiempo (baja la cabeza, mira hacia adelante). Se que todos se quieren ir a bailar, por eso voy a ser breve. Carla y Alejandra son mis dos hermanas chicas (tierno). Siempre las quise y las cuidé, sino pregúntenles. (Silencio). Bueno, y estoy muy orgulloso de ellas. Quiero que sepan que para mi son todo (
), todo, y que las quiero muchísimo, aunque nunca lo diga… ni lo voy a hacer. Leer el resto de esta entrada »
Archivos para Marzo, 2008
Guión fiesta 15 – 17 de mis hermanas
iPod sin iTunes
Con la última versión de Winamp, no es necesario tener iTunes para usar iPod! Además, se pueden cargar y bajar archivos desde cualquier computadora, y usar como biblioteca una mezcla de todos los archivos que pongamos de cualquier lado. Y, además, Winamp no pesa nada, mientras que iTunes es un verdadero elefante que aplasta nuestro procesador y nuestra memoria.
Winamp :)
La razón no existe
La razón no existe. Son puras excusas para justificar lo que sentimos. Independientemente de que lo que digamos sea cierto o no. Muchas veces estamos angustiados porque no encontramos la justificación de algo… y de repente, ¡ahí aparece! Logramos engranar dos o tres pensamientos y ya tenemos una explicación. Ya estamos aliviados, ya podemos dormir tranquilos.
Ant

En este tutorial está lo básico para ejecutar ANT desde eclipse; hay que hacer un archivo build.xml en donde uno quiera (el root del proyecto), poner una acción a realizar por default (se ejecutará esta y todas sus dependendicas… la acción que no esté linkeada no se ejecutará). Este es el código de ejemplo:
build.xml
<project name=”AntExample” default=”jar” basedir=”.”>
<!– El default es la operación por default, y la única
que se ejecuta si no le pasan parámetros –>
<!– Define propiedades (variables) –>
<property name=”src” value=”.”/>
<property name=”build” value=”bin”/>
<property name=”deploy” value=”deploy”/>
<!– Hace un directorio –>
<target name=”init”>
<mkdir dir=”${build}”/>
<mkdir dir=”${deploy}”/>
</target>
<!– Compila el código java a ese directorio
(¿por qué el depends? porque hay que hacer
el otro primero) –>
<target name=”compile” depends=”init”>
<!– Compile the java code –>
<javac srcdir=”${src}” destdir=”${build}”/>
</target>
<!– Peeeeero no lo exporta en un .jar, hasta acá –>
<target name=”jar” depends=”compile”
description=”create a Jar file for the application”>
<jar destfile=”${deploy}/hello.jar”>
<fileset dir=”${build}” includes=”**/*.class”/>
<manifest>
<attribute name=”Main-Class” value=”HelloProgram”/>
</manifest>
</jar>
</target>
</project>
Ant tiene bastantes mas funciones, de hecho, cuando tenemos un proyecto con dependencias, que necesite jars para funcionar u otro proyecto con el cual esté conectado, deberemos incluír esto:
<!– Used to include all the libs in a directory –>
<patternset id=”java.libs” includes=”**/*.jar,**/*.zip” />
<!– The libs compiled in the deploy folder at the time the method is called –>
<path id=”compiledLibs” >
<fileset dir=”${deploy}/${libraries}” >
<patternset refid=”java.libs” />
</fileset>
<fileset dir=”${deploy}/”>
<patternset refid=”java.libs” />
</fileset>
</path>
Y cuando compilamos, lo añadimos de esta forma:
<javac classpathref=”compiledLibs” mce_href=”compiledLibs” destdir=”${build}/banelco”>
<src path=”${banelcoGeneralHome}/src/test/java”/>
<src path=”${banelcoGeneralHome}/src/main/java”/>
</javac>
Problemas comunes: cuando tenemos proyectos con dependencias, una solución simple es hacer una carpeta deploy, meter ahí todas las librerías,
compilar allí el proyecto que no tiene dependencias de proyecto como un .jar, y después compilar
el proyecto que si tiene dependencias, que dependa de todos los .jar de ese directorio (entonces,
como el otro proyecto ya está compilado como un .jar, también tendrá sus clases )
Spring: Property Place Holder

Viendo que hay muy poca info sobre Spring en castellano (y menos sobre temas específicos), me dedicaré a escribir sobre ello.
Si uno no quiere modificar directamente los archivos XML, ya que para operadores esto quizás no sea lo mejor, y prefiere cambiar las propiedades principalse en un archivo .properties, esta es la forma de incluír esos .properties en Spring y llamar a los valores de sus variables:
gateway.properties
ioacceptor.port = 1235
applicationContext.xml
<!DOCTYPE beans PUBLIC “-//SPRING//DTD BEAN//EN” “http://www.springframework.org/dtd/spring-beans.dtd”>
<beans>
<!– Property Place Holder Configuration –>
<bean class=”org.springframework.beans.factory.config.PropertyPlaceholderConfigurer”>
<property name=”locations”>
<value>classpath:com/banelco/gateway/context/gateway.properties</value>
</property>
</bean>
…
<bean class=”org.apache.mina.integration.spring.Binding”>
<property name=”address” value=”:${ioacceptor.port}“/>
<property name=”handler” ref=”iso8583Handler”/>
<property name=”serviceConfig”>
<bean class=”org.apache.mina.transport.socket.nio.SocketAcceptorConfig”>
<property name=”filterChainBuilder” ref=”filterChainBuilder”/>
<property name=”reuseAddress” value=”true”/>
</bean>
</property>
</bean>
</list>
</property>
</bean>
</beans>
Importante: si se desea utilizar mas de un PropertyPlaceHolder en el contexto, se le debe añadir la propiedad <property name=”ignoreUnresolvablePlaceholders” value=”true” />, para que los holders que no pueda resolver uno no tire excepción y pueda resolverlos el otro.
Idea: se pueden extenders las clases de PlaceHolder e implementar de nuevo sus métodos, por ejemplo, el getLocation(), para hacer rutas configuradas y que sólo tengan que poner el nombre del archivo :)
Unit Testing in ActionScript 3.0!

Excelente tutorial. La onda es hacer el tutorial y guardárselo, porque este mismo tutorial puede usarse para probar todas las clases de cualquier aplicación
JBoss + Spring + MBeans 3/4
Bueno, ahora ya tenemos cómo acceder a los MBeans desde código, pero ¿cómo crearlos desde código?
Lo primero que tenemos que tener en cuenta es que las clases que queremos crear como MBeans, obligatoriamente tienen que estar en el servidor. O sea, tenemos que exportarlo como un .jar y ponerlo en la carpeta lib del servidor (así me funcionó a mi, si tenemos una aplicación web será un .war y en deploy, aunque no lo probé)
Ya tenemos eso, ahora creamos un MBean cualquiera:
Interfaz TesterMBean
package org.acriter.testJBoss;public interface TesterMBean {public String getNombre();public void setNombre(String nombre);public void init();
}
Clase Tester
package org.acriter.testJBoss;public class Tester implements TesterMBean{public void init() {// TODO Auto-generated method stub}
private String nombre;
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre=nombre;
}
}
JMXProBrowser
package org.acriter.testJBoss;import javax.management.MBeanInfo;import javax.management.MBeanOperationInfo;import javax.management.MBeanParameterInfo;import javax.management.ObjectName;
import javax.naming.InitialContext;
import org.jboss.jmx.adaptor.rmi.RMIAdaptor;
/**
* Esta clase puede conectarse con JBOSS!!
* Y llamar a sus MBeans...
* Queda para la historia.
* @author hmassaroli
*
*/
public class JMXProBrowser
{
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws Exception
{
//ponemos las propiedades (?)
System.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
System.setProperty("java.naming.provider.url", "localhost:1099");
InitialContext ic = new InitialContext();
RMIAdaptor server = (RMIAdaptor) ic.lookup("jmx/invoker/RMIAdaptor");
//Intentaremos crear un MBean
ObjectName name2 = new ObjectName("jboss:service=BeanLoco");
//server.createMBean("java.lang.String", name2); //Esta clase si la toma
server.createMBean("org.acriter.testJBoss.Tester", name2);
//Esta no
// Get the MBeanInfo for the JNDIView MBean
ObjectName name = new ObjectName("jboss:service=JNDIView");
MBeanInfo info = server.getMBeanInfo(name);
System.out.println("JNDIView Class: " + info.getClassName());
MBeanOperationInfo[] opInfo = info.getOperations();
System.out.println("JNDIView Operations: ");
for(int o = 0; o < opInfo.length; o ++) {
MBeanOperationInfo op = opInfo[o];
String returnType = op.getReturnType();
String opName = op.getName();
System.out.print(" + " + returnType + " " + opName + "(");
MBeanParameterInfo[] params = op.getSignature();
for(int p = 0; p < params.length; p++) {
MBeanParameterInfo paramInfo = params[p];
String pname = paramInfo.getName();
String type = paramInfo.getType();
if (pname.equals(type)) {
System.out.print(type);
} else {
System.out.print(type + " " + name);
}
if (p < params.length-1) {
System.out.print(',');
}
}
System.out.println(")");
}
// Invoke the list(boolean) op
String[] sig = {"boolean"};
Object[] opArgs = {Boolean.TRUE};
Object result = server.invoke(name, "list", opArgs, sig);
System.out.println("JNDIView.list(true) output:n"+result);
}
}
JBoss + Spring + MBeans 2/4
Bueno, ahora veremos cómo obtener info de un MBean existente en el servidor mediante código. La conexión del servidor es lo que se me complicó mucho, todavía no me explico demasiado cómo funciona. Éste es el código:
org.acriter.testJBoss.JMXBrowser:
package org.acriter.testJBoss;import javax.management.MBeanInfo;
import javax.management.MBeanOperationInfo;
import javax.management.MBeanParameterInfo;
import javax.management.ObjectName;
import javax.naming.InitialContext;import org.jboss.jmx.adaptor.rmi.RMIAdaptor;
/**
* Esta clase puede conectarse con JBOSS!!
* Y llamar a sus MBeans...
* Queda para la historia.
* @author hmassaroli
*
*/
public class JMXBrowser
{
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws Exception
{
//ponemos las propiedades (?)
System.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
System.setProperty("java.naming.provider.url", "localhost:1099");
InitialContext ic = new InitialContext();
RMIAdaptor server = (RMIAdaptor) ic.lookup("jmx/invoker/RMIAdaptor");
// Get the MBeanInfo for the JNDIView MBean
ObjectName name = new ObjectName("jboss:service=JNDIView");
MBeanInfo info = server.getMBeanInfo(name);
System.out.println("JNDIView Class: " + info.getClassName());
MBeanOperationInfo[] opInfo = info.getOperations();
System.out.println("JNDIView Operations: ");
for(int o = 0; o < opInfo.length; o ++) {
MBeanOperationInfo op = opInfo[o];
String returnType = op.getReturnType();
String opName = op.getName();
System.out.print(" + " + returnType + " " + opName + "(");
MBeanParameterInfo[] params = op.getSignature();
for(int p = 0; p < params.length; p++) {
MBeanParameterInfo paramInfo = params[p];
String pname = paramInfo.getName();
String type = paramInfo.getType();
if (pname.equals(type)) {
System.out.print(type);
} else {
System.out.print(type + " " + name);
}
if (p < params.length-1) {
System.out.print(',');
}
}
System.out.println(")");
}
// Invoke the list(boolean) op
String[] sig = {"boolean"};
Object[] opArgs = {Boolean.TRUE};
Object result = server.invoke(name, "list", opArgs, sig);
System.out.println("JNDIView.list(true) output:n"+result);
}
}
Spring + JBoss + MBeans: FAQ
FAQ:
java.lang.NoSuchMethodException <init>
Estás poniendo la interfase en el jboss-service.xml, no la clase. Obviamente, una interfaz no tiene constructores
ClassNotFoundException
Hay que poner en el servidor un archivo .jar (en lib, por ejemplo), con las clases, ¡JBoss no puede instanciar una clase que no tiene!
(Si, te preguntarás (y entonces por qué no lo hago como servicio en un .SAR y listo! Bueno,
capaz quieras tener todas las clases en un sólo .jar, ¡y no repartidas por ahí en muchos archivos!)
Jboss + Spring + Mbeans 1/3

Hace poco me encomendaron la desconocida tarea de registrar desde una aplicación stand alone con Spring un MBean en un servidor JBoss. Me costó mucho al principio enteder, lo primero que logré fue declarar un servicio en JBoss desde un archivo .SAR. No me acuerdo mucho del asunto, es algo así:
http://forum.springframework.org/showthread.php?t=11479
Se define una carpeta META-INF en un Proyecto Java, y adentro se le pone un jboss-service.xml, se lo exporta como .jar, y le cambiás la extensión a .SAR, y JBoss te lo toma como servicio.
Acá está el ejemplo:
META-INF/jboss-service.xml:
<?xml version="1.0" encoding="UTF-8"?>
<server>
<mbean code="com.acme.HelloWorldService" name="acme.com:service=HelloWorld">
<attribute name="Message">Hello World</attribute>
</mbean>
</server>com.acme.HelloWorldServiceMBean
com.acme.HelloWorldService
package com.acme; import org.jboss.system.ServiceMBeanSupport;public class HelloWorldService extends ServiceMBeanSupport implements HelloWorldServiceMBean
{
// Our message attribute
private String message = "Sorry no message today";// Getters and Setters
public String getMessage()
{
return message;
}
public void setMessage(String message)
{
this.message = message;
}// The printMessage operation
public void printMessage()
{
log.info(message);
}// The lifecycle
protected void startService() throws Exception
{
log.info("Starting with message=" + message);
}
protected void stopService() throws Exception
{
log.info("Stopping with message=" + message);
}
}
com.acme.HelloWorldServiceMBean:
package com.acme;import org.jboss.system.ServiceMBean;public interface HelloWorldServiceMBean extends ServiceMBean
{
// Configure getters and setters for the message attribute
String getMessage();
void setMessage(String message);// The print message operation
void printMessage();
}Si esto les funciona, ya están listos para la siguiente y terrorífica etapa... obtener la info de un MBean del servidor!
