Как использовать AMQP вместо JMS с верблюдом Apache?

StackOverflow https://stackoverflow.com/questions/4609854

  •  25-09-2019
  •  | 
  •  

Вопрос

Приветствую всех, что я использую JMS с следующей конфигурацией для отправки сообщений между Client & Server, и мне нужно заменить JMS с AMQP, и мне нужна некоторая руководство, поэтому, пожалуйста, сообщите:

Client-ApplicationContext.xml.

<?xml version="1.0" encoding="UTF-8"?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
        http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd
        http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
        http://activemq.apache.org/camel/schema/spring http://activemq.apache.org/camel/schema/spring/camel-spring-1.4.0.xsd
        http://cxf.apache.org/transports/camel http://cxf.apache.org/transports/camel.xsd">

    <import resource="classpath:META-INF/cxf/cxf.xml" />
    <import resource="classpath:META-INF/cxf/cxf-extension-http.xml" />
    <import resource="classpath:META-INF/cxf/cxf-extension-http-jetty.xml" />
    <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
    <import resource="classpath:META-INF/cxf/cxf-extension-camel.xml" />

    <!--  Directly defined ConnectionFactory  -->
    <bean id="jmsConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL" value="tcp://localhost:61616" />
    </bean>

    <!--  By defining a JmsComponent called jms you can use the JMS transport in routes
        You may define several of these components if you have different JMS servers for
        different services. They can be distinguished in the routes by their id 
    -->
    <bean id="jms" class="org.apache.camel.component.jms.JmsComponent">
        <property name="connectionFactory" ref="jmsConnectionFactory" />
        <property name="useMessageIDAsCorrelationID" value="true" />
    </bean>

    <!-- Add the camel transport to CXF. So you can define endpoint in the form camel://direct:<EndpointName>
         in cxf client and server endpoints. These endpoints are then available in camel 
         as direct:<EndpointName> -->
    <bean class="org.apache.camel.component.cxf.transport.CamelTransportFactory">
        <property name="bus" ref="cxf" />
        <property name="camelContext" ref="camelContext" />
        <property name="transportIds">
            <list>
                <value>http://cxf.apache.org/transports/camel</value>
            </list>
        </property>
    </bean>

    <!-- Define a cxf endpoint based on client stub generated from a wsdl.
        It is important to provide serviceName and endpointName so the wsdl is not needed
        at runtime. As far as I know the serviceName and endpointName do not have to have a special
        convention but it is good practice to use the service namespace and Service Interface name in the names
     -->
    <client id="CustomerService" xmlns="http://cxf.apache.org/jaxws" xmlns:customer="http://customerservice.example.com/"
        serviceName="customer:CustomerServiceService" endpointName="customer:CustomerServiceEndpoint"
        address="camel://direct:CustomerService" serviceClass="com.example.customerservice.CustomerService">
        <features>
            <!-- Enables logging of SOAP messages. -->
            <!-- <logging xmlns="http://cxf.apache.org/core" /> -->
        </features>
    </client>

    <!-- This context defines a route for each endpoint. For client endpoints you route from
        the cxf endpoint to the jms queue or topic. For servers you route from the jms queue or 
        topic to the cxf endpoint -->
    <camelContext id="camelContext" xmlns="http://activemq.apache.org/camel/schema/spring">
        <route>
            <from uri="direct:CustomerService" />
            <to uri="jms://queue:CustomerService" />
        </route>
    </camelContext>

</beans>

Server-ApplicationContext.xml.

<?xml version="1.0" encoding="UTF-8"?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
        http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd
        http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
        http://activemq.apache.org/camel/schema/spring http://activemq.apache.org/camel/schema/spring/camel-spring-1.4.0.xsd
        http://cxf.apache.org/transports/camel http://cxf.apache.org/transports/camel.xsd">

    <import resource="classpath:META-INF/cxf/cxf.xml" />
    <import resource="classpath:META-INF/cxf/cxf-extension-http.xml" />
    <import resource="classpath:META-INF/cxf/cxf-extension-http-jetty.xml" />
    <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
    <import resource="classpath:META-INF/cxf/cxf-extension-camel.xml" />

    <!--  Directly defined ConnectionFactory  -->
    <bean id="jmsConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL" value="tcp://localhost:61616" />
    </bean>

    <!--  By defining a JmsComponent called jms you can use the JMS transport in routes
        You may define several of these components if you have different JMS servers for
        different services. They can be distinguished in the routes by their id 
    -->
    <bean id="jms" class="org.apache.camel.component.jms.JmsComponent">
        <property name="connectionFactory" ref="jmsConnectionFactory" />
        <property name="useMessageIDAsCorrelationID" value="true" />
    </bean>

    <!-- Add the camel transport to CXF. So you can define endpoint in the form camel://direct:<EndpointName>
         in cxf client and server endpoints. These endpoints are then available in camel 
         as direct:<EndpointName> -->
    <bean class="org.apache.camel.component.cxf.transport.CamelTransportFactory">
        <property name="bus" ref="cxf" />
        <property name="camelContext" ref="camelContext" />
        <property name="transportIds">
            <list>
                <value>http://cxf.apache.org/transports/camel</value>
            </list>
        </property>
    </bean>

    <!-- Define a cxf endpoint based on client stub generated from a wsdl.
        It is important to provide serviceName and endpointName so the wsdl is not needed
        at runtime. As far as I know the serviceName and endpointName do not have to have a special
        convention but it is good practice to use the service namespace and Service Interface name in the names
     -->
    <endpoint 
        xmlns="http://cxf.apache.org/jaxws"
        xmlns:customer="http://customerservice.example.com/"
        id="CustomerService" 
        address="camel://direct:CustomerService" 
        serviceName="customer:CustomerServiceService"
        endpointName="customer:CustomerServiceEndpoint" 
        implementor="com.example.customerservice.impl.CustomerServiceImpl">
        <features>
            <!-- Enables logging of SOAP messages. -->
            <logging xmlns="http://cxf.apache.org/core" />
        </features>
    </endpoint>

    <!-- This context defines a route for each endpoint. For client endpoints you route from
        the cxf endpoint to the jms queue or topic. For servers you route from the jms queue or 
        topic to the cxf endpoint -->
    <camelContext id="camelContext" trace="true" xmlns="http://activemq.apache.org/camel/schema/spring">
        <route>
            <from uri="jms://queue:CustomerService" />
            <to uri="direct:CustomerService" />
        </route>
    </camelContext>
</beans>
Это было полезно?

Решение

вам просто нужно заменить

<!--  Directly defined ConnectionFactory  -->
<bean id="jmsConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
    <property name="brokerURL" value="tcp://localhost:61616" />
</bean>

<!--  By defining a JmsComponent called jms you can use the JMS transport in routes
    You may define several of these components if you have different JMS servers for
    different services. They can be distinguished in the routes by their id 
-->
<bean id="jms" class="org.apache.camel.component.jms.JmsComponent">
    <property name="connectionFactory" ref="jmsConnectionFactory" />
    <property name="useMessageIDAsCorrelationID" value="true" />
</bean>

С участием

<!--  Directly defined ConnectionFactory  -->
<bean id="jmsConnectionFactory" class="org.apache.qpid.client.AMQConnectionFactory">
    <constructor-arg index="0" type="java.lang.String" value="amqp://guest:guest@/test?brokerlist='vm://:1'" />
</bean>

<!--  By defining a JmsComponent called jms you can use the JMS transport in routes
    You may define several of these components if you have different JMS servers for
    different services. They can be distinguished in the routes by their id 
-->
<bean id="jms" class="org.apache.camel.component.jms.JmsComponent">
    <property name="connectionFactory" ref="jmsConnectionFactory" />
    <property name="useMessageIDAsCorrelationID" value="true" />
</bean>

`

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top