2013-04-30 119 views
0

我想在两个servlet之间建立简单的VM队列测试,但没有成功。问题在于请求总是超时,因为在预期的时间范围内没有响应,OUT消息。Servlet之间的Apache骆驼VM队列

“org.apache.camel.ExchangeTimedOutException:在30000毫秒内未收到OUT消息。”

servlet在Tomcat中运行并且都部署Apache Camel。这两款应用都定义了骆驼上下文和简单路由。基本设置应罚款像下面这个简单的路由工作:

<route> 
    <from uri="servlet:///hello?servletName=app1" /> 
    <transform> 
     <simple>Hello world</simple> 
    </transform> 
</route> 

<route> 
    <from uri="servlet:///hello?servletName=app2" /> 
    <transform> 
     <simple>Hello world</simple> 
    </transform> 
</route> 

首先我不知道如果消息没有到达APP2一样timout是即使请求的路径不会甚至定义(app2将缺少虚拟机路由)。所以问题可能在于如何使用VM队列定义两个servlet之间的路由。

如果servlet之间的路由没问题,那么问题应该在丢失/不正确的答复中。我明白,接收端应该返回的答复,因为从Web服务器的传入请求是inOut类型,但我不知道如何实现这一点。

接收网络请求APP1路线:

<route> 
    <from uri="servlet:///test?servletName=app1" /> 
    <to uri="vm:test"> 
</route> 

和servlet的APP 2的另一端:

<route> 
    <from uri="vm:test" /> 
// Tested here: output with <simple>, 'To', 'inOut'... the result is always timeout 
</route> 

由于我是新与Apache骆驼的根本原因很可能是非常简单。任何帮助将不胜感激。

问题很简单,如何在两个servlet应用程序之间设置VM队列?

回答

1

VM元件在同一类作品,如还挺就是我们说的虚拟机文件页面上:http://camel.apache.org/vm.html

该组件在该VM SEDA成分不同支持跨CamelContext实例 通信 - 让你可以使用此 机制跨Web应用程序进行通信(前提是 camel-core.jar位于系统/ boot类路径中)。

因此,如果您使用Apache Tomcat,则需要将camel-core JAR作为共享JAR。比如在某个地方的启动类路径中。

+0

我完全错过了骆驼核心JAR需要共享的部分。现在我需要弄清楚如何在没有嵌入骆驼内核的情况下打包.war,而是使用共享的。完成所有工作后,我会在此更新结果。谢谢克劳斯。 – Laowai 2013-05-01 04:20:33

+0

现在的问题是,如果我只将camel-core移动到Tomcat共享库文件夹中,servlet将停止工作,因为显然有一些与日志依赖关系有关的类加载器冲突。如果我还在共享库下移动日志依赖项(来自Maven Apache camel模板的标准依赖项),则会出现另一个类加载器相关的链接错误。我真的需要弄清楚哪些JAR要移动到共享文件夹,还是有一些已知的软件包必须与骆驼内核或其他方式相匹配?将骆驼内核设置为共享JAR的最佳实践是什么? – Laowai 2013-05-01 12:01:51

+0

通过正确配置日志记录并重新启动Tomcat解决了依赖关系的问题。 – Laowai 2013-05-03 06:11:07