elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


  Mostrar Temas
Páginas: [1]
1  Programación / Java / Inconveniente con Quartz en: 6 Mayo 2015, 19:49 pm
Hola...

Como están mis estimados compañeros, espero que estén teniendo un día agradable pero sobre todo espero que su código este ejecutándose correctamente ;D...

Mi problema radica en la implementación de hilos mediante el uso de la librería llamada Quartz, explico brevemente el framework... Quartz, es una librería que permite ejecutar trabajos o tareas mediante un tiempo de terminado, podemos decir que en esencia viene siendo lo que conocemos en Java como un Timer/TimerTask. Primeramente necesitamos una clase que implemente la interface Job, la cual tiene como método execute(), el cual va a contener nuestro acción a ejecutar. Posteriormente necesitamos una clase que ademas de contener el famoso método main, contiene la configuración de nuestro trabajo a ejecutar, tal y como podemos ver a continuación... (Creo que si fue breve xD)

Carga.java
Código
  1. public class Carga implements Job {
  2.  
  3. public void execute(JobExecutionContext context) throws JobExecutionException {
  4. for(int i = 0; i < 10000; i++){
  5. try {
  6. Thread.sleep(10);
  7. System.out.println("Index: " + i);
  8. } catch (InterruptedException e) {
  9. e.printStackTrace();
  10. }
  11. }
  12. }
  13. }
  14.  

CargaMain.java
Código
  1. public static void main(String[] args) throws SchedulerException {
  2. Scheduler scheduler = new StdSchedulerFactory().getScheduler();
  3.  
  4. Trigger trigger = TriggerBuilder.newTrigger().withSchedule(
  5. SimpleScheduleBuilder.simpleSchedule()
  6. .withIntervalInSeconds(10).repeatForever()).build();
  7.  
  8. JobDetail prueba = JobBuilder.newJob(Carga.class).withIdentity("hola","adios").build();
  9.  
  10. scheduler.scheduleJob(prueba, trigger);
  11. scheduler.start();
  12. }
  13.  

Como podemos ver, únicamente quiero una impresión de números en pantalla el cual si ejecutamos podemos ver en consola la salida de manera correcta, sin embargo, podemos ver que cuando pasan los 10 segundos que es el intervalo en que se va a ejecutar, se dispara nuevamente y vemos en pantalla algo parecido a lo siguiente...

Index: 0
Index: 793
Index: 1
Index: 794
Index: 2
Index: 795
Index: 3
Index: 796
Index: 4
Index: 797
Index: 5
...

A simple vista sabemos que el error es que no controlamos las llamadas por lo tanto podemos ver como se intercalan los números, para ello eh indago por Internet para controlar lo mencionado anteriormente y afortunadamente encontré la "solución" ante tal  inconveniente, incluso podemos decir que la solución es universal ya que en todos los temas que eh encontrado relacionado a este problema mencionan el mismo bloque de código, dejando el código de CargaMain de la siguiente manera...

CargaMain.java
Código
  1. public static void main(String[] args) throws SchedulerException {
  2. Scheduler scheduler = new StdSchedulerFactory().getScheduler();
  3.  
  4. Trigger trigger = TriggerBuilder.newTrigger().withSchedule(
  5. SimpleScheduleBuilder.simpleSchedule()
  6. .withIntervalInSeconds(10).repeatForever()).build();
  7.  
  8. JobDetail prueba = JobBuilder.newJob(Carga.class).withIdentity("hola","adios").build();
  9. if (prueba != null) {
  10.        List<JobExecutionContext> currentlyExecutingJobs = (List<JobExecutionContext>) scheduler.getCurrentlyExecutingJobs();
  11.        for (JobExecutionContext jec : currentlyExecutingJobs) {
  12.            if(prueba.equals(jec.getJobDetail())) {
  13.               System.out.println("RUNNING...");
  14.            }
  15.        }
  16.    }
  17.  
  18. scheduler.scheduleJob(prueba, trigger);
  19. scheduler.start();
  20. }
  21.  

Sin embargo, el resultado es el mismo :(, no controla la llamada como debería ser, mi pregunta es ¿Cual sería la forma correcta de adaptar del código? ya que como lo estoy haciendo no cabe duda que es la errónea.

Ahora bien, tengo entendido que me estoy complicando la vida y puedo hacer uso de la clase TimerTask para representar lo que necesito arriba, tal y como podemos ver a continuación...

Código
  1. public class Carga extends TimerTask{
  2. public static Timer timer;
  3.  
  4. public static void main(String[] args) {
  5. TimerTask tasknew = new Carga();
  6. timer = new Timer();
  7. timer.scheduleAtFixedRate(tasknew,500,1000);
  8. }
  9.  
  10. public void run() {
  11. try {
  12. for (int i = 0; i < 1000; i++){
  13. Thread.sleep(10);
  14. System.out.println("Index: " + i);
  15. }
  16. } catch (InterruptedException e) {
  17. e.printStackTrace();
  18. }
  19. }
  20. }
  21.  

Si ejecutamos lo siguiente vemos que imprime correctamente los primeros 1000 números e inmediatamente los próximos 1000 si el tiempo es muy corto, mi otra pregunta es... ¿Cual el proceso interno que realiza Java para el TimerTask de tal forma que si obtenga lo que necesito a diferencia de Quartz?

Disculpen mi pregunta pero la API no me ah ayudado mucho a comprender y despejar mis dudas...
2  Programación / Java / Timer (Poleo) en: 30 Abril 2015, 00:49 am
Hola...

Nuevamente yo compañeros, pero es que la verdad ya intente lo mas que pude y no consigo resultado positivo alguno, además que la documentación que encuentro sigue sin serme muy clara todavía para mis necesidades, espero explicarme lo mas posible...

Verán, tengo una aplicación de java lista para ejecutarse desde línea de comando, dicha aplicación tiene como objetivo consultar a base de datos, crear directorios por cada registro de la base así como crear archivos de texto plano dentro de los directorios previamente creados, sin embargo, dicha aplicación no la ejecuto directamente desde consola sino mas bien es ejecutada mediante otra aplicación java a través de un timer, el objetivo del timer es ejecutarse cada 10 minutos y cuando termine de ejecutarse el .jar que es llamado pasa a un estado de pausa para posteriormente cuando sean los 10 minutos, ejecutarse nuevamente. No obstante, mi problema no radica en lograr hacer este proceso, mas bien se enfoca que cuando ejecuto mi .jar para llamar al siguiente veo que la creación de las carpetas es sumamente lenta comparada a como debería crearlas, además de que el contenido por cada carpeta de acuerdo a la ejecución individual del archivo (Ejecute el archivo que contiene toda el código "rudo" directamente) deben ser un total de 8 archivos y veo que me crea el doble de archivos

A continuación, proporciono mi código correspondiente al poleo...

Código
  1. package com.comerciales.canada.main;
  2.  
  3. import java.util.Timer;
  4. import java.util.TimerTask;
  5.  
  6. public class PoleoCarpeta {
  7. Timer timer;
  8.  
  9.    public PoleoCarpeta() {
  10.        timer = new Timer();
  11.        timer.schedule(new PoleoCarpetaTask(),0,60000);
  12. }
  13.  
  14.    public void timerSleep(){
  15.     System.out.println("Poleo PAUSADO");
  16.     try {
  17. Thread.sleep(60000);
  18. timer.cancel();
  19. timer.purge();
  20. new PoleoCarpeta();
  21. } catch (InterruptedException e) {
  22. e.printStackTrace();
  23. }
  24.    }
  25.  
  26.    class PoleoCarpetaTask extends TimerTask {
  27.     public void run() {
  28.     System.out.println("Poleo REANUDADO");
  29.     try {
  30. Runtime.getRuntime().exec("java -jar C:\\Legada\\ProyectoComercialesCarga.jar");
  31. timerSleep();
  32. } catch (Exception e) {
  33. e.printStackTrace();
  34. }
  35.     }
  36.    }
  37.  
  38.    public static void main(String args[]) {
  39.     System.out.println("Poleo COMENZADO");
  40.     new PoleoCarpeta();
  41.    }
  42. }

No estoy seguro si este fallo en especial (Creación de carpetas lento y duplicación de archivos) corresponde al timer o bien a la programación que se encuentra en el otro archivo.

Sin mas que comentar, agradezco su tiempo y pronta respuesta. Que tengan un excelente día...

P.D.1. Si es necesario el otro archivo con gusto comparto el código.
P.D.2. Con respecto al detalle del println(), eh conseguido la solución gracias a un compañero, en un momento subo la solución en el tema correspondiente.
3  Programación / Java / Println en cmd desde .jar en: 29 Abril 2015, 18:21 pm
Hola...

Como están compañeros programadores, espero que tengan un excelente día, el motivo de mi tema es que ando batallando con algo que según a mi consideración no debería tener problema alguno, caso contrario, por favor de corregirme...

Tengo dos archivos .jar en donde uno de ellos manda a llamar al otro, además de contener tanto en uno como el otro un simple System.out.println(), tal y como pueden ver en el siguiente código.

Hola.jar
Código
  1. import java.io.IOException;
  2.  
  3. public class ImprimirHola {
  4.  
  5.    public static void main(String[] args) {
  6.        System.out.println("HOLA");
  7.        try {
  8.            Runtime.getRuntime().exec("java -jar C:\\Mundo.jar");
  9.        } catch (IOException e) {
  10.            e.printStackTrace();
  11.        }
  12.    }
  13. }
  14.  

Mundo.jar
Código
  1. public class ImprimirMundo {
  2.    public static void main(String[] args) {    
  3.        System.out.println("MUNDO");
  4.    }
  5. }

Sin embargo, cuando ejecuto el primer archivo el cual manda a llamar el siguiente debería ver en consola o por lo menos eso pienso...

HOLA
MUNDO

Cosa que no me realiza ya que solo veo en consola HOLA, prácticamente el archivo que estoy ejecutando en ese momento desde CMD, mi pregunta es... ¿Cual es la forma correcta de hacerlo?

De antemano, muchas gracias por su tiempo y pronta respuesta.

Sin mas que comentar, que tengan un excelente día.
4  Programación / Java / Multiples archivos con XSLT & Saxon en Java en: 23 Marzo 2015, 22:27 pm
Que tal amigos, soy nuevo en el foro y aquí vengo con un nuevo tema para ustedes, espero puedan apoyarme, como dice el título del tema, tengo un pequeño inconveniente con las hojas de estilo XSL, soy nuevo con las plantillas y no estoy seguro si estoy realizando las cosas correctamente.

Tengo una carpeta con archivos de texto como se muestra a continuación.

descarga1.txt
descarga2.txt
descarga3.txt
...

Dichos archivos se necesitan convertir a un archivo XML, el cual realizo correctamente con la implementación del código siguiente.

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" />

<xsl:variable name="text" select="tokenize(unparsed-text('file:///C:/Users/Quality/Documents/ProyectoComerciales/download_files/descarga01.txt'),'&#xD;&#xA;')" />

<xsl:template name="main" match="/">
<content>
<items>
<xsl:for-each select="$text">
<xsl:variable name="idi" select="substring(.,1,2)" />
<xsl:if test="$idi = 'OH'">
<item>
<xsl:element name="id"><xsl:value-of select="$idi" /></xsl:element>
<xsl:element name="folio"><xsl:value-of select="substring(.,3,10)" /></xsl:element>
</item>
</xsl:if>
</xsl:for-each>
</items>
<products>
<xsl:for-each select="$text">
<xsl:variable name="idp" select="substring(.,1,2)" />
<xsl:if test="$idp = 'BL'">
<product>
<xsl:element name="id"><xsl:value-of select="$idp" /></xsl:element>
<xsl:element name="code"><xsl:value-of select="substring(.,3,18)" /></xsl:element>
</product>
</xsl:if>
</xsl:for-each>
</products>
<users>
<xsl:for-each select="$text">
<xsl:variable name="idu" select="substring(.,1,2)" />
<xsl:if test="$idu = 'LH'">
<user>
<xsl:element name="id"><xsl:value-of select="$idu" /></xsl:element>
<xsl:element name="num"><xsl:value-of select="substring(.,3,6)" /></xsl:element>
</user>
</xsl:if>
</xsl:for-each>
</users>
</content>
</xsl:template>
</xsl:stylesheet>

Si realizamos la llamada desde Java a este archivo tendremos una conversión exitosa, sin embargo, como podrán ver en la tercera línea del código se puede observar que yo le estoy diciendo que archivo quiero que lea, por lo tanto ahí es donde viene mi problema. Necesito que lea todos los archivos que se encuentran dentro de mi carpeta y valla creando un XML por cada archivo que va leyendo, investigue en Internet que puedo implementar la función collection() que el mismo XSL tiene, por lo que quedaría de la siguiente manera.

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>

<xsl:template name="main" match="/">
<xsl:for-each select="collection('file:///C:/Users/Quality/Documents/ProyectoComerciales/download_files/?select=*.txt')">
<xsl:variable name="file" select="tokenize(document-uri(.),'/')[last()]"/>
<xsl:variable name="text" select="tokenize(unparsed-text($file),'&#xD;&#xA;')"/>
<xsl:for-each select="$text">
<content>
...
</content>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Sin embargo, cuando realizo la ejecución obtengo el siguiente mensaje de error "el contenido no está permitido en el prólogo". La llamada desde Java la realizo mediante el uso del siguiente código Saxon (saxon9he.jar)

try {
Processor proc = new Processor(false);
XsltCompiler comp = proc.newXsltCompiler();
XsltExecutable exp = comp.compile(new StreamSource(new File("C:/Users/Quality/Documents/" +
"ProyectoComerciales/xsl/convertir.xsl")));
Serializer out = new Serializer();
out.setOutputProperty(Serializer.Property.METHOD, "xml");
out.setOutputProperty(Serializer.Property.INDENT, "yes");
out.setOutputFile(new File("C:/Users/Quality/Documents/ProyectoComerciales/xml/descarga.xml"));
XsltTransformer trans = exp.load();
trans.setInitialTemplate(new QName("main"));
trans.setDestination(out);
trans.transform();
} catch (SaxonApiException sae) {
sae.printStackTrace();
}

Serían tan amables de apoyarme con este tema, de antemano, gracias por su tiempo.
5  Programación / Java / Leer todas las filas de un archivo de texto plano usando XSLT en Java en: 17 Marzo 2015, 23:42 pm
Hola, amigos!!!

Tengo el siguiente archivo de texto (.txt)

IT000000000000000545Panquecitos 2 100gr BIM OLA
IT000000000000000797Dalmata 45g MLA
IT000000000000001782Quequito max 80g Arrorico BIM

Eh conseguido leer el archivo mediante el uso de plantillas XSLT, y obtener como salida un archivo XML, sin embargo, mi codigo me lee unicamente la primera fila, y necesito leer todo el archivo, para obtener algo similar a esto:

<items>
   <item>
      <nick>IT</nick>
      <num>000000000000000545</nick>
      <desc>Panquecitos 2 100gr BIM OLA</nick>
   </item>
   <item>
      <nick>IT</nick>
      <num>000000000000000797</nick>
      <desc>Dalmata 45g MLA</nick>
   </item>
   ...
</items>

Podrian ayudarme, por favor, este es mi codigo para leer el archivo...

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="vText" select="replace(unparsed-text('file:///C:/Users/Quality/Desktop/test.txt'),'\r','')"/>
<xsl:template name="main" match="/">
<items>
<xsl:for-each select="$vText">
   <item>
         <xsl:element name="nick"><xsl:value-of select="substring($vText,1,2)"></xsl:value-of></xsl:element>
         <xsl:element name="num"><xsl:value-of select="substring($vText,3,18)"/></xsl:element>
         <xsl:element name="desc"><xsl:value-of select="substring($vText,21,40)"/></xsl:element>
   </item>
</xsl:for-each>
</items>
</xsl:template>
</xsl:stylesheet>

De antemano, gracias por su ayuda.
6  Programación / Java / Generar XML a partir de un archivo de texto (.txt) usando XSLT en Java en: 13 Marzo 2015, 17:37 pm
Hola, amigos.

Tengo el siguiente archivo de texto (.txt)

XX000000000000000111Example
OO001Test

Donde cada valor de cada linea tiene un limite de caracteres, de acuerdo al ID que se valla leyendo primeramente; es decir, si el ID es igual a XX entonces debe leer los caracteres especificados de acuerdo a ese ID, si el ID es OO entonces leera los especificados para ese ID.

*Producto:
Id (2 caracteres): XX
Codigo(18 caracteres): 000000000000000111
Descripcion(10 caracteres): Example

*Usuario:
Id (2 caracteres): OO
Numero(3 caracteres): 001
Nombre(40 caracteres): Test

Tengo mi aplicacion Java Standalone en donde realizo precisamente esas validaciones correspondientes, como los recupera de una base de datos, los voy cortando si es mayor o si es muy corto lo relleno con espacios o ceros segun sea el caso, por lo tanto, el limite de los valores por cada ID sera fijo.

Me gustaria leer ese archivo y convertirlo a un archivo XML, donde la creacion del archivo XML lo hago con Saxon, mediante la siguiente forma.

try {
Processor proc = new Processor(false);
XsltCompiler comp = proc.newXsltCompiler();
XsltExecutable exp = comp.compile(new StreamSource(new File("archivos/xsl/convertir.xsl")));
Serializer out = new Serializer();
out.setOutputProperty(Serializer.Property.METHOD, "xml");
out.setOutputProperty(Serializer.Property.INDENT, "yes");
out.setOutputFile(new File("archivos/xml/canada.xml"));
XsltTransformer trans = exp.load();
trans.setInitialTemplate(new QName("main"));
trans.setDestination(out);
trans.transform();
} catch (SaxonApiException sae) {
sae.printStackTrace();
}

Si se corre el siguiente codigo me crea el archivo correspondiente, de acuerdo al archivo .xsl que yo eh definido, para este caso hice algo sencillo como se muestra a continuación.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template name="main" match="/">
<producto>
<codigo>8</codigo>
</producto>
</xsl:template>
</xsl:stylesheet>

Ahora, serian tan amables de ayudarme como hago que lea mi archivo de texto para posteriormente ir obteniendo la salida correspondiente.

<producto>
<identificador>XX</identificador>
<codigo>000000000000000111</codigo>
<descripcion>Example</descripcion>
</producto>
<usuario>
<identificador>OO</identificador>
<codigo>001</codigo>
<descripcion>Test</descripcion>
</usuario>

De antemano, muchas gracias por su ayuda.
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines