Spring Integration 2 с кварцевым планировщиком - PullRequest
3 голосов
/ 17 января 2012

Я новичок в Spring Integration.

Я настроил адаптер входящего канала для файла Spring, например,

<file:inbound-channel-adapter channel="channel1" directory="${location}" prevent-duplicates="true" filename-pattern="*.csv">
        <si:poller>
            <si:interval-trigger interval="1000"/>
        </si:poller>
</file:inbound-channel-adapter>

<si:service-activator input-channel="channel1" output-channel="channel2" ref="filenameGenerator" method="generate"/>

Теперь все работает нормально. Но это должно быть развернуто в кластерной среде. Я хочу убедиться, что несколько экземпляров в кластере не пытаются прочитать один и тот же файл. Так будет ли это работать в такой среде?

Если нет, могу ли я использовать планировщик Quartz следующим образом:

    <file:inbound-channel-adapter channel="channel1" directory="${location}" prevent-duplicates="true" filename-pattern="*.csv">
             <si:poller task-executor="taskExecutor" fixed-rate="1000"/>
    </file:inbound-channel-adapter>

    <si:service-activator input-channel="channel1" output-channel="channel2" ref="filenameGenerator" method="generate"/>

    <bean id="taskExecutor" class="org.springframework.scheduling.quartz.SimpleThreadPoolTaskExecutor">
        <property name="threadCount" value="20"/>
        <property name="threadNamePrefix" value="consumer"/>
    </bean>

Будет ли это работать и решить мою проблему? Или я должен использовать транзакцию?

Надеюсь, вопрос ясен.

Спасибо, Adi

Ответы [ 2 ]

2 голосов
/ 17 января 2012

Когда несколько процессов читают из одного каталога, это может быть желательно заблокировать файлы, чтобы предотвратить их подхват одновременно. Для этого вы можете использовать FileLocker

Ознакомьтесь с документацией по файловым шкафчикам здесь . Кажется, что вы можете сделать что-то вроде этого:

<file:inbound-channel-adapter ... >
  <file:nio-locker/>
</file:inbound-channel-adapter>

Когда несколько процессов читают из одного каталога, это может быть желательно заблокировать файлы, чтобы предотвратить их подхват одновременно. Для этого вы можете использовать FileLocker

1 голос
/ 02 августа 2014

Чтобы убедиться, что кварцевое задание выполняется в кластере один и только один раз, настройте постоянное кластерное расписание кварцевых заданий.Вот пример конфигурации для Quartz 1.6.6:

  <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <!--        Set whether any jobs defined on this SchedulerFactoryBean should
            overwrite existing job definitions.
      --> 
    <property name="overwriteExistingJobs" value="true" /> 
  <property name="dataSource" ref="myTransactionalDataSource" /> 

<!-- nonTransactionalDataSource is only necessary with clustered Quartz with an XA DataSource.  
  --> 
  <property name="nonTransactionalDataSource" ref="myNonTransactionalDataSource" /> 

 <property name="quartzProperties">
  <props>
  <prop key="org.quartz.jobStore.selectWithLockSQL">SELECT * FROM {0}LOCKS WITH(UPDLOCK,HOLDLOCK) WHERE LOCK_NAME = ?</prop> 
  <!-- 
    Run in cluster.  Quartz ensures persisted jobs are executed once within the 
                      cluster
  --> 
  <prop key="org.quartz.jobStore.isClustered">true</prop> 

 <!--   Each node in the cluster must have a unique instance id.  
  --> 
  <prop key="org.quartz.scheduler.instanceId">AUTO</prop> 
 <!--   Default clusterCheckinInterval is 15000 
  --> 
  <!--  <prop key="org.quartz.jobStore.clusterCheckinInterval">20000</prop> 
  --> 
 </props>
  </property>
  <property name="transactionManager" ref="transactionManager" /> 
- <!-- 
        In Quartz 1.6.6, Quartz's ThreadPool interface is used when firing job triggers, 
        in org.quartz.core.QuartzSchedulerThread. 
        Quartz 1.x still starts some unmanaged threads, notably org.quartz.impl.jdbcjobstore.JobStoreSupport's
        ClusterManager which is used when clustered=true. Quartz 2.0 should correct this problem.       
  --> 
  <property name="taskExecutor" ref="myTaskExecutor" /> 
  </bean>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...