jimmysnn_17 Δημοσ. 10 Οκτωβρίου 2014 Δημοσ. 10 Οκτωβρίου 2014 Καλησπέρα, έχω ένα 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.0963610-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?
ZAKKWYLDE Δημοσ. 11 Οκτωβρίου 2014 Δημοσ. 11 Οκτωβρίου 2014 Αν χρησιμοποιείς κάποιο Logging library μπορείς να ρυθμίσεις για συγκεκριμένα packages σε τι Level θα γίνονται Log sto console. Θα σου πρότεινα να κοιτάξεις το Logback. Πιο καφρίλα είναι να κόψεις στον Tomcat να loggarei τα INFO στη κονσόλα αλλά λογικά μπορεί να θέλεις άλλα INFO.
jimmysnn_17 Δημοσ. 11 Οκτωβρίου 2014 Μέλος Δημοσ. 11 Οκτωβρίου 2014 Αν χρησιμοποιείς κάποιο Logging library μπορείς να ρυθμίσεις για συγκεκριμένα packages σε τι Level θα γίνονται Log sto console. Θα σου πρότεινα να κοιτάξεις το Logback. Πιο καφρίλα είναι να κόψεις στον Tomcat να loggarei τα INFO στη κονσόλα αλλά λογικά μπορεί να θέλεις άλλα INFO. Δεν θέλω να κόψω τα INFO. Το πρόβλημα είναι ότι αν μπουν λάθος παράμετροι (δεν γνωρίζω πότε θα είναι λάθος για να κάνω validate) σε μια συνάρτηση της βιβλιοθήκης, πετάει exception και δεν το πιάνει το try{}catch που έχω στο webService μου. Με λίγα λόγια θέλω να πιάσω τα uncaught exceptions ώστε να επιστέψω στο Client μήνυμα λάθους .
ZAKKWYLDE Δημοσ. 11 Οκτωβρίου 2014 Δημοσ. 11 Οκτωβρίου 2014 Αυτό που θα έκανα είναι θα πήγαινα εδώ: https://github.com/mimno/Mallet και θα έβλεπα τι ακριβώς γίνεται όταν καλείται η συγκεκριμένη μέθοδος. Αναλόγως τι γίνεται εκεί μια λύση είναι να κάνεις extend τη κλάση και @Override τη μέθοδο όπως σε βολεύει. Αν θέλεις πες μου τη μέθοδο να ρίξω μια ματιά και εγώ.
jimmysnn_17 Δημοσ. 11 Οκτωβρίου 2014 Μέλος Δημοσ. 11 Οκτωβρίου 2014 Καλώ τη συνάρτηση 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>"; }}
ZAKKWYLDE Δημοσ. 11 Οκτωβρίου 2014 Δημοσ. 11 Οκτωβρίου 2014 Ε νάτο...οι υπερκάφροι έχουν βάλει 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 εσύ τη βιβλιοθήκη (ενδεχομένως ευκολότερο αν ξέρεις να το κάνεις). 1
jimmysnn_17 Δημοσ. 11 Οκτωβρίου 2014 Μέλος Δημοσ. 11 Οκτωβρίου 2014 Άλλη εναλλακτική είναι να κατεβάσεις όλο τον κώδικα και πας να αλλάξεις το 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
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα