J'essaye d'écrire un programme qui vérifie la santé d'une base de données. L'un des éléments des éléments du programme est supposé être que le programme interroge une base de données et attend 5 minutes en utilisant wait. S'il n'y a pas de réponse, il notifie et envoie des emails. Ma connexion à la base de données/envoi de courriels fonctionne, mais j'ai du mal à mettre en place l'attente et à notifier. J'ai lu l'API et il est facile à comprendre dans un programme simple, mais je suis vraiment confus quant à la façon de l'implanter dans ce cas avec toutes les complications supplémentaires à cause d'erreurs où je ne peux pas appeler dynamique d'une méthode statique .Mise en œuvre Attendre et notifier
J'ai lu beaucoup de threads avec wait et notify, mais je n'ai pas compris comment le faire correctement dans mon programme. Si quelqu'un pouvait me donner quelques conseils, ce serait une aide énorme. Merci!
import com.fmr.ipgt.email.*;
import java.io.File;
import java.io.IOException;
import java.util.List;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import javax.mail.MessagingException;
class MyResource {
synchronized void qQuery() throws Exception {
String query = ".z.k"; // The query that is used to query q; this can be changed here.
int version = 0;
c qConn = null;
qConn = new c(Main.host,Main.port); // Connect to the q database
while (Main.healthy) {
Object o = qConn.k(query); // Query q
version = c.t(o);
if(!(version==0)) {
break; // End the process if the database responds
}
}
}
synchronized void start() throws Exception {
Main.setHealth(false);
Main.sendMessages();
}
}
class MyThread implements Runnable {
MyResource myResource;
MyThread(String name, MyResource so) {
myResource = so;
new Thread(this, name).start();
}
public void run() {
try {
myResource.qQuery(); // Begin a method to query q.
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class Main {
private static String[] recipients;
private static String subject = "Database Failure";
private static String message = "The database has failed or is in a hung state";
private static String from;
static String host;
static int port;
private static String emails;
private static int minutes;
static boolean healthy = true;
public static void main(String args[]) throws Exception {
// Import information from the configuration file
SAXBuilder builder = new SAXBuilder();
File xmlFile = new File("/export/home/jflt/file.xml"); // Note: The directory for the configuration file may need to be changed
try {
Document document = (Document) builder.build(xmlFile);
Element rootNode = document.getRootElement();
List list = rootNode.getChildren("parameters");
Element node = (Element) list.get(0);
host = node.getChildText("host");
port = Integer.parseInt(node.getChildText("port"));
emails = node.getChildText("emails");
String delims = "[ ]+";
recipients = emails.split(delims); // parse email list
minutes = Integer.parseInt(node.getChildText("time"));
from = node.getChildText("from");
} catch (IOException io) {
System.out.println(io.getMessage());
} catch (JDOMException jdomex) {
System.out.println(jdomex.getMessage());
}
MyResource unhealthy = new MyResource();
new MyThread("MyThread", unhealthy); // Create new Thread
new MyThread("WaitThread", unhealthy);
while(healthy) {
Thread.sleep(minutes*60000); // The wrong thread is sleeping here. The main method should probably be a different thread instead which will then need to wait and the second thread will notify.
}
unhealthy.start(); // The database has not responded for the given time. Report that it is unhealthy.
}
public static void setHealth(boolean health){
System.out.println("database unhealthy");
healthy = health;
}
public static void sendMessages() throws MessagingException {
System.out.println("sending emails");
FCAPMailSender.postMail(recipients,subject,message,from);
}
}
C'est trop beaucoup de code. Faites bouillir le problème jusqu'aux bases avant de poster. Faire un SSCCE. – erickson
hmm bien je suppose que je pourrais supprimer le code parce que rien de tout cela est vraiment pertinent à ce que je demande. J'essaie juste de comprendre comment faire et notifier où le thread 2 commence une requête, le thread 1 attend 5 minutes, si le thread 2 renvoie un résultat qu'il notifie, sinon le thread 1 fait une tâche différente. Le problème pour moi est que dans tous les exemples d'attente et de notification, les threads utilisent une méthode d'exécution et font la même chose – Lemonio