在@Scheduled 中运行的作业不会调用 spring 数据 jpa 保存

Man*_*asz 6 java spring hibernate jpa spring-data-jpa

我已经安排了一个带有 annotation 的作业@Scheduled,它应该使用 spring data jpa 处理数据并将其保存到数据库中。save调用该方法没有任何异常,但没有插入数据库。在同一个带注释的方法中,我调用了findAll工作正常并获取数据的方法。可能是什么原因?

@Repository
public interface PossibleOfferLinkRepository extends PagingAndSortingRepository<PossibleOfferLink,   Long> {
}


@Configuration
@ComponentScan
@EnableAutoConfiguration
@Import({Scheduler.class})
@EntityScan(basePackages="model_package")
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }


}

@EnableScheduling
@ConditionalOnProperty(value= "property_name")
public class Scheduler {

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

}
Run Code Online (Sandbox Code Playgroud)

马文

        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.1.8.RELEASE</version>
        </parent>
    <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-batch</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>com.h2database</groupId>
                <artifactId>h2</artifactId>
                <version>1.4.182</version>
            </dependency>
            <dependency>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
                <version>${guava.version}</version>
            </dependency>
            <!-- Test -->
            <dependency>
                <groupId>org.easytesting</groupId>
                <artifactId>fest-assert</artifactId>
                <version>${easytesting.version}</version>
            </dependency>
        </dependencies>
Run Code Online (Sandbox Code Playgroud)

Md.*_*rim 7

最后我用这种方式解决了这个问题:

  1. 添加@EnableTransactionManagement到Application类中,同时添加了 PlatformTransactionManagerBean。检查以下代码:

    @Autowired
    private EntityManagerFactory entityManagerFactory;
    
    @Bean
    public PlatformTransactionManager transactionManager()
    {
        return new JpaTransactionManager(entityManagerFactory);
    }
    
    Run Code Online (Sandbox Code Playgroud)

    这是进口:

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

  2. 在我的调度程序代码中添加了以下代码:

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

这是进口:

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
Run Code Online (Sandbox Code Playgroud)

希望这能解决您的问题:)


Xst*_*ian 5

您的问题是由于没有正在进行的事务需要提交。

原因:

javax.persistence.TransactionRequiredException: no transaction is in progress
Run Code Online (Sandbox Code Playgroud)

这里有一个关于如何通过注释配置事务管理器的示例。 这里参考一下

@Configuration
@EnableTransactionManagement
public class PersistenceJPAConfig{

   @Bean
   public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(){
      ...
   }

   @Bean
   public PlatformTransactionManager transactionManager(){
      JpaTransactionManager transactionManager = new JpaTransactionManager();
      transactionManager.setEntityManagerFactory(
       entityManagerFactoryBean().getObject() );
      return transactionManager;
   }

}
Run Code Online (Sandbox Code Playgroud)

添加在scheduleCrawlerJob @Transactional

@Scheduled(fixedRate=100000)
@Transactional
public void scheduleCrawlerJob() throws MalformedURLException {
        Iterable<PossibleOfferLink> links = repo.findAll();
        PossibleOfferLink link = repo.save(new PossibleOfferLink(new URL("...")));
}
Run Code Online (Sandbox Code Playgroud)