2010-07-07 4 views
0

En développant l'application java Email avec Timer, j'ai deux arraylists nommés ActiveProcesses, InActiveProcesses. Si je démarre le minuteur, il enverra l'email avec les valeurs de la liste InActiveProcesses pour chaque seconde. Mais le problème est que le minuteur est envoyé à l'Email si les valeurs de la liste InActiveProcesses sont identiques. Par exemple, la liste InActiveProcess contient la valeur abcd, il envoie un Email toutes les secondes avec les mêmes valeurs List. Je veux envoyer le courrier électronique uniquement la liste InActiveProcesses contient des valeurs différentes. Le minuteur vérifiera les valeurs toutes les secondes si les valeurs sont différentes, il enverra l'email. Comment gérer ce problème en utilisant Java. Merci d'avance. Voici le code,Comment résoudre ce problème de minuteur dans java?

for (int i = 0; i < InActiveProcess.size(); i++) 
{ 
    if (!ActiveProcess.contains(InActiveProcess.get(i))) 
    { 
     list3.add(InActiveProcess.get(i)); 
    } 
} 
for (int i = 0; i < ActiveProcess.size(); i++) 
{ 
    if (!InActiveProcess.contains(ActiveProcess.get(i))) 
    { 
     list3.add(ActiveProcess.get(i)); 
    } 
} 
log.info("Processes which are Not Running: " + list3); 

StringBuilder sb = new StringBuilder(); 

for (int k = 0; k < list3.size(); k++) 
{ 

    Result = list3.get(k); 

    sb.append(Result.toString()); 

    sb.append(" "); 

} 

String message = sb.toString(); 

log.info(message); 

sms.SendMessage("1254554555", message); 

es.SendMail("[email protected]", " Server process is down", message); 

Ceci est ma classe Timer.

int delay = 5000; // delay for 5 sec. 

int interval = 1000; // iterate every sec. 

Timer timer = new Timer(); 

     timer.scheduleAtFixedRate(new sample() { 

     }, delay, interval); 

La minuterie est Exécuter la classe sample() pour chaque seconde et envoyé Envoyer à l'adresse spécifiée. Je veux gérer le minuteur va exécuter pour chaque seconde en même temps, l'email est envoyé es.SendMail("[email protected]", " Server process is down", message); si message contient des valeurs est différente.

Répondre

2

Mise à jour: La question a été modifiée après la publication de cette réponse. Ceci est la réponse à la question d'origine:

Vous pouvez utiliser une classe Timer.

Vous pouvez planifier les actions à effectuer lorsque le temporisateur est désactivé via un TimerTask. Cette classe est abstraite, vous devez donc l'étendre et implémenter la méthode run().

class MyTimerTask extends TimerTask { 

    @Override 
    public void run(){ 
    // Task to do here 
} 
} 

Et puis dans votre classe principale

MyTimerTask task = new MyTimerTask(); // this class implements WHAT to do inside the method run(); 
Date date = new Date(...) // This class will tell timer WHEN to do the task 
Timer timer = new Timer(task,date); //Good to go! 

Sinon, vous pouvez faire Timer timer = new Timer(task,delay) d'avoir la tâche exécutée après delay miliseconds

+0

Pourquoi le vote à la baisse? – pakore

+0

Vous avez répondu à une question différente (et non-sollicitée). –

+0

Non, je ne l'ai pas fait. L'utilisateur a édité sa question en ajoutant mes changements après que j'ai répondu. Au début, il demandait comment implémenter un timer en Java pour faire ce qu'il voulait. – pakore

0

Il pourrait être légèrement sans rapport avec votre question, mais je ne pouvais pas m'empêcher de mentionner que vous faites à peu près t la même chose deux fois, en deux pour les boucles. Si je comprends bien, vous voulez vous assurer qu'il n'y a pas de doublons (comme dans une entrée qui existe à la fois ActiveProcesses et Inactive Processes). Si c'est le cas, pourquoi ne pas vérifier les doublons lorsque vous ajoutez une entrée à la liste? En ce qui concerne la minuterie, je vais être d'accord avec les réponses précédentes: java.util.Timer est très probablement ce dont vous avez besoin. Commencez là :)

Bonne chance

EDIT: pour référence ultérieure, s'il vous plaît essayer de préciser ce que votre "question" est sur le sujet au lieu

+0

Au lieu de vérifier les doublons, exécutez simplement lista.removeAll (listb); listb.removeAll (lista); – Syntax

1

Mes hypothèses:

  • list3 se réfère Vous pouvez modifier la classe Result.

D'abord, remplacer la méthode Object.equals dans votre classe Result.

Puis:

... 

log.info("Processes which are Not Running: " + list3); 
if (!list3.equals(this.previousList)) { 
    // update history for next time 
    this.previousList.clear(); 
    this.previousList.addAll(list3); 

    // Prepare and send email 
    StringBuilder sb = new StringBuilder(); 
    for (int k = 0; k < list3.size(); k++) 
    { 
     Result = list3.get(k); 
     sb.append(Result.toString()); 
     sb.append(" "); 
     String message = sb.toString(); 
     log.info(message); 
     sms.SendMessage("1254554555", message); 
     es.SendMail("[email protected]", " Server process is down", sb); 
    } 
} 

est l'ordre des processus dans la liste importants? Par exemple, les listes "a-b-c-d" et "b-a-d-c" sont-elles différentes? Si la réponse est non, alors java.util.List.equals ne répondra pas à vos besoins. Dans ce cas, n'utilisez pas de listes, mais des ensembles.


EDIT:

Si la liste est garantie à toujours commandé (si 'ABCD' ne peut jamais être 'mauvais c'), il peut être possible (et moins cher) pour construire, Enregistrez et comparez la chaîne créée à partir de StringBuilder, au lieu de créer, enregistrer et comparer la liste. De cette façon, vous ne devez pas implémenter Result.equals et Result.hashCode non plus.

Questions connexes