收到来自主题的消息后,骆驼路线无法异步工作

时间:2018-10-25 05:32:18

标签: spring apache-camel

我们有骆驼路线,它从主题中读取内容,然后对收到的消息进行一些转换。

鉴于其持久性主题,一次仅处理一条消息,直到路由完成其工作。

为了实现并发性,添加了线程池,因此一旦从主题接收到消息以进一步异步工作,线程就产生了,但是顺序出现了。就像一旦接收到消息一样,从池中选择线程并开始处理,直到该线程没有完成处理,下一条消息也不会被提取。

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camel="http://camel.apache.org/schema/spring"
    xmlns:broker="http://activemq.apache.org/schema/core" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://camel.apache.org/schema/spring
       http://camel.apache.org/schema/spring/camel-spring.xsd
       http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core-5.5.0.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-3.0.xsd">



    <bean id="threadPool" class="java.util.concurrent.Executors" factory-method="newFixedThreadPool">       
        <constructor-arg index="0" value="10"/>
    </bean>

    <camel:camelContext id="camel-etl" trace="true"
        xmlns="http://camel.apache.org/schema/spring">


        <route id="topicRoute" errorHandlerRef="deadLetterErrorHandler" >


            <from uri="{{inbound.topic}}"/>
            <camel:threads executorServiceRef="threadPool">
                <choice>
                    <when>
                        ...
                        ...
                        <multicast>
                            some loigc ...
                        </multicast>
                        <bean ref="persistData"/>
                    </when>
                    <when>
                         ...
                        ...
                        <multicast>
                            some loigc ...
                        </multicast>
                        <bean ref="persistData"/>
                    </when>
                    <when>
                         ...
                        ...
                        <multicast>
                            some loigc ...
                        </multicast>
                        <bean ref="persistData"/>
                    </when>
                    <when>
                          ...
                        ...
                        <multicast>
                            some loigc ...
                        </multicast>
                        <bean ref="persistData"/>
                    </when>
                     <when>
                          ...
                        ...
                        <multicast>
                            some loigc ...
                        </multicast>
                        <bean ref="persistData"/>
                    </when>
                    <when>
                         ...
                        ...
                        <multicast>
                            some loigc ...
                        </multicast>
                        <bean ref="persistData"/>
                    </when>
                    <when>
                          ...
                        ...
                        <multicast>
                            some loigc ...
                        </multicast>
                        <bean ref="persistData"/>
                    </when>
                    <when>
                          ...
                        ...
                        <multicast>
                            some loigc ...
                        </multicast>
                        <bean ref="persistData"/>
                    </when>
                    <when>
                          ...
                        ...
                        <multicast>
                            some loigc ...
                        </multicast>
                        <bean ref="persistData"/>
                    </when>
                    <when>
                         ...
                        ...
                        <multicast>
                            some loigc ...
                        </multicast>
                        <bean ref="persistData"/>
                    </when>
                    <otherwise>
                        ...
                        <bean ref="deadLetterErrorHandler"/>
                    </otherwise>
                </choice>
            </camel:threads>
        </route>



    </camel:camelContext>

    <!-- XSLT config -->

    <bean id="saxonFactory" class="net.sf.saxon.TransformerFactoryImpl"/>

    <!-- custom component beans -->

    <bean id="persistData" class="com.data.PersistBean"/>


</beans>

1 个答案:

答案 0 :(得分:1)

您需要在JMS端点上打开asyncConsumer。请参阅以下文档:https://github.com/apache/camel/blob/master/components/camel-jms/src/main/docs/jms-component.adoc