我正在编写一个 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/