gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:14:47 25 4
gpt4 key购买 nike

我正在编写一个 Facebook 应用程序。一旦用户授权我的应用@fb,他们的登录页面将是查看个人资料页面。尽管我提取了大量数据,即点赞、群组等。将他重定向到登录页面需要花费大量时间。所以我的想法是,只需获取用户电子邮件 ID、教育和就业详细信息,然后将他重定向到登录页面。平均差距我在重定向之前启动了一个线程,它将在后台从他的帐户中提取所有数据。所以我创建了一个实现可运行的类,然后我从 Controller 启动了那个线程。在我从 fb 获取数据之前,它工作正常。调用 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 调度程序。所以这就是我的尝试。

FB Controller :

                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 来完成,但是您必须将此方法移动到单独的类中。

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com