我在Karaf中使用Camel使用SCR来处理来自ActiveMQ的消息
版本:
当我将以下Camel路线部署到Karaf时,一切正常:
public
这是我的SCR Runner课程:
public class Requirements
{
public string EventMessageUId { get; set; }
public int ProjectId { get; set; }
public string CreatedByUser { get; set; }
public string CreatedByApp { get; set; }
public string CreatedOn { get; set; }
public Message message { get; set; }
}
public class Message
{
public string StoryID { get; set; }
public string StoryDesc { get; set; }
}
但是,如果我向routeBuilder添加errorHandler,那么事情就会失败。
这里添加了errorHandler的路径相同:
package com.test;
import org.apache.camel.builder.RouteBuilder;
public class TestRoute extends RouteBuilder {
@Override
public void configure() throws Exception {
from("activemq:queue:TEST.IN")
.routeId("test-route")
.log("Message picked up from IN queue");
}
}
会发生什么: - 在Karaf上安装捆绑包时出现以下错误:
2016-12-20 09:49:58,248 |错误| nsole用户karaf |路由器| 124 - com.test.router - 1.1.0.SNAPSHOT | [com.test.TestRunner(7)] activate方法抛出异常 java.lang.IllegalArgumentException:无法添加以前添加的组件:activemq at org.apache.camel.impl.DefaultCamelContext.addComponent(DefaultCamelContext.java:369) 在com.test.TestRunner.setupCamelContext(TestRunner.java:75)[124:com.test.router:1.1.0.SNAPSHOT] 在org.apache.camel.scr.AbstractCamelRunner.prepare(AbstractCamelRunner.java:90)[72:org.apache.camel.camel-scr:2.16.0] 在org.apache.camel.scr.AbstractCamelRunner.activate(AbstractCamelRunner.java:79)[72:org.apache.camel.camel-scr:2.16.0] ...
然后Camel路线没有部署在Karaf。
我会继续进行更多故障排除,但也许有人会更全面地了解这里出了什么问题
答案 0 :(得分:0)
在您自己的TestRunner
班级中,只有添加组件(如果尚未注册),您可以使用
if (context.hasComponent("activemq") != null) {
... add component
}
答案 1 :(得分:0)
最后我用以下hack解决了这个问题:如果组件已经存在,我首先将其删除然后再添加。
以下是代码:
// If activemq component already exists, remove it
// Note: This is a bit of a hack, but if we keep the one that is there
// Camel throws a security exception.
if (getContext().hasComponent("activemq") != null) {
getContext().removeComponent("activemq");
}
// Create the ActiveMQ Component
ActiveMQComponent activemq = ActiveMQComponent.activeMQComponent();
activemq.setConfiguration(consumerJmsConfig);
getContext().addComponent("activemq", activemq);
不漂亮,但是如果我不删除它并部署路由,camel会提供一个安全例外,几乎就像现有的组件一样,#34;丢失了#34;经纪人的凭证。
感谢克劳斯的帮助!