在Spring启动时从数据库中读取调度程序(固定延迟)

时间:2016-06-07 18:12:44

标签: spring-boot spring-batch

我正在开发一个弹簧启动项目,该项目使用弹簧批处理调度程序在2秒后读取数据并将其发送到消息代理(Activemq),该代理可以通过硬编码固定延迟正常工作。

但是,我现在试图从数据库中读取@Scheduled(fixedDelay)而不是硬编码,但看起来没有任何结果。我可以看到表达式包含10秒但调度程序没有启动

@Service
public class QuoteService implements ApplicationListener<BrokerAvailabilityEvent> {

    private static Log logger = LogFactory.getLog(QuoteService.class);

    private final MessageSendingOperations<String> messagingTemplate;

    private final StockQuoteGenerator quoteGenerator = new StockQuoteGenerator();

    private AtomicBoolean brokerAvailable = new AtomicBoolean();

    private ReadCronExpressionDataService readCronExpressionDataService;

    private int expression; 

    @Autowired
    public QuoteService(MessageSendingOperations<String> messagingTemplate,ReadCronExpressionDataService readCronExpressionDataService) {
        this.messagingTemplate = messagingTemplate;
         this.readCronExpressionDataService=readCronExpressionDataService;
         expression = readCronExpressionDataService.readData();
    }


    @Scheduled(fixedDelay=expression) //@Scheduled(fixedDelay=2000)
    public void sendQuotes() {
        for (Quote quote : this.quoteGenerator.generateQuotes()) {
            if (logger.isTraceEnabled()) {
                logger.trace("Sending quote " + quote);
            }
            if (this.brokerAvailable.get()) {
                this.messagingTemplate.convertAndSend("/topic/price.stock." + quote.getTicker(), quote);
            }
        }
    }


    private static class StockQuoteGenerator {

        private static final MathContext mathContext = new MathContext(2);

        private final Random random = new Random();

        private final Map<String, String> prices = new ConcurrentHashMap<>();


        public StockQuoteGenerator() {
            this.prices.put("CTXS", "24.30");
            this.prices.put("DELL", "13.03");
            this.prices.put("EMC", "24.13");
            this.prices.put("GOOG", "893.49");
            this.prices.put("MSFT", "34.21");
            this.prices.put("ORCL", "31.22");
            this.prices.put("RHT", "48.30");
            this.prices.put("VMW", "66.98");
        }

        public Set<Quote> generateQuotes() {
            Set<Quote> quotes = new HashSet<>();
            for (String ticker : this.prices.keySet()) {
                BigDecimal price = getPrice(ticker);
                quotes.add(new Quote(ticker, price));
            }
            return quotes;
        }

        private BigDecimal getPrice(String ticker) {
            BigDecimal seedPrice = new BigDecimal(this.prices.get(ticker), mathContext);
            double range = seedPrice.multiply(new BigDecimal(0.02)).doubleValue();
            BigDecimal priceChange = new BigDecimal(String.valueOf(this.random.nextDouble() * range), mathContext);
            return seedPrice.add(priceChange);
        }

    }

}

有什么想法吗?

0 个答案:

没有答案