Как запланировать услугу, используя компонент Quartz, который будет периодически запускать загрузчик файлов?
Это расширение моего предыдущего вопроса. Как загрузить несколько файлов через REST через HTTP, используя Mule?, Требование гласит, что каждую среду в 10:00 должны быть загружены файлы. Отныне мне нужен планировщик для выполнения этого. И я обнаружил, что решением является входящий компонент "Кварц" с Cron Expression.
Но как я могу это сделать? Потому что я не могу иметь две "входящие конечные точки".(Кварц и файл), например
<flow name="fileUploader" doc:name="fileUploader">
<quartz:inbound-endpoint
jobName="myServiceJob"
repeatInterval="5000"
cronExpression="0 0 10 ? * WED
doc:name="Quartz">
<quartz:event-generator-job/>
</quartz:inbound-endpoint>
<file:inbound-endpoint
path="C:\input"
pollingFrequency="5000" moveToDirectory="C:\movehere" doc:name="File"
responseTimeout="10000"/>
<object-to-byte-array-transformer doc:name="Object to Byte Array"/>
<file:outbound-endpoint
path="C:\outputfile"
responseTimeout="10000"
doc:name="File"/>
</flow>
Если я бегу, я получаю ошибку
Исключение в потоке "main" org.mule.module.launcher.DeploymentInitException: SAXParseException: cvc-complex-type.2.4.a: обнаружен недопустимый контент, начиная с элемента 'file:inbound-endpoint'.
Так что же мне нужно изменить?
Пожалуйста помоги
4 ответа
Попробуй это
<file:endpoint name="fileConnector" path="C:\input" pollingFrequency="5000" doc:name="File"/>
<flow name="fileUploader" doc:name="fileUploader">
<quartz:inbound-endpoint
jobName="myServiceJob"
repeatInterval="5000"
cronExpression="0 0 10 ? * WED"
doc:name="Quartz">
<quartz:endpoint-polling-job>
<quartz:job-endpoint ref="fileConnector"/>
</quartz:endpoint-polling-job>
</quartz:inbound-endpoint>
<file:outbound-endpoint
path="C:\outputfile"
responseTimeout="10000"
outputPattern="#[message.inboundProperties.originalFilename]"
doc:name="File"/>
</flow>
У вас есть два варианта:
а. Замените входящую конечную точку файла компонентом, который обрабатывает обработку файла. Он будет вызван Quartz, заберет файл (ы) из папки и передаст его конечной точке.
б. Не используйте конечную точку Quartz и переопределите org.mule.transport.file.FileMessageReceiver для реализации своего пользовательского расписания для опроса файлов.
Первая альтернатива - более простая.
Следующий просто рабочий раунд, если вы не смогли найти именно то, что вам нужно.
1- У вас может быть 2 потока вместо одного: один для обычной работы с обычным входящим потоком и один для кварцевого: входящая конечная точка.
2. Вы можете сделать так, чтобы ваш планировщик помещал сообщения в очередь и имел другой поток для сбора сообщений из этой очереди и обработки.
3. У вас может быть компонент с кварцем: входящая конечная точка, как предложено здесь http://blogs.mulesoft.org/using-quartz-to-trigger-a-service/
Надеюсь, что один из вышеперечисленных помогает.
Извините, я не смог добавить это в качестве комментария, так как он слишком длинный, поэтому вот пример <quartz:endpoint-polling-job>
с сайта Mule:
<service name="testService5">
<description>
The endpoint polling Job will try and perform a 'request' on any Mule endpoint. If a result is received it will be handed off to this 'testService5' service for processing. The trigger will fire every 5 minutes starting at 2pm and ending at 2:55pm, every day. during this period the job will check the file directory /N/drop-data/in every 5 minutes to see if any event data is available. The request will timeout after 4 seconds if there are no files in the directory.
</description>
<inbound>
<quartz:inbound-endpoint name="qEP5" cronExpression="0 0/5 14 * * ?" jobName="job5"
connector-ref="quartzConnector1">
<quartz:endpoint-polling-job>
<quartz:job-endpoint address="file:///N/drop-data/in" timeout="4000"/>
</quartz:endpoint-polling-job>
</quartz:inbound-endpoint>
</inbound>
</service>
Надеюсь, что выше помогает