Как получить доступ к сеансу Hibernate из папки src? - PullRequest
0 голосов
/ 17 января 2011

Я хотел бы знать, как правильно получить доступ к Сервису и Доменам в этом примере класса, расположенном в папке src / java

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;
}

}

Я сталкиваюсь с этим сообщением об ошибке:

Сеанс Hibernate не привязан к потоку, и конфигурация не позволяет создавать нетранзакционный сеанс здесь

Спасибо.

Ответы [ 2 ]

3 голосов
/ 17 января 2011

Вы не должны создавать экземпляр класса обслуживания самостоятельно, а вместо этого взять экземпляр класса из основного контекста

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

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

Если вы используете Java

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

public class SomeClass  {
   SomeService someService;
   public SomeClass()  {
       someService = (SomeService) ApplicationHolder.getApplication().getMainContext().getBean("someService");
   }
}
1 голос
/ 17 января 2011

Рассмотрите возможность использования Spring и аннотации @Transactional или AOP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...