从现在开始我一直在与Camel合作,我真的很喜欢它的简单性。 在Java EE之上始终使用它一直是一个挑战,而我最近发表的有关如何做到这一点的演讲之一以及Java EE中引导Camel的不同方法实际上建议使用WildFly-Camel Subsystem 。 在正在进行的系列文章中,我将探索实现此目标的不同方法,并提供大量示例,而这些示例仍是演讲中所缺少的。 我很高兴在评论中或通过Twitter上的@myfear收到您的反馈和要求。
WildFly 8.2骆驼入门
Wildfly-Camel子系统提供了Apache Camel与WildFly Application Server的集成。 它允许您将骆驼路线添加为WildFly配置的一部分。 路由可以部署为Java EE应用程序的一部分。 Java EE组件可以访问Camel Core API和各种Camel Component API。 您的企业集成解决方案可以构造为Java EE和Camel功能的组合。
注意:WildFly-Camel的3.x版本预计将支持最新的WildFly 9。
准备好
将WildFly 8.2.0.Final下载并解压缩到您选择的文件夹中。 将wildfly-camel补丁 (2.3.0)下载并解压缩到wildfly文件夹。 从开始WildFly
bin/standalone[.bat|.sh] -c standalone-camel.xml
建立和运行最快的方法之一是使用Docker和WildFly Camel映像 。 该映像与WildFly 8.1和已安装的Camel子系统捆绑在一起。
定义和使用骆驼上下文
CamelContext表示单个Camel路由规则库。 您使用CamelContext的方式类似于Spring ApplicationContext的方式。 它包含您应用程序的所有路由。 您可以根据需要拥有任意数量的CamelContext,只要它们具有不同的名称即可。 WildFly-Camel让我们将它们定义为a)作为子系统定义本身的一部分在standalone-camel.xml和domain.xml中定义,以及b)或在包含-camel-context.xml后缀文件的受支持的部署工件中进行部署 c)可以通过RouteBilder和CDI集成与路由一起提供。
可以通过两种不同的方式使用已定义的CamelContext:a) 通过Camel-CDI @Injected注入或b)从JNDI树访问。
示例上下文和路由
对于以下示例,我将使用上下文以及通过CDI和RouteBuilder提供的关联路由。 它是一个应用程序范围的Bean,它随应用程序启动自动启动。 @ContextName批注为CamelContext提供了一个特定的名称。
@ApplicationScoped
@Startup
@ContextName("cdi-context")
public class HelloRouteBuilder extends RouteBuilder {@InjectHelloBean helloBean;@Overridepublic void configure() throws Exception {from("direct:start").transform(body().prepend(helloBean.sayHello()).append(" user."));}
}
路线本身并不完全具有挑战性。 它从direct:start中获取一个空的消息正文,并在CDI bean方法“ sayHello”的输出之前添加内容,并在字符串后附加“ user”。 对它。 作为参考,可以在我的GitHub帐户上找到完整的代码。 因此,接下来我们需要找出的是如何在各种Java EE组件规范中使用此路由。
从CDI使用骆驼
Camel从2.10版本开始支持CDI。 在子系统之前和之外,需要对其进行引导。 这不再是必须的,您只需在名称中简单地@Inject即可在@Named CDI bean中使用已部署或定义的CamelContext:
@Inject@ContextName("cdi-context")private CamelContext context;
在JSF,JAX-RS和EJB中使用骆驼
有了有关如何在CDI中使用CamelContext的知识,您将假定,很容易从JSF等中进行相同的操作。 这不是真的。 实际上,您不能将其注入绑定到JSF组件的ManagedBean甚至CDI Bean中。 另外,它在EJB中不起作用。 我没有详细研究它,但假定它与范围有关。 一个合理的解决方法,实际上是一个更好的应用程序设计,是将完整的Camel逻辑放入单独的CDI bean中,然后将其注入。
@Named
public class HelloCamel {@Inject@ContextName("cdi-context")private CamelContext context;private final static Logger LOGGER = Logger.getLogger(HelloCamel.class.getName());public String doSomeWorkFor(String name) {ProducerTemplate producer = context.createProducerTemplate();String result = producer.requestBody("direct:start", name, String.class);LOGGER.log(Level.INFO, result);return result;}
}
ProducerTemplate接口允许您以各种不同的方式将消息交换发送到端点,以使其易于使用Java代码处理Camel Endpoint实例。 在这种情况下,它只是开始路由,并在主体中放置一个String,它表示我正在使用它的组件的名称。
CDI Bean充当组件的后备bean,仅使用它:
@InjectHelloCamel helloCamel;public String getName() {return helloCamel.doSomeWorkFor("JSF");}
返回字符串为“ Hello JSF user”。 这也将写入WildFly服务器日志。 对于所有其他Java EE组件,最好使用相同的方法。
从EJB使用骆驼
如果您使用EJB作为man应用程序组件模型,那么仅使用JNDI方法也是非常合理的:
CamelContext camelctx = (CamelContext) inicxt.lookup("java:jboss/camel/context/cdi-context");
Hawtio –骆驼控制台
子系统中的另一个隐藏的宝石是Hawtio控制台的捆绑。 它是一个用于管理Java内容的模块化Web控制台,并具有一个Apache Camel插件,可可视化您的上下文和路由。 请记住,它是自动配置的安全性,您需要添加管理用户才能访问它。
进一步阅读和帮助
- 在Freenode上与开发人员交谈
- WildFly-Camel子系统文档
- GitHub上的WildFly Camel
- Apache Camel网站
翻译自: https://www.javacodegeeks.com/2015/07/using-camel-routes-in-java-ee-components.html