代码之家  ›  专栏  ›  技术社区  ›  IDeveloper

使用amq处理cxf请求

  •  0
  • IDeveloper  · 技术社区  · 7 年前

    我想提出这样一个解决方案:

    1. cxf https soap服务获取请求并将其发送到activemq队列 1.
    2. 服务实现从队列1获取消息,对其进行处理,然后 放入队列2
    3. 端点从队列2获取响应并发送 对客户端的响应

    现在,我提供了一种解决方案,但我不确定如何处理来自activemq的响应并作为SOAP响应发回。下面是我的骆驼蓝图。端点蓝图:

        <?xml version="1.0" encoding="UTF-8"?>
        <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0"
               xmlns:cxf="http://camel.apache.org/schema/blueprint/cxf"
               xmlns:soap="http://cxf.apache.org/blueprint/bindings/soap"
               xsi:schemaLocation="
                 http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
                 http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0 http://aries.apache.org/schemas/blueprint-cm/blueprint-cm-1.0.0.xsd
                 http://camel.apache.org/schema/blueprint/cxf http://camel.apache.org/schema/blueprint/cxf/camel-cxf.xsd
                 http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd
                 http://cxf.apache.org/blueprint/bindings/soap http://cxf.apache.org/schemas/configuration/blueprint/soap.xsd">
        <bean id="cardServiceEndpoint" class="com.endpoint.card.CardEndpoint">
            <argument>
                <reference interface="com.card.CardService" />
            </argument>
        </bean>
        <cxf:cxfEndpoint
            id="cardEndpoint" 
            address="https://host:port/soa/card"
            serviceClass="com.card.CardService">
            <cxf:properties>
                <entry key="schema-validation-enabled" value="true" />
            </cxf:properties>
        </cxf:cxfEndpoint>
        <bean id="jaxB" class="org.apache.camel.model.dataformat.JaxbDataFormat">
            <property name="prettyPrint" value="true" />
            <property name="contextPath" value="com.type.card" />
        </bean>
        <camelContext id="endpoint-card-cxf" xmlns="http://camel.apache.org/schema/blueprint">
            <route id="endpoint-soap-in">
                <from uri="cxf:bean:cardEndpoint"/>
                <transform>
                    <simple>${body[0]}</simple>
                </transform>
                <marshal ref="jaxB"/>
                <setHeader headerName="JMSType">
                    <simple>${headers.operationName}</simple>
                </setHeader>
                <to uri="amq:q.in"/>
            </route>
            <route id="endpoint-soap-out">
                <from uri="amq:q.out" />
                <unmarshal ref="jaxB" />
                <!-- STUCK HERE :( -->
            </route>
        </camelContext>
    </blueprint>
    

    服务处理器蓝图:

    <?xml version="1.0" encoding="UTF-8"?>
    <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0"
               xsi:schemaLocation="
                 http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
                 http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0 http://aries.apache.org/schemas/blueprint-cm/blueprint-cm-1.0.0.xsd
                 http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd">
        <bean id="cardService" class="com.card.impl.DefaultCardService">
            <argument>
                <reference interface="com.base.StashService"/>
            </argument>
        </bean>
        <service interface="com.card.CardService" ref="cardService" />
        <bean id="amqCardServiceEndpoint" class="com.card.endpoint.AmqCardEndpoint">
            <argument ref="cardService" />
        </bean>
        <bean id="jaxB" class="org.apache.camel.model.dataformat.JaxbDataFormat">
            <property name="prettyPrint" value="true" />
            <property name="contextPath" value="com.type.base:com.type.card" />
        </bean>
        <camelContext id="service-card-cx" xmlns="http://camel.apache.org/schema/blueprint">
            <route id="card-rq-broker">
                <from uri="amq:queue:q.in?asyncConsumer=true" />
                <unmarshal ref="jaxB" />
                <doTry>
                    <bean ref="amqCardServiceEndpoint" method="invoke" />
                    <doCatch>
                        <exception>com.type.base.BaseException</exception>
                        <setBody>
                            <simple>${exception.getFaultInfo()}</simple>
                        </setBody>
                    </doCatch>
                </doTry>
                <marshal ref="jaxB" />
                <to uri="amq:q.out" />
            </route>
        </camelContext>
    </blueprint>
    

    有什么帮助或建议吗?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Claus Ibsen    7 年前

    使用 jmsReplyTo 指定Camel用于侦听响应的应答队列的名称(如果需要固定的队列名称)。请参阅驼峰JMS文档中有关请求/回复的更多信息。

    <to uri="amq:q.in?jmsReplyTo=q.out"/>
    // continue here when reply is back