[java]Controler un service

Controler un service [java] - Java - Programmation

Marsh Posté le 01-04-2009 à 10:19:43    

Bonjour à tous,
 
Voilà j'ai réaliser une appli que j'ai, grâce aux package org.tanukisoftware.wrapper, transformé en service.
Cette petite application réalise juste à un intervalle de temps (10secondes) une écriture dans un fichier.
 
Ce que j'aimerais faire, c'est réussir à modifier ce servir à l'aide d'un programme java.. Problème je ne vois pas comment (et même après avoir lu la doc de package org.tanukisoftware.wrapper) réussir à me "connecter" à ce service que j'ai créer.
 
Si quelqu'un sait se servir de ce package et connait ce cas, merci de l'aide :).
 
si je n'ai pas était clair, merci de me demander des précisions.
 
PS : http://wrapper.tanukisoftware.org/jdoc/index.html


Message édité par Subgenk le 02-04-2009 à 17:24:45
Reply

Marsh Posté le 01-04-2009 à 10:19:43   

Reply

Marsh Posté le 01-04-2009 à 11:37:06    

La seule info pour le moment que j'ai pu trouver pour tenter de créer un objet qui relierait ma classe à mon service se base sur un port pour le constructeur...

 

Quelqu'un saurait comment connaître le port utiliser par un service windows ?


Message édité par Subgenk le 01-04-2009 à 11:37:41
Reply

Marsh Posté le 01-04-2009 à 15:57:13    

Pour plus d'information sur mon programme en mode service, voici les sources :  

Code :
  1. public class BackGroundService implements WrapperListener
  2. {
  3.     private int time,i;
  4.     private boolean isTrue;
  5.     private String text;
  6.     private FileWriter fw;
  7.     public BackGroundService()
  8.     {
  9.         try
  10.         {
  11.             this.fw = new FileWriter("C:\\fichierTest.txt" );
  12.             this.time=10000;
  13.             this.text="test";
  14.             this.i=0;
  15.             this.isTrue = true;
  16.         }
  17.         catch (IOException ex)
  18.         {
  19.             Logger.getLogger(BackGroundService.class.getName()).log(Level.SEVERE, null, ex);
  20.         }
  21.     }
  22.     public void setFichier(String text)
  23.     {
  24.         try
  25.         {
  26.             this.fw = new FileWriter(text);
  27.         }
  28.         catch (IOException ex)
  29.         {
  30.             Logger.getLogger(BackGroundService.class.getName()).log(Level.SEVERE, null, ex);
  31.         }
  32.     }
  33.     public void setText(String text)
  34.     {
  35.         this.text = text;
  36.     }
  37.     public String getText()
  38.     {
  39.         return this.text;
  40.     }
  41.    
  42.     public void setTime(int time)
  43.     {
  44.         this.time = time;
  45.     }
  46.     public int getTime()
  47.     {
  48.         return this.time;
  49.     }
  50.     public void ecrireFichier()
  51.     {
  52.         try
  53.         {           
  54.             try {
  55.                 i++;
  56.                 fw.write("On ecrit dans le fichier: "+text+" "+ i+" fois,"+ " tous les "+time/1000+" secondes.\n" );
  57.                 fw.flush();
  58.                
  59.             }
  60.             catch (IOException ex)
  61.             {             
  62.                 Logger.getLogger(BackGroundService.class.getName()).log(Level.SEVERE, null, ex);
  63.             }
  64.             Thread.sleep(time);
  65.         }
  66.         catch (InterruptedException ex)
  67.         {
  68.             Logger.getLogger(BackGroundService.class.getName()).log(Level.SEVERE, null, ex);
  69.         }
  70.     }
  71.     public static void main(String []arg0)
  72.     {
  73.         BackGroundService BGS = new BackGroundService();
  74.         BGS.start(arg0);
  75.     }
  76.     public Integer start(String[] arg0)
  77.     {
  78.        
  79.         while (isTrue)
  80.         {
  81.             ecrireFichier();
  82.         }
  83.         return 1;
  84.     }
  85.     public int stop(int arg0)
  86.     {
  87.         isTrue = false;
  88.         return arg0;
  89.     }
  90.     public void controlEvent(int arg0)
  91.     {}
  92. }


 
J'ai implémenter dernièrement l'interface "WrapperListener", sans réussir à changer quelque chose...
Personne ne s'y connait sur ce Wrapper Service ? :x

Reply

Marsh Posté le 01-04-2009 à 16:14:21    

Il y a un problème avec ta méthode "start". Je cite la Javadoc : "This method call is expected to return, so a new thread should be launched if necessary"
 
Tu ne peux donc pas avoir une boucle comme ça dans cette méthode, tout ce qu'elle devrait faire, c'est créer un Thread, le lancer, et retourner.

Reply

Marsh Posté le 01-04-2009 à 16:28:22    

le problème n'est pas dans le service en lui même (vu que j'arrive à le faire tourner manuellement) le problème est que je n'arrive pas, par exemple à le lancer, en passant par un programme java.

 

Mais ceci dit je vais modifier ma méthode ^^

 

EDIT : Hum... Je vais peut-être passer pour un débutant... Mais je vois pas comment implémenter un new thread là-dedans :x !


Message édité par Subgenk le 01-04-2009 à 16:40:11
Reply

Marsh Posté le 01-04-2009 à 16:43:14    

Je comprends pas vraiment ton problème, tu pourrais essayer de décrire plus précisément ce que tu essaies de faire ? D'après ce que je devine, tu veux pouvoir arrêter et redémarrer les écritures dans ton fichier depuis un autre programme Java, c'est ça ? Et tu as quoi dans ton fichier wrapper.conf ?
 

Citation :

EDIT : Hum... Je vais peut-être passer pour un débutant... Mais je vois pas comment implémenter un new thread là-dedans :x !


 
C'est facile : il faut que ta classe implémente l'interface "Runnable", qui défini une seule méthode "public void run()". Dans cette méthode, tu mets la boucle que tu as actuellement dans "start". Dans "start", tu mets simplement ça :

Code :
  1. Thread t = new Thread(this);
  2. t.start();


Message édité par Riokmij le 01-04-2009 à 16:48:01
Reply

Marsh Posté le 01-04-2009 à 17:43:29    

Hum laissez tomber.. Je viens de me rendre compte que je ne peux pas contrôler mon service, tout simplement parce que j'ai la version gratuite de l'application.. u_u
 
Quelqu'un n'aurait pas un API/pattern qui permettrait de créer des services Windows et de pouvoir les contrôler (modifier des valeurs dedans) à l'aide d'une application java ?
 
PS : un API/pattern récent, donc le RMI bof :p

Reply

Marsh Posté le 01-04-2009 à 17:53:34    

Pour contrôler ton service, regarde du côté de JMX, ça me semble être exactement ce que tu cherches (c'est fourni en standard avec le JRE)

Reply

Marsh Posté le 02-04-2009 à 09:11:51    

merci, je vais fouiner de ce coté là :D

Reply

Marsh Posté le 02-04-2009 à 12:15:35    

hum J'ai un petit problème avec l'installation de mon service via java service..
J'ai eu les cas suivants :
- mon service s'arrete tout de suite
- mon service ne se démarre pas et me fait planter <.>

 

voici le code de mes 3 classes contenue dans mon service

Code :
  1. package ServiceJVXTest;
  2. public class Main
  3. {
  4.     public static void main(String[] args) throws Exception {
  5.         // Get the Platform MBean Server
  6.         MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
  7.         // Construct the ObjectName for the MBean we will register
  8.         ObjectName name = new ObjectName("ServiceJVXTest:type=BackGroundService" );
  9.         // Create the Hello World MBean
  10.         BackGroundService mbean = new BackGroundService();
  11.         // Register the Hello World MBean
  12.         mbs.registerMBean(mbean, name);
  13.         Thread.sleep(Long.MAX_VALUE);
  14.     }
  15. }
 
Code :
  1. package ServiceJVXTest;
  2. public interface BackGroundServiceMBean
  3. {
  4.     // Methodes accessibles
  5.    
  6.     public void setText(String text);
  7.     public void setTime(int time);
  8.     public void ecrireFichier();
  9.     public void setFichier(String text);
  10.     // Méthodes pour la Jconsole
  11.     public String getName();
  12.     public int getCacheSize();
  13.     public void setCacheSize(int size);
  14. }
 
Code :
  1. package ServiceJVXTest;
  2. public class BackGroundService implements BackGroundServiceMBean
  3. {
  4.     private int time,i;
  5.     private boolean isTrue;
  6.     private String text;
  7.     private FileWriter fw;
  8.     private final String name = "BackGroundService";
  9.     private int cacheSize = DEFAULT_CACHE_SIZE;
  10.     private static final int DEFAULT_CACHE_SIZE = 200;
  11.     public BackGroundService()
  12.     {
  13.         try
  14.         {
  15.             this.fw = new FileWriter("C:\\fichierTest.txt" );
  16.             this.time=10000;
  17.             this.text="test";
  18.             this.i=0;
  19.             this.isTrue = true;
  20.         }
  21.         catch (IOException ex)
  22.         {
  23.             Logger.getLogger(BackGroundService.class.getName()).log(Level.SEVERE, null, ex);
  24.         }
  25.     }
  26.     public void setFichier(String text)
  27.     {
  28.         try
  29.         {
  30.             this.fw = new FileWriter(text);
  31.         }
  32.         catch (IOException ex)
  33.         {
  34.             Logger.getLogger(BackGroundService.class.getName()).log(Level.SEVERE, null, ex);
  35.         }
  36.     }
  37.     public void setText(String text)
  38.     {
  39.         this.text = text;
  40.     }
  41.     public String getText()
  42.     {
  43.         return this.text;
  44.     }
  45.    
  46.     public void setTime(int time)
  47.     {
  48.         this.time = time;
  49.     }
  50.     public int getTime()
  51.     {
  52.         return this.time;
  53.     }
  54.     public void ecrireFichier()
  55.     {
  56.         try
  57.         {           
  58.             try {
  59.                 i++;
  60.                 fw.write("On ecrit dans le fichier: "+text+" "+ i+" fois,"+ " tous les "+time/1000+" secondes.\n" );
  61.                 fw.flush();
  62.                
  63.             }
  64.             catch (IOException ex)
  65.             {             
  66.                 Logger.getLogger(BackGroundService.class.getName()).log(Level.SEVERE, null, ex);
  67.             }
  68.             Thread.sleep(time);
  69.         }
  70.         catch (InterruptedException ex)
  71.         {
  72.             Logger.getLogger(BackGroundService.class.getName()).log(Level.SEVERE, null, ex);
  73.         }
  74.     }
  75.     public String getName() {
  76.         return this.name;
  77.     }
  78.     public int getCacheSize() {
  79.         return this.getCacheSize();
  80.     }
  81.     public void setCacheSize(int size) {
  82.         this.cacheSize=size;
  83.         System.out.println("Cache Size is now : "+cacheSize);
  84.     }
  85. }
 

Quand je le lance normalement tout se passe bien (ou presque, parce que je n'ai que ma méthode ecrireFichier() qui apparait dans la JConsole).

 

Je voudrais lancer ce programme en mode service, mais apparament je galère, j'ai mis mes 3 classe en BackGroundService.jar via netBeans, je l'ai mis dans C: et la commande que je tape est la suivante :

 

JavaService -install BackGroundService C:\Program Files\Java\jdk1.6.0_13\jre\bin\server\jvm.dll -Djava.class.path=C:\BackGroundService.jar
-start ServiceJVXTest.Main


Message édité par Subgenk le 02-04-2009 à 12:37:35
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed