java - Quartz - 在使用spring进行hibernate事务时,发生异常

标签 java facebook spring hibernate quartz-scheduler

我正在编写一个 Facebook 应用程序。一旦用户授权我的应用程序@fb,他们的登陆页面将是查看配置文件页面。尽管我提取了大量数据,即点赞、群组等。将他重定向到登陆页面需要花费大量时间。所以我的想法是,只需获取用户电子邮件 ID、教育和就业详细信息,然后将他重定向到登陆页面。平均差距我在重定向之前启动了一个线程,这将从他的后台帐户中提取所有数据。所以我创建了一个实现可运行的类,然后我从 Controller 启动了该线程。在我从 Facebook 获取数据之前它工作正常。在调用 DAO 的 save(obj) 方法时,我收到以下错误。

org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here

我的一位 friend 建议我使用 quartz 调度程序。这就是我尝试过的。

FBController:

                SchedulerFactory sf = new StdSchedulerFactory();
                Scheduler shed = null;
                try {
                    shed = sf.getScheduler();
                    shed.start();
                } catch (SchedulerException e) {
                    e.printStackTrace();
                }
                JobDetail jobDetail = new JobDetail("FB_Details", null, FacebookControllerHelper.class);

                jobDetail.getJobDataMap().put("Users", user);
                jobDetail.getJobDataMap().put("accessToken", accessToken);
                jobDetail.getJobDataMap().put("fbService", facebookService);
                jobDetail.getJobDataMap().put("OAuth", service);


                Trigger trigger = TriggerUtils.makeImmediateTrigger(0, 1);
                trigger.setName("FB_Details");
                try {
                    shed.scheduleJob(jobDetail, trigger);
                } catch (SchedulerException e) {
                    System.out.println("Ended In Exception");
                    e.printStackTrace();
                }

FBControllerHelper:

public class FacebookControllerHelper implements Job{

    private Users users;
    private Token accessToken;
    private FacebookService facebookService;
    private OAuthService service;
    Gson gson = new Gson();
    private static final String PROTECTED_RESOURCE_URL_LIKE = "https://graph.facebook.com/me?fields=likes.limit(1000).fields(id,name,description,website)";

    public FacebookControllerHelper(){
    }

    public void execute(JobExecutionContext context)
              throws JobExecutionException{

        JobDataMap dataMap = context.getJobDetail().getJobDataMap();

        users = (Users) dataMap.get("Users"); 
        accessToken = (Token) dataMap.get("accessToken");
        facebookService = (FacebookService) dataMap.get("fbService");
        service = (OAuthService) dataMap.get("OAuth");

        this.getUserLikes(accessToken, users);
    } 

    @Transactional
    public void getUserLikes(Token accessToken, Users user){
        System.out.println("Entering getUserLikes Method");

        OAuthRequest request = new OAuthRequest(Verb.GET, PROTECTED_RESOURCE_URL_LIKE);
        service.signRequest(accessToken, request);
        Response response = request.send();

        FBUserLikes fbuserLikes = gson.fromJson(response.getBody(), FBUserLikes.class);
        System.out.println(response.getBody());
        facebookService.saveUserLikes(user, fbuserLikes);
    }
}

response.getBody() 正在打印从 facbook 获取的 json。但是在将其传递给服务时,我正在调用 DAO 的 save() 方法。此时我收到以下错误,

[ERROR] [DefaultQuartzScheduler_Worker-2] org.quartz.core.JobRunShell - Job DEFAULT.FB_Details threw an unhandled Exception: 
org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here

我用谷歌搜索了我的错误,得到了一些解决方案,但它不适合我的应用程序。我使用的是 spring 3.0.5 版本和quartz 1.8.6。许多博客和类似的结果向我展示了如何在特定的时间间隔内运行 cron 作业。但这对我来说没有用。如果有人帮助我解决这个问题,我将不胜感激。希望我的问题很清楚。

提前谢谢您。

最佳答案

原因是您从同一 Controller 调用事务方法。 Spring需要为事务性注解创建代理。您可以通过 Autowiring 或从 spring 上下文获取 bean 来完成此操作,但是您必须将 this 方法移至单独的类。

另一个(肮脏的)解决方案是直接在方法中创建 hibernate session 。

关于java - Quartz - 在使用spring进行hibernate事务时,发生异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20285606/

相关文章:

java - 对象数组赋值问题

java - 父 pom.xml 的包装无效,必须为 "pom"但为 "ear"

android - 如何使用 Android 中的 Keytool for W7 32 位生成 key 哈希 (Facebook)

ruby-on-rails - Devise、OmniAuth 和 Facebook - 如何让用户编辑密码?

java - 在 Controller 中找不到 Grails 输入字段参数

java - Spring MVC 找不到 URI 映射

java - Java SystemClock.uptimeMillis() 的 Objective C/Swift 版本

Java AWT/Swing : paintComponent issue with custom JPanel(s)

Facebook 应用审核流程

Java Spring(页面<实体>.Map(新转换器))