【问题标题】:How to change poller frequency at runtime within a Http outbound gateway?如何在运行时更改 Http 出站网关中的轮询频率?
【发布时间】:2021-09-04 14:39:45
【问题描述】:

我的场景是一个 Http 出站网关,我在其中向外部服务请求由 TransferRequest 实体表示的下一个转换。网关是“httpOutRequest”通道的端点。 “httpOutRequest”通道的起点是一个 bean IntegrationFlow source(),我在其中发送一个由轮询器触发的空字符串消息。 (顺便说一句:这有必要吗?我可以将轮询器直接添加到出站网关吗?如何?)

然后我安装了 errorHandler 通道端点来捕获任何问题。如果问题(异常)的数量是MAX_COUNT_TO_REDUCE_POLLING - 假设是因为无法访问外部服务 - 那么我想在运行时将轮询从最初的 5_000 减少到 60_000。

到目前为止,这是我的代码:

    public static final int MAX_COUNT_TO_REDUCE_POLLING = 3;

    private long period = 5000;
    private int problemCounter = 0;

    @Bean
    public IntegrationFlow outbound() {
        return IntegrationFlows.from("httpOutRequest")
                .handle(Http.outboundGateway("http://localhost:8080/harry-potter-service/next/request")
                        .httpMethod(HttpMethod.GET)
                        .expectedResponseType(TransferRequest.class)
                        )
                .channel("reply")
                .get();
    }

    @Bean
    public IntegrationFlow source() {
        return IntegrationFlows.from(
                () -> new GenericMessage<String>(""),
                        e -> e.poller(p -> p.fixedRate(period)))
                .channel("httpOutRequest")
                .get();
    }

    @Bean
    @ServiceActivator(inputChannel = "reply")
    public MessageHandler handler() {
        return new MessageHandler() {
            @Override
            public void handleMessage(Message<?> message) throws MessagingException {
                System.out.println("myHandler: " + message.getPayload());
                System.out.println("myHandler: " + message.getHeaders());
                TransferRequest req = (TransferRequest) message.getPayload();
                System.out.println("myHandler: " + req);
            }
        };
    }

    @Bean
    @ServiceActivator(inputChannel = "errorChannel")
    public MessageHandler errorHandler() {
        return new MessageHandler() {
            @Override
            public void handleMessage(Message<?> message) throws MessagingException {
                LOG.error("message.payload: " + message.getPayload());
                MessageHandlingException e = (MessageHandlingException) message.getPayload();
                LOG.error("Exception: " + e);
                LOG.debug("exception counter = " + (++problemCounter));

                if (problemCounter >= MAX_COUNT_TO_REDUCE_POLLING) {
                    LOG.debug("would like to reduce poller frequence or stop");
                    period = 60_000;
                //  outbound().stop()
                }
            }
        };
    }

遇到异常数量阈值时,如何减少运行时的轮询频率?

我怎么能停止集成流程?

编辑 1

更具体:如果我有消息传递网关

@Bean
public IntegrationFlow source() {
    return IntegrationFlows.from(
            () -> new GenericMessage<String>(""),
                    e -> e.poller(p -> p.fixedRate(period)))
            .channel("httpOutRequest")
            .get();
}

如何在第二个 Lambda 中访问 p?

如何使用Control Channel 设置p.fixedRate

【问题讨论】:

    标签: java spring spring-integration spring-integration-http


    【解决方案1】:

    我可能已经自己解决了这个问题,阅读手册。

    请参阅here 以在运行时更改轮询率。为此,您必须使用 org.springframework.integration.util 包中的 DynamicPeriodiyTimer

    要替换您的延迟轮询器,请执行以下操作:

        private final DynamicPeriodicTrigger dynamicPeriodicTrigger =
                new DynamicPeriodicTrigger(5_000);
    
        @Bean
        public IntegrationFlow normalStateEntryPoint() {
            return IntegrationFlows.from(
                    () -> new GenericMessage<String>(""),
                            e -> e.poller(p -> p.trigger(dynamicPeriodicTrigger))
                            .id("normalStateSourcePollingChannelAdapter")
                            .autoStartup(true))
                    .channel("httpOutRequest")
                    .get();
        }
    

    要将轮询时间从 5.000 毫秒减少到 60.000 毫秒,请执行以下操作:

        dynamicPeriodicTrigger.setPeriod(60_000);
    

    就是这样。

    【讨论】:

    • 不,我不会说话,所以您需要根据此处的行为准则修改您的答案:stackoverflow.com/conduct。同时,您对能够在运行时更改周期的方法是正确的
    • 对不起。我认为在信用卡号码上加上星号可以防止滥用......这更多地违背了我的硬理解,而不是反对你!我会修改我的答案。非常感谢,阿尔特姆!我非常感谢你们在这里所做的一切。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多