Използвам Spring Integration за анализ на XML файл и ще трябва да създам нишка (и всяка от тях има различна скорост) за всеки маркер.
Точно сега (с помощта на много потребители тук :)) мога да разделя XML по етикет и след това да го насоча към подходящия service-activator
.
Това работи чудесно, но не мога да пренасоча към канал, който създава "нишка" и след това да изпълни операциите. В момента имам следната конфигурация и в съзнанието си (че не знам дали е правилна...)
Split tag -> Route to the appropiate channel -> Start a thread(from tag configuration) -> Execute the operation
Това е действителната ми конфигурация, която разделя етикета и пренасочва към канала. Рутерът не трябва да пренасочва директно към канал, а да ги планира.
В първия случай ще бъде достатъчно да го пренасоча в пул с фиксирана скорост и по-късно ще използвам XPATH, за да получа атрибута и след това ще заменя тази "фиксирана" скорост с правилната стойност.
Опитах много решения за създаване на този поток, но всяко от тях се проваля или не се компилира :(
<context:component-scan base-package="it.mypkg" />
<si:channel id="rootChannel" />
<si-xml:xpath-splitter id="mySplitter" input-channel="rootChannel" output-channel="routerChannel" create-documents="true">
<si-xml:xpath-expression expression="//service" />
</si-xml:xpath-splitter>
<si-xml:xpath-router id="router" input-channel="routerChannel" evaluate-as-string="true">
<si-xml:xpath-expression expression="concat(name(./node()), 'Channel')" />
</si-xml:xpath-router>
<si:service-activator input-channel="serviceChannel" output-channel="endChannel">
<bean class="it.mypkg.Service" />
</si:service-activator>
АКТУАЛИЗАЦИЯ: Използвайки тази конфигурация за service
, това трябва да изпълнява задача на всеки 10 секунди (id=service1
) и на всеки 5 секунди другата (id=service2
). По същия начин мога да имам друг таг, който се управлява от друг клас (защото това ще има друго поведение)
<root>
<service id="service1" interval="10000" />
<service id="service2" interval="5000" />
<activity id="activity1" interval="50000" />
<root>
Ще имам клас (Service
), който е общ за обработка на сервизен етикет и това завършва някаква операция и след това „ми връща“ стойността, за да мога да пренасоча към друг канал.
public class Service {
public int execute() {
// Execute the task and return the value to continue the "chain"
}
}