2011-01-17 4 views
0

Ich mag würde wissen, wie die Service-und Domains richtig in diesem Beispielklasse in src/java-OrdnerWie kann ich vom src-Ordner auf die Hibernate-Sitzung zugreifen?

public class NewsIngestion implements Runnable { 

private String str; 
private int num; 
private Logger log = Logger.getLogger("grails.app"); 
private static boolean isRunning; 
private Thread t; 
private WorkerJobService jobService; 
private NewsService newsService; 

public NewsIngestion(String s, int n) 
{ 
    jobService = new WorkerJobService(); 
    newsService = new NewsService(); 

    str = s; 
    num = n; 
    isRunning = false; 

    t = new Thread (this, "NewsIngestion"); 

} 

public void run() 
{ 

    while(isRunning){ 
     try{ 
      if(jobService.isJobEnabled("ConsumeFeedsJob") && jobService.lockJob("ConsumeFeedsJob")){ 
       log.info("${this.class.name}: ConsumeFeedsJob started"); 

       try{ 
        // get all sources 
        List sources = (List) InvokerHelper.invokeMethod(RSSFeed.class, "list", null); 

        for(int i = 0; i < sources.size(); i++) { 

         RSSFeed s = (RSSFeed) sources.get(i); 

         // check if it's time to read the source 
         int diff = DateTimeUtil.getSecondsDateDiff(s.getLastChecked(), new Date()); 

         if(s.getLastChecked() == null || diff >= s.getCheckInterval()){ 

          List keyword_list = (List) InvokerHelper.invokeMethod(Keyword.class, "list", null); 

          for(int j = 0; j < keyword_list.size(); j++) { 

           String keyword = (String) keyword_list.get(j); 

           try{ 
            newsService.ingestNewsFromSources(keyword, s); 
           }catch(Exception e){ 
            log.error("${this.class.name}: ${e}"); 
           } 

           log.debug("Completed reading feeds for ${keyword}."); 
           log.info("${this.class.name}: Reading feeds for '${keyword}' (${s.feedName}) took ${Float.toString(st2.getDuration())} second(s)."); 
          } 

          s.setLastChecked(new Date()); 
          InvokerHelper.invokeMethod(RSSFeed.class, "save", null); 
         } 

         log.info("${this.class.name}: Reading feeds for '${s.feedName}' for all keywords took ${Float.toString(st.getDuration())} second(s)."); 
        } 

       }catch(Exception e){ 
        log.error("${this.class.name}: Exception: ${e}"); 
       } 

       log.info("${this.class.name}: ConsumeFeedsJob ended."); 

       // unlock job 
       jobService.unlockJob("ConsumeFeedsJob"); 
      } 

      log.info("alfred: success"); 

     } 
     catch (Exception e){ 
      log.info("alfred exception: " + e.getMessage()); 
     } 

     try { 
      Thread.sleep(5000); 
     } catch (InterruptedException e) { 
      log.info(e.getMessage()); 
     } 
    } 
} 

public void start() { 
    if(t == null){ 
     t = new Thread (this, "NewsIngestion"); 
    } 

    if(!isRunning){ 
     isRunning = true; 
     t.start(); 
    } 
} 

public void stop() { 
    isRunning = false; 
} 

public boolean isRunning() { 
    return isRunning; 
} 

}

Ich bin Begegnung mit dieser Fehlermeldung platziert zuzugreifen:

Keine an den Thread gebundene Hibernate-Sitzung, . Die Konfiguration erlaubt nicht transaktionale Erstellung hier

Danke.

Antwort

3

Sie sollten die Service-Klasse selbst nicht instanziiert, sondern die Klasseninstanz aus dem Kontext

import org.codehaus.groovy.grails.commons.ApplicationHolder 

def ctx = ApplicationHolder.application.mainContext 
def newsService = ctx.newsService 

Wenn Sie mit Java

import org.codehaus.groovy.grails.commons.ApplicationHolder 

public class SomeClass { 
    SomeService someService; 
    public SomeClass() { 
     someService = (SomeService) ApplicationHolder.getApplication().getMainContext().getBean("someService"); 
    } 
} 
+0

danke für den Vorschlag, aber ich bin mir nicht sicher, ob Sie mein Problem verstehen. Meine Klasse ist in Java, nicht Groovy. Ich kann es jedoch bis hierhin konvertieren: ApplicationContext ctx = ApplicationHolder.getApplication(). GetMainContext(); Ich weiß nicht, wie ich den NewsService als nächstes bekomme. – firnnauriel

+0

Wenn Sie Java verwenden, sollten Sie NewsService verwenden newService = (NewsService) ApplicationHolder.getApplication(). GetMainContext(). GetBean ("newsService"); – yogiebiz

+0

Ja, ich glaube du hast es verstanden. Danke vielmals! – firnnauriel

1

Verwenden Sie Spring und @ Transactional Annotation oder AOP.

+0

Es tut mir leid, aber ich nehme bin damit nicht vertraut. Möchten Sie einen Link oder Beispielcode teilen? Danke vielmals! – firnnauriel

+0

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/ http://www.grails.org/Spring+Integration –

+0

sieht gut aus. werde das studieren. Danke noch einmal! – firnnauriel

Verwandte Themen