2

我对 JMS 和 Camel 是 100% 的新手

这是场景

我有一个 Spring Web 应用程序、一个 JMS (ActiveMQ)、Camel

Web 应用程序需要通过camel 以异步方式向JSM 发送信息。即向Camel发送信息后,网站不应等待响应。网页应该继续。

而且,我的应用程序应该在队列中监听队列中的任何响应。一旦收到任何响应,就必须调用特定的 bean。

这可能吗???

这是我客户端中的配置

骆驼语境:

<!-- START SNIPPET: e1 -->
<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"
       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">
  <!-- END SNIPPET: e1 -->

  <!-- START SNIPPET: e2 -->
  <camel:camelContext id="camel-client">
    <camel:template id="camelTemplate"/>
  </camel:camelContext>
  <!-- END SNIPPET: e2 -->

  <!-- START SNIPPET: e3 -->
  <!-- Camel JMSProducer to be able to send messages to a remote Active MQ server -->
  <bean id="jms" class="org.apache.activemq.camel.component.ActiveMQComponent">
    <property name="brokerURL" value="tcp://localhost:61610"/>
  </bean>
  <!-- END SNIPPET: e3 -->

</beans>

骆驼代码:

ApplicationContext context = new ClassPathXmlApplicationContext("camel-client.xml");

// get the camel template for Spring template style sending of messages (= producer)
ProducerTemplate camelTemplate = context.getBean("camelTemplate", ProducerTemplate.class);

System.out.println("Invoking the multiply with 22");
// as opposed to the CamelClientRemoting example we need to define the service URI in this java code
int response = (Integer)camelTemplate.sendBody("jms:queue:numbers", ExchangePattern.InOut, 22);
System.out.println("... the result is: " + response);

这工作得很好。但问题是,这是同步的。

我希望这是异步的。

怎么做

4

2 回答 2

0

您不需要在 Camel Remoting 示例中做所有这些事情(我怀疑您已经开始使用)。

因此,您想通过队列进行一些处理。只是为了不让我误解:

Web Request -> JMS queue -> Camel -> Bean -> Done

创建路线:

<camel:camelContext id="camel-client">
   <camel:template id="camelTemplate"/>
   <camel:route>
      <camel:from uri="jms:queue:myQueue"/>
      <camel:bean ref="someBean"/>
    </camel:route>
</camel:camelContext>

然后在您的代码中,只需触发消息:camelTemplate.asyncSendBody("jms:queue:myQueue", ExchangePattern.InOnly, someData);

于 2013-01-22T19:00:12.157 回答
0

答案很简单

int response = (Integer)camelTemplate.sendBody("jms:queue:numbers", ExchangePattern.InOut, 22);

这应该是

int response = (Integer)camelTemplate.sendBody("jms:queue:numbers",22);

只是不要提及ExchangePattern你就完成了。

道德:请正确阅读文档。

于 2013-07-23T11:36:52.013 回答