Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα,

έχω ένα jax-rs WeβService στο οποίο καλώ κάποιες λειτουργίες από τη βιβλιοθήκη mallet.

Όταν μπουν λάθος παράμετροι στον αλγόριθμο LDA μου πετάει στο Console του tomcat το παρακάτω μήνυμα.

 

10-Oct-2014 20:56:55.383 INFO [http-nio-8084-exec-270] cc.mallet.topics.ParallelTopicModel.optimizeBeta [beta: 50.67023]
10-Oct-2014 20:56:55.384 INFO [http-nio-8084-exec-270] null.null <100> LL/token: -8.09636
10-Oct-2014 20:56:55.534 INFO [http-nio-8084-exec-270] null.null [beta: 2.36179]
10-Oct-2014 20:56:55.684 INFO [http-nio-8084-exec-270] null.null [beta: 1.3973]
10-Oct-2014 20:56:55.685 INFO [http-nio-8084-exec-270] null.null <110> LL/token: -8.15158

 

10-Oct-2014 20:56:55.839 INFO [http-nio-8084-exec-270] cc.mallet.topics.ParallelTopicModel.optimizeBeta [beta: 9.53797]
java.lang.ArrayIndexOutOfBoundsException: -1
 at cc.mallet.topics.WorkerRunnable.sampleTopicsForOneDoc(WorkerRunnable.java:489)
 at cc.mallet.topics.WorkerRunnable.run(WorkerRunnable.java:275)
 at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
 at java.util.concurrent.FutureTask.run(FutureTask.java:266)
 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
 at java.lang.Thread.run(Thread.java:745)
java.lang.ArrayIndexOutOfBoundsException: -1
 at cc.mallet.topics.WorkerRunnable.sampleTopicsForOneDoc(WorkerRunnable.java:489)
 at cc.mallet.topics.WorkerRunnable.run(WorkerRunnable.java:275)
 at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
 at java.util.concurrent.FutureTask.run(FutureTask.java:266)
 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
 at java.lang.Thread.run(Thread.java:745)

 

 

Αυτό εμφανίζεται μόνο στο console και όχι στα Log. Στο κώδικα μου έχω διαχειριστεί κατάλληλα τα Exception, αλλά σε αυτή τη περίπτωση δεν μπαίνει στο cach .

 

Ο κώδικας μου είναι της μορφής

 

 

 

try{ 
//call some function from library 
} 
catch(Exception e){
  System.out.println("LDA Exception") 
}

Πως μπορώ να διαχειριστώ αυτά τα Exception? 

Δημοσ.

Αν χρησιμοποιείς κάποιο Logging library μπορείς να ρυθμίσεις για συγκεκριμένα packages σε τι Level θα γίνονται Log sto console. Θα σου πρότεινα να κοιτάξεις το Logback. 

 

Πιο καφρίλα είναι να κόψεις στον Tomcat να loggarei τα INFO στη κονσόλα αλλά λογικά μπορεί να θέλεις άλλα INFO.

Δημοσ.

Αν χρησιμοποιείς κάποιο Logging library μπορείς να ρυθμίσεις για συγκεκριμένα packages σε τι Level θα γίνονται Log sto console. Θα σου πρότεινα να κοιτάξεις το Logback. 

 

Πιο καφρίλα είναι να κόψεις στον Tomcat να loggarei τα INFO στη κονσόλα αλλά λογικά μπορεί να θέλεις άλλα INFO.

Δεν θέλω να κόψω τα INFO. Το πρόβλημα είναι ότι αν μπουν λάθος παράμετροι (δεν γνωρίζω πότε θα είναι λάθος για να κάνω validate) σε μια συνάρτηση της βιβλιοθήκης, πετάει exception και δεν το πιάνει το try{}catch που έχω στο webService μου. Με λίγα λόγια θέλω να πιάσω τα uncaught exceptions   ώστε να επιστέψω στο Client μήνυμα λάθους . 

Δημοσ.

Αυτό που θα έκανα είναι θα πήγαινα εδώ: https://github.com/mimno/Mallet

και θα έβλεπα τι ακριβώς γίνεται όταν καλείται η συγκεκριμένη μέθοδος. Αναλόγως τι γίνεται εκεί μια λύση είναι να κάνεις extend τη κλάση και @Override τη μέθοδο όπως σε βολεύει. Αν θέλεις πες μου τη μέθοδο να ρίξω μια ματιά και εγώ.

Δημοσ.

Καλώ τη συνάρτηση estimate στη κλάση ParallelTopicModel που βρίσκεται στο πακέτο cc.mallet/topics

 

Μία μικρή περιγραφή για το τι συμβαίνει στο κώδικα:

 

public class ParallelTopicModel implements Serializable 
{      
     int numThreads =2;
     public void estimate() throws IOException 
    {            
	WorkerRunnable[] runnables = new WorkerRunnable[numThreads];
        for (int thread = 0; thread < numThreads; thread++) {    
   	    runnables[thread] = new WorkerRunnable(numTopics, alpha, alphaSum, 
		   			          beta,random, data, runnableCounts, 
                                                  runnableTotals, offset, docsPerThread);
           //some code
       }        
    }       
}   

public class WorkerRunnable implements Runnable {
   public void run() 
   {              
    	try {                
		//some code              
   	}
   	catch (Exception e) {                
		e.printStackTrace();            
   	}        
   }  
}

My web service

@POST    @Produces("application/xml")    
public String getXml(@FormParam("xmlinput") String xmlinput) throws Exception {    
        try {         //call estimate function in ParallelTopicModel class         
                      //return  an xml;   
       }
       catch (Exception e) {
           return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + 
                  "<modelingOutput>null</modelingOutput>";    
       }}







 

 

 

 

Δημοσ.

Ε νάτο...οι υπερκάφροι έχουν βάλει e.printStackTrace ston κώδικα και καταπίνει και το Exception ο Worker.

 

Γνώμη μου είναι να κάνεις extend τη κλάση ParallelTopicModel και βάλε μια καινούργια estimate η οποία θα επιστρέφει ξέρω Boolean για να μπορείς να ξέρεις ότι εκτελέστηκε σωστά. Κάνε copy-paste τον κώδικα μέσα σε αυτή απο την παλιά estimate και ενδεχομένως κάνε και ένα extend το WorkingRunnable όπου δεν θα καταπινει το exception αλλά tha to κάνει throw.

 

Μέσα στη καινούργια estimate() θα χρησιμοποιήσεις το καινούργιο MyWorkingRunnable.

 

Έτσι μπορείς να βάλεις στο method definition να κάνει throw κάποιο Exception η estimate() για να το διαχειριστει το Web-Service σου.

 

Εναλλακτικά η estimate θα μπορούσε να έχει αυτή ένα try-catch και  στο catch να κάνει απευθείας throw new RuntimeException("Reason for Exception", e) και να πάει απευθείας στο Response.

 

 

Εκτός αν μπορείς απο την estimate() διαβάζοντας κάποιο variable να καταλάβεις αν έκανε τη δουλειά της.

 

Άλλη εναλλακτική είναι να κατεβάσεις όλο τον κώδικα και πας να αλλάξεις το WorkingRunnable να κάνει στο catch throw new RuntimeException και να κάνεις build εσύ τη βιβλιοθήκη (ενδεχομένως ευκολότερο αν ξέρεις να το κάνεις).

  • Like 1
Δημοσ.

 

Άλλη εναλλακτική είναι να κατεβάσεις όλο τον κώδικα και πας να αλλάξεις το WorkingRunnable να κάνει στο catch throw new RuntimeException και να κάνεις build εσύ τη βιβλιοθήκη (ενδεχομένως ευκολότερο αν ξέρεις να το κάνεις).

Ευχαριστώ πολύ για την απάντηση. Θα το προσπαθήσω. Όσο αφορά το τελευταίο που είπες η  WorkingRunnable κάνει implements το interface Runnable  οπότε το μόνο που μπορώ να κάνει είναι να φτιάξω νέο interface το οποίο να κάνει throws.

Παρόλα αυτά θα το προσπαθήσω και θα σου απαντήσω στο post. Ευχαριστώ για το χρόνο σου.

 

 

Υ.Γ. Μήπως θα μπορούσε να λειτουργήσει κάτι σαν αυτό? http://stackoverflow.com/questions/702415/how-to-know-if-other-threads-have-finished

 

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...