Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Servizio windows creato con java, si stoppa dopo 30 minuti

    Salve, ho implementato un servizio window partendo da un file Jar creato con Java (Eclipse), questo servizio si connette ad un database ed in maniera ciclica controlla se ci sono exportazioni o importazione di file. Il servizio funziona correttamente, ma sono per 30 minuti, dopodichè il servizio si arresta. Per generare il servizio o utilizzato INSSRV che altri software di generazione servizi window da file Java.
    Qualcuno ha avuto questo stesso mio problema?

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Non ho mai avuto la necessità di creare un servizio per Windows in Java anche se ho diversi programmi che lavorano "come tali" su un server e non soffrono di questo problema.

    Prova a controllare se accade qualcosa: fagli scrivere un file di log, dove reindirizzi tutto l'output (anche quello sullo standard error) e verifica se vengono sollevate delle eccezioni.

    La prima cosa che mi è venuta in mente dalla descrizione (può non essere la causa, ovviamente) è che potrebbe esserci un timeout impostato sulle connessioni del DB. Se è impostato un timeout di connessione nel DB, scaduto il tempo massimo di inattività la connessione col DB viene persa... un successivo tentativo di effettuare operazioni sul DB da parte del servizio, potrebbe sollevare una eccezione che fa terminare il programma.

    L'unico modo per saperlo, però, è avere un file di log.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Non credo sia un problema di timeout, perchè il servizio effettua una interrogazione del database ogni minuti per verificare se ci sono altri servizi da eseguire....

    Per quanto riguarda il file di log che dici non ho ben compreso come fare...

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    La via più semplice è quella di far redirigere tutto l'output su un file. Ad esempio, potresti far scrivere un file al tuo servizio in una posizione fissa. Per fare questo, è sufficiente che, come prima operazione, tu imposti gli stream di output su un file. Ad esempio:

    codice:
    // Nella classe principale, dove c'è il main:
    public static void main(String[] args) {
       try {
          // Qui imposto gli stream di output sul file C:\logservizio.log
          PrintStream ps = new PrintStream( new FileOutputStream("C:/logservizio.log") );
          System.setOut( ps );
          System.setErr( ps );
       } catch (Exception e) { e.printStackTrace(); }
    
       // Avvia l'applicazione normalmente
       ...
    }
    In questo modo, prima di tutto viene rediretto l'output (sia quello dello standard output, che quello dello standard error usato dalle eccezioni) sul file "C:\logservizio.log".

    Quando ti accorgi che il servizio si è fermato, controlli questo file di log per verificare cosa è successo.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Provo come mi hai suggerito!
    Grazie!
    Fabio

  6. #6
    perchè non provi a mettere il tutto in un filebat eseguibile e lo dai in pasto alla schedulazione di windows?

    così facendo puoi lanciarlo dal dos e renderti conto (volendo).
    SCJP 96%

    Sono io signore che non ti perdono,io non merito punizioni, io sono potentissimo e ora che ho visto il tuo volto merito di stare in un cielo alto più alto del tuo perché non capendo chi è l’uomo hai dimostrato di essermi inferiore,tu servirai me. Da oggi mi chiamerò Satan che significa l’Avversario.

  7. #7
    scusa ancora , se proprio vuoi un logger,
    aggiungi log4j come jar e nel main scrivi qualcosa del tipo :

    String logPropertiesFilename = "conf/log4j.properties";
    // carico il file
    p.load(new FileInputStream(new File(logPropertiesFilename)));

    // logger
    org.apache.log4j.LogManager.resetConfiguration();
    PropertyConfigurator.configure(p);
    logger = Logger.getLogger(this.getClass().getName());
    logger.info("qui traccio tutto quello che mi pare");
    ******************il log4j.properties********************************** ***
    log4j.rootCategory=INFO, stdout, rolling
    log4j.appender.stdout=org.apache.log4j.ConsoleAppe nder
    log4j.appender.stdout.layout=org.apache.log4j.Patt ernLayout
    log4j.appender.stdout.layout.ConversionPattern=%d{ MM-dd@HH:mm:ss} %-5p (%13F:%L) %3x - %m%n
    log4j.appender.rolling=org.apache.log4j.DailyRolli ngFileAppender
    log4j.appender.rolling.File=log/batch.log
    log4j.appender.rolling.ImmediateFlush=true
    log4j.appender.rolling.layout.ConversionPattern=%d {MM-dd@HH:mm:ss} %-5p (%13F:%L) %3x - %m%n
    log4j.appender.rolling.layout=org.apache.log4j.Pat ternLayout
    ******************fine log4j.properties**********************************
    crea un file del tipo batch.log.2008-12-02 (ogni giorno ne crea uno diverso)

    hi
    SCJP 96%

    Sono io signore che non ti perdono,io non merito punizioni, io sono potentissimo e ora che ho visto il tuo volto merito di stare in un cielo alto più alto del tuo perché non capendo chi è l’uomo hai dimostrato di essermi inferiore,tu servirai me. Da oggi mi chiamerò Satan che significa l’Avversario.

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da morpheus4java
    perchè non provi a mettere il tutto in un filebat eseguibile e lo dai in pasto alla schedulazione di windows?

    così facendo puoi lanciarlo dal dos e renderti conto (volendo).
    Uhm... il concetto di "servizio" è diverso dal concetto di "job schedulato".

    Un servizio è un programma che una volta avviato dovrebbe rimanere sempre in esecuzione e, potenzialmente, non fermarsi mai.

    Un job schedulato è un programma che effettua delle elaborazioni periodiche ad un orario prestabilito.

    Se parliamo di ambienti server, c'è una macchina che, potenzialmente, non viene mai spenta né riavviata... un servizio parte all'accensione (una ed una sola volta) e non si ferma più... un job schedulato verrebbe eseguito più volte nel lifecycle della macchina...

    Se si imposta un servizio come job schedulato si va incontro a notevoli fastidi, ancor più se, come nel caso dell'autore, il servizio effettua connessioni al DB...


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    interessante spiegazione, ma vorrei ampliare a secona delle esigenze.

    Utilizzo un servizio se ad esempio la mia macchina deve restare in ascolto su qualche socket, oppure se mi aspetto qualche evento particolare dal sistema operativo. Nel nostro caso collegamento al db dovrebbe avvenire in maniera schedulata e terminare quando cessa la connessione e tutte le transazioni relative (a meno che il nostro amico non voglia aprire la connessione e mai richiuderla).
    Utilizzo un job schedulato (che cmq sia mi partirebbe sempre e cmq al riavvio del mio serveerino, basta che gli dico a che ora e con quale frequenza) per ottimizzare le risorse , avere una piccola parte della mia ram in esecuzione a prescindere dai servizi del s.o. e soprattutto poter avere la facoltà di monitorarlo con un qualsiasi prodotto (anche fatto a mano) di job schedulati.

    *un job schedulato verrebbe eseguito più volte nel lifecycle della macchina...*
    dipende dai settaggi della schedualzione, e cmq sia il sistema operativo prima di invocare nuovamente il processo verifica che lo stesso non sia già in esecuzione se lo è sposta la chiamata ad un tempo successivo.

    hi
    SCJP 96%

    Sono io signore che non ti perdono,io non merito punizioni, io sono potentissimo e ora che ho visto il tuo volto merito di stare in un cielo alto più alto del tuo perché non capendo chi è l’uomo hai dimostrato di essermi inferiore,tu servirai me. Da oggi mi chiamerò Satan che significa l’Avversario.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.