Java Spring@Async注释不';不要创建新线程

Java Spring@Async注释不';不要创建新线程,java,spring,Java,Spring,我已经阅读了所有关于@Async问题的帖子,但即使我的代码完全正确,它似乎也不起作用 我使用以下方法作为弹簧的实施指南: 这是我的RestController类,带有@Autowired类声明 @RestController public class RTCEntitiesRESTController { @Autowired private RTCEntitiesProcessor rtcEntitiesProcessor; @RequestMapping(valu

我已经阅读了所有关于
@Async
问题的帖子,但即使我的代码完全正确,它似乎也不起作用

我使用以下方法作为弹簧的实施指南:

这是我的RestController类,带有
@Autowired
类声明

@RestController
public class RTCEntitiesRESTController {

    @Autowired
    private RTCEntitiesProcessor rtcEntitiesProcessor;

    @RequestMapping(value = "/refresh", method = RequestMethod.POST)
    public void refreshEntities() {
        rtcEntitiesProcessor.getStatus().start();
    }

    @RequestMapping(value = "/status", method = RequestMethod.GET)
    public @ResponseBody
    AbstractState getStatus() {
        return rtcEntitiesProcessor.getStatus();
    }

}

public class Ready extends AbstractState {

    private static final Logger LOGGER = LogManager.getLogger(Ready.class);

    @Override
    @Scheduled(fixedDelay = 600000)
    public void start() {
        context.setStatus(new InProgress());
        LOGGER.info("Starting process");
        LOGGER.info(Thread.currentThread().getName());
        context.processData();
    }

    @Override
    public String getStatus() {
        return "ready";
    }

}
这是
@组件

@Component
public class RTCEntitiesProcessor {

    private static final Logger LOGGER = LogManager.getLogger(RTCEntitiesProcessor.class);

    private RTCEntitiesController entitiesController;
    private List<RTCRoleDefinition> roleDefinitions;
    private List<RTCUser> users;
    private AbstractState status;
    @Value("${rtcServer.timeBetweenExecutionsInMinutes}")
    private long timeBetweenExecutions;

    public RTCEntitiesProcessor(RTCEntitiesController entitiesController) {
        this.entitiesController = entitiesController;
        this.roleDefinitions = new ArrayList<RTCRoleDefinition>();
        this.users = new ArrayList<RTCUser>();
        status = new Ready();
    }

    @PostConstruct
    public void passContext() {
        status.setContext(this);
    }

    @Async
    public void processData() {
        try {
            getNewEntities();
            LOGGER.info(Thread.currentThread().getName());
            Thread.sleep(10000);
            status.block();
        } catch (Exception e) {
            LOGGER.info("Error while processing entities", e);
            status.fail();
        }
    }

    private void getNewEntities() throws InterruptedException {
        List<RTCRoleDefinition> newRoleDefinitions = new ArrayList<RTCRoleDefinition>();
        List<RTCUser> newUsers = new ArrayList<RTCUser>();
        for (RTCProjectArea projectArea : entitiesController.getProjectAreas()) {
            projectArea.addAreas(entitiesController.getTeamAreas(projectArea));
            processArea(projectArea, null);
            newRoleDefinitions.addAll(projectArea.getRoles());
            newUsers = mergeUsers(newUsers, projectArea.getMembers());
            for (RTCTeamArea rtcTeamArea : projectArea.getAreas()) {
                newRoleDefinitions.addAll(rtcTeamArea.getRoles());
                newUsers = mergeUsers(newUsers, rtcTeamArea.getMembers());
            }
        }
        this.roleDefinitions = newRoleDefinitions;
        this.users = newUsers;
    }

请特别注意这样一个事实,
@Async
注释如果被
this
调用,则无法工作。因此,请尝试在您的
Ready
类中自动连接
RTCEntitiesProcessor
。为此,您应该将
准备好
作为
@组件


要了解您可以在

中阅读更多内容,您可以更具体地说明您的代码“拒绝工作”的原因吗?在
Ready
类中,
context
从何而来?日志可以帮助我们了解这一点如何适用于问题?此
public void passContext(){status.setContext(this);}
setup context处于就绪状态时未调用该方法调用。在该状态之后,调用set context的方法
context.processData()
@Andrey谢谢!!我通过给Read类一个对RTCEntitiesProcessor bean的引用来解决这个问题,然后给RTCEntitiesProcessor一个Ready bean的实例(带有惰性注释),现在它可以工作了。
@SpringBootApplication
@EnableAsync
@EnableScheduling
public class MainController {

    private static final Logger LOGGER = LogManager.getLogger(MainController.class);

    @Value("${rtcServer.username}")
    private String username;
    @Value("${rtcServer.password}")
    private String password;
    @Value("${rtcServer.uri}")
    private String serverURI;

    public static void main(String[] args) {
        LOGGER.info("Running Spring Boot Application");
        SpringApplication.run(MainController.class, args);
    }

    @Bean
    public RTCHttpClient getClient() {
        return new RTCHttpClient(username, password, serverURI);
    }

}