企业级 SpringBoot 教程 (二十三)异步方法

创建工程

在pom文件引入相关依赖:

1

2

3

4

5

6

7

8

9

10

11

12

13

<dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter</artifactId>

        </dependency>

 

        <dependency>

            <groupId>org.springframework</groupId>

            <artifactId>spring-web</artifactId>

        </dependency>

        <dependency>

            <groupId>com.fasterxml.jackson.core</groupId>

            <artifactId>jackson-databind</artifactId>

        </dependency>

  创建一个接收数据的实体:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

@JsonIgnoreProperties(ignoreUnknown=true)

public class User {

 

    private String name;

    private String blog;

 

    public String getName() {

        return name;

    }

 

    public void setName(String name) {

        this.name = name;

    }

 

    public String getBlog() {

        return blog;

    }

 

    public void setBlog(String blog) {

        this.blog = blog;

    }

 

    @Override

    public String toString() {

        return "User [name=" + name + ", blog=" + blog + "]";

    }

 

}

  创建一个请求的 githib的service:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

@Service

public class GitHubLookupService {

 

    private static final Logger logger = LoggerFactory.getLogger(GitHubLookupService.class);

 

    private final RestTemplate restTemplate;

 

    public GitHubLookupService(RestTemplateBuilder restTemplateBuilder) {

        this.restTemplate = restTemplateBuilder.build();

    }

 

    @Async

    public Future<User> findUser(String user) throws InterruptedException {

        logger.info("Looking up " + user);

        String url = String.format("https://api.github.com/users/%s", user);

        User results = restTemplate.getForObject(url, User.class);

        // Artificial delay of 1s for demonstration purposes

        Thread.sleep(1000L);

        return new AsyncResult<>(results);

    }

 

}

  

通过,RestTemplate去请求,另外加上类@Async 表明是一个异步任务。

开启异步任务:

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

@SpringBootApplication

@EnableAsync

public class Application extends AsyncConfigurerSupport {

 

    public static void main(String[] args) {

        SpringApplication.run(Application.class, args);

    }

 

    @Override

    public Executor getAsyncExecutor() {

        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();

        executor.setCorePoolSize(2);

        executor.setMaxPoolSize(2);

        executor.setQueueCapacity(500);

        executor.setThreadNamePrefix("GithubLookup-");

        executor.initialize();

        return executor;

    }

 

}

  

通过@EnableAsync开启异步任务;并且配置AsyncConfigurerSupport,比如最大的线程池为2.

测试

测试代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

@Component

public class AppRunner implements CommandLineRunner {

 

    private static final Logger logger = LoggerFactory.getLogger(AppRunner.class);

 

    private final GitHubLookupService gitHubLookupService;

 

    public AppRunner(GitHubLookupService gitHubLookupService) {

        this.gitHubLookupService = gitHubLookupService;

    }

 

    @Override

    public void run(String... args) throws Exception {

        // Start the clock

        long start = System.currentTimeMillis();

 

        // Kick of multiple, asynchronous lookups

        Future<User> page1 = gitHubLookupService.findUser("PivotalSoftware");

        Future<User> page2 = gitHubLookupService.findUser("CloudFoundry");

        Future<User> page3 = gitHubLookupService.findUser("Spring-Projects");

 

        // Wait until they are all done

        while (!(page1.isDone() && page2.isDone() && page3.isDone())) {

            Thread.sleep(10); //10-millisecond pause between each check

        }

 

        // Print results, including elapsed time

        logger.info("Elapsed time: " + (System.currentTimeMillis() - start));

        logger.info("--> " + page1.get());

        logger.info("--> " + page2.get());

        logger.info("--> " + page3.get());

    }

 

}

  启动程序,控制台会打印:

1

2

3

2017-04-30 13:11:10.351 INFO 1511 — [ GithubLookup-1] com.forezp.service.GitHubLookupService : Looking up PivotalSoftware

2017-04-30 13:11:10.351 INFO 1511 — [ GithubLookup-2] com.forezp.service.GitHubLookupService : Looking up CloudFoundry

2017-04-30 13:11:13.144 INFO 1511 — [ GithubLookup-2] com.forezp.service.GitHubLookupService : Looking up Spring-Projects

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值