2016-03-30 5 views
1

опрос динамическиконфигурация динамической задержки весны Poller

Я использую Poller компонент от интеграции опрашивать файлы из s3.The фиксированной задержки 15 мин и максимальная скорость сообщения 1 .Отель причины я сделал это в вниз по течению сообщения в xd засорялись, так как я использую http.Now, это файл для файла записей 100k, но когда размер файла мал, я все еще жду 15 минут, хотя я могу быстро обрабатывать. Теперь есть какой-либо способ динамически установить задержку в зависимости от размера файла .Потому что мы не знаем, какие файлы будут опроса также знать это? В зависимости от размера файла я заберу или количество записей, мы можем динамически изменять фиксированную задержку или фиксированную ставку?

<int:poller fixed-delay="${fixedDelay}" default="true" max-messages-per-poll="${maxMessageRate}"> 
     <int:advice-chain> 
      <ref bean="pollAdvise"/> 

     </int:advice-chain> 
    </int:poller> 


<bean id="pollAdvise" class="org.springframework.integration.scheduling.PollSkipAdvice"> 
    <constructor-arg ref="healthCheckStrategy"/> 

</bean> 

<bean id="healthCheckStrategy" class="test.ServiceHealthCheckPollSkipStrategy"> 
    <property name="url" value="${url}"/> 
    <property name="doHealthCheck" value="${doHealthCheck}"/> 
</bean> 



<bean id="credentials" class="org.springframework.integration.aws.core.BasicAWSCredentials"> 
    <property name="accessKey" value="${accessKey}"/> 
    <property name="secretKey" value="${secretKey}"/> 
</bean> 



<bean id="clientConfiguration" class="com.amazonaws.ClientConfiguration"> 
    <property name="proxyHost" value="${proxyHost}"/> 
    <property name="proxyPort" value="${proxyPort}"/> 
    <property name="preemptiveBasicProxyAuth" value="false"/> 
</bean> 


<bean id="s3Operations" class="org.springframework.integration.aws.s3.core.CustomC1AmazonS3Operations"> 
    <constructor-arg index="0" ref="credentials"/> 
    <constructor-arg index="1" ref="clientConfiguration"/> 
    <property name="awsEndpoint" value="s3.amazonaws.com"/> 
    <property name="temporaryDirectory" value="${temporaryDirectory}"/> 
    <property name="awsSecurityKey" value="${awsSecurityKey}"/> 
</bean> 



<!-- aws-endpoint="https://s3.amazonaws.com" --> 
<int-aws:s3-inbound-channel-adapter aws-endpoint="s3.amazonaws.com" 
            bucket="${bucket}" 
            s3-operations="s3Operations" 
            credentials-ref="credentials" 
            file-name-wildcard="${fileNameWildcard}" 
            remote-directory="${remoteDirectory}" 
            channel="splitChannel" 
            local-directory="${localDirectory}" 
            accept-sub-folders="false" 
            delete-source-files="true" 
            archive-bucket="${archiveBucket}" 
            archive-directory="${archiveDirectory}"> 
</int-aws:s3-inbound-channel-adapter> 

<int-file:splitter id="s3splitter" input-channel="splitChannel" output-channel="bridge" markers="false" charset="UTF-8"> 

    <int-file:request-handler-advice-chain> 
     <bean class="org.springframework.integration.handler.advice.ExpressionEvaluatingRequestHandlerAdvice"> 
      <property name="onSuccessExpression" value="payload.delete()"/> 
     </bean> 
    </int-file:request-handler-advice-chain> 

</int-file:splitter> 

ответ

1

Начиная с весны интеграции 4.2 AbstractMessageSourceAdvice было introduced:

Этот метод вызывается после метода приема(); снова вы можете перенастроить источник или предпринять какие-либо действия, возможно, в зависимости от результата (который может быть пустым, если не было сообщения, созданного источником). Вы даже можете вернуть другое сообщение!

Начиная с версии 4.3 мы вводим CompoundTriggerAdvice: http://docs.spring.io/spring-integration/docs/4.3.0.BUILD-SNAPSHOT/reference/html/messaging-channels-section.html#_compoundtriggeradvice

Что вы можете использовать для вашего сценария использования на основе payload размера.

+0

Предположим, что есть 3 файла a.file 100 mb b.file 1 mb и c.file 10 mb. Я думаю, что poller потянет его случайным образом? Я хочу, чтобы a.file имел фиксированную задержку в 10 минут файла b 1 мин и файл c 5 мин – constantlearner

+0

Mmm. Это не имеет значения. Вы хотите изменить следующее время опроса в текущем сообщении. Это все, что вы можете сделать в 'AbstractMessageSourceAdvice.afterReceive()' impl и использовать 'DynamicPeriodicTrigger' для изменения своего' period' на основе размера файла. –

+0

Спасибо, попробуем это – constantlearner

Смежные вопросы