在@Scheduled中运行的作业不会调用spring data jpa的保存操作。

8 浏览
0 Comments

在@Scheduled中运行的作业不会调用spring data jpa的保存操作。

我使用注解@Scheduled安排了一个任务,该任务应该使用Spring Data JPA处理数据并将其保存到数据库中。save方法被调用时没有出现异常,但是数据库中没有插入数据。在同一个注解方法中,我调用了findAll方法,它正常工作并获取数据。可能的原因是什么?

可能的原因是在调用save方法时,数据没有成功保存到数据库中。可能是由于数据库连接问题、事务管理问题或其他错误导致的。您可以检查数据库连接配置、事务管理器配置和数据库日志以查找问题。

另外,您可以检查save方法是否在事务中执行。如果没有事务管理器配置或save方法没有在事务中执行,数据可能不会保存到数据库中。您可以在Scheduler类上添加@Transactional注解来确保save方法在事务中执行。

此外,您还可以检查数据库表结构是否正确,并确保PossibleOfferLink实体类的数据可以正确映射到数据库表中。

另外,您的代码中还有一些依赖项,例如Spring Boot Starter Parent、Spring Boot Starter Data JPA、Spring Boot Starter Batch等。您可以检查这些依赖项的版本是否与您的代码兼容,并确保它们已正确配置和引入。

0
0 Comments

问题的原因是在调用`repo.save`方法时没有进行事务提交。出现这个问题的原因是定时任务没有开启事务。

解决方法是通过注解配置事务管理器,并在调用`repo.save`方法之前开启事务。

以下是一个配置事务管理器的示例代码:

public class PersistenceJPAConfig{
   public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(){
      ...
   }
   public PlatformTransactionManager transactionManager(){
      JpaTransactionManager transactionManager = new JpaTransactionManager();
      transactionManager.setEntityManagerFactory(entityManagerFactoryBean().getObject());
      return transactionManager;
   }
}

在`scheduleCrawlerJob`方法中添加以下代码:

@Scheduled(fixedRate=100000)
public void scheduleCrawlerJob() throws MalformedURLException {
    Iterable links = repo.findAll();
    PossibleOfferLink link = repo.save(new PossibleOfferLink(new URL("...")));
}

在调用`repo.save`方法之前开启事务可以解决这个问题。

0
0 Comments

在 @Scheduled 注解下,job没有调用 spring data jpa 的 save 方法的解决方法如下:

1. 在 Application 类中添加以下代码,并且添加 PlatformTransactionManager Bean:

private EntityManagerFactory entityManagerFactory;
public PlatformTransactionManager transactionManager()
{
    return new JpaTransactionManager(entityManagerFactory);
}

以下是需要导入的包:

import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

2. 在调度器代码中添加以下代码:

@Scheduled(fixedRate = 60 *10*1000)
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void reportCurrentTime() {
    doDatabaseTransaction();
}

以下是需要导入的包:

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

希望这能解决你的问题 🙂

0
0 Comments

问题的原因:使用@Scheduled注解的方法没有触发Spring Data JPA的保存操作。

解决方法:将scheduleCrawlerJob()方法的主体代码封装到另一个类的一个被@Async注解修饰的方法中,并创建一个被@Transactional注解修饰的方法,该方法被scheduleCrawlerJob()调用。

调用链如下:

Scheduled -> Async -> Transactional

注意:不要忘记在配置中添加@EnableAsync注解。

0