为了账号安全,请及时绑定邮箱和手机立即绑定

@EnableScheduling 似乎不适用于 Java 1.7 代码

@EnableScheduling 似乎不适用于 Java 1.7 代码

茅侃侃 2022-05-21 20:00:32
我正在使用 Java 1.7 和 Spring 4.3.4.RELEASE在以下位置有一个属性文件:/opt/myapp.properties这仅包含以下条目:name = trueJava 代码@EnableScheduling@Controllerpublic class PropertiesUtil {    @Scheduled(fixedDelay = 10000)     public String getPropertyValue() throws IOException {        Properties properties = new Properties();        InputStreamReader in = null;        String value = null;        try {             in = new InputStreamReader(new FileInputStream("/opt/myapp/app.properties"), "UTF-8");             properties.load(in);             value =  properties.getProperty("name");             logger.info("\n\n\t\tName: " + value + "\n\n");        }         finally {            if (null != in) {                try {                    in.close();                }                 catch (IOException ex) {}            }        }        return value;    }}我的休息端点:@RestControllerpublic class PropertyController {    @RequestMapping(value="/checkProperty", method = RequestMethod.GET, produces = "application/json")    public ResponseEntity<Object> checkProperty() throws IOException {        PropertiesUtil propertiesUtil = new PropertiesUtil();        String value = propertiesUtil.getPropertyValue();        return new ResponseEntity<Object>("Check for Property", headers, HttpStatus.OK);    }}当我构建这个 mvn clean install 并将它部署为一个war文件时,我必须明确地点击我的休息端点才能让它工作(查看我的日志文件中的“name = true”)......我试图让 Spring Web App使用和注释/opt/myapp/app.properties每 10 秒检查一次文件。@EnableScheduling@Scheduled(fixedDelay = 10000)现在,我必须手动点击我的 Rest Endpoint 才能查看该属性的值。
查看完整描述

2 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

我认为你需要拆分你的方法。在计划中,它不必有回报。我的意思是它需要:


@Scheduled(fixedDelay = 10000) 

    public void getProperty(){

        String value = caculateValueFromProperties();

        //do something you want. Bellow my example.

        log.info("Value after calculate "+value);


    }

//拆分新方法


 public String caculateValueFromProperties() {

    Properties properties = new Properties();

            InputStreamReader in = null;

            String value = null;

            try {

                 in = new InputStreamReader(new FileInputStream("/opt/myapp/app.properties"), "UTF-8");

                 properties.load(in);

                 value =  properties.getProperty("name");

                 logger.info("\n\n\t\tName: " + value + "\n\n");

            } 

            finally {

                if (null != in) {

                    try {

                        in.close();

                    } 

                    catch (IOException ex) {}

                }

            }

            return value;

        }

使用 @Scheduled 注释的方法必须有 void 返回,并且不能有任何参数。这是因为它是周期性的,传递参数或接收返回值没有多大意义。


查看完整回答
反对 回复 2022-05-21
?
忽然笑

TA贡献1806条经验 获得超5个赞

通过创建一个 Spring Config 文件让它工作:


@Configuration

@EnableScheduling

public class PropertiesUtilConfig {


    @Bean

    public PropertiesUtil task() {

        return new PropertiesUtil();

    }


}

PropertiesUtil 不需要@EnableScheduling 注解,只需要@Controller:


@Controller

public class PropertiesUtil {


    @Scheduled(fixedDelay = 10000) 

    public String getPropertyValue() throws IOException { 

        // inline code

    }

}


查看完整回答
反对 回复 2022-05-21
  • 2 回答
  • 0 关注
  • 123 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信