使用Camel从WildFly 8向WebLogic 12发送JMS消息

系统集成是一个很好的挑战。 特别是当您在寻找通信标准和可靠的解决方案时。 在当今的微服务世界中,每个人都在谈论REST服务和基于http的协议。 实际上,对于大多数企业项目来说,这往往是远远不够的,而这些项目通常具有更复杂的要求。 合理的解决方案是基于Java消息服务的集成。 而且,尽管我们不再关注集中式基础架构和ESB,但我们希望为定义的服务提供基于点对点的集成。 让我们看看我们是否可以使其工作并在JBoss WildFly和Oracle WebLogic Server之间发送消息。

业务案例–从Java EE到微服务

情景

但我想先退一步:为什么要有人? 我认为,这种情况背后的主要动机之一是迁移路径缓慢。 从单一的单一平台应用程序一直到最后,我们希望具有足够的灵活性以将那些大型安装中的单个服务封装起来,并使它们作为服务可用。 假设这是可能的,并且旧版应用程序具有不错的设计。 或者我们想提高个性化服务,从技术角度来说。 在这个特定的示例中,我们迫不及待地想将Java EE 7功能引入我们的应用程序,而WebLogic仍然主要停留在EE 6上。我们可以使用REST服务甚至WebServices来做到这一点,但我们可能还需要更多。 这就是JMS规范的来源。

WildFly中的Oracle JMS客户端库

为了在两个不同的服务器之间发送消息,您需要将各个客户端库集成到发送端。 对于WebLogic,这是WebLogic JMS瘦客户端 (wljmsclient.jar)。 与WebLogic Install或Full客户端相比,使用较小的客户端资源提供了Java EE和WebLogic JMS功能,而与Thin T3客户端相比,其提供的客户端资源也较小。 实际上,它包含Java EE JMS API和实现,它们将直接与WildFly提供的实现发生冲突。 要使用它们,我们必须将它们打包为一个模块,并在HornetQ中配置一个JMS Bridge来使用它。 首先是添加新模块。 将文件夹更改为wildfly-8.2.0.Final \ modules \ system \ layers \ base并创建一个新的文件夹结构:custom \ oracle \ weblogic \ main在其下方。 从此处的%MW_HOME%\ server \ lib文件夹复制wlthint3client.jar。 现在,您必须添加一个模块描述符文件,module.xml:

<module xmlns="urn:jboss:module:2.0" name="custom.oracle.weblogic"><resources><resource-root path="wlthint3client.jar"><filter><exclude-set><path name="javax.ejb"/><path name="javax.ejb.spi"/><path name="javax.transaction"/><path name="javax.jms"/><path name="javax.xml"/><path name="javax.xml.stream"/></exclude-set></filter></resource-root></resources><dependencies><module name="javax.api"/><module name="sun.jdk" export="false" services="import"><exports><include-set><path name="sun/security/acl"/><path name="META-INF/services"/></include-set></exports></module><module name="com.sun.xml.bind" /><module name="org.omg.api"/><module name="javax.ejb.api" export="false"   /><module name="javax.transaction.api"  export="false" /><module name="javax.jms.api"  export="false" /><module name="javax.xml.stream.api" export="false"  /><module name="org.picketbox" optional="true"/><module name="javax.servlet.api" optional="true"/><module name="org.jboss.logging" optional="true"/><module name="org.jboss.as.web" optional="true"/><module name="org.jboss.as.ejb3" optional="true"/><module name="org.hornetq" /></dependencies>
</module>

该文件定义了所有必需的资源和依赖项以及相关的排除项。 如果完成了,我们最终需要消息桥。

HornetQ JMS消息桥

JMS桥的功能是使用来自源JMS目标的消息,并将其发送到目标JMS目标。 通常,源或目标目标位于不同的服务器上。 只要它们兼容JMS 1.1,该桥接器还可用于桥接来自其他非HornetQ JMS服务器的消息。 打开standalone-full.xml并将以下配置添加到消息传递子系统:

<jms-bridge name="wls-bridge" module="custom.oracle.weblogic"><source><connection-factory name="java:/ConnectionFactory"/><destination name="java:/jms/sourceQ"/></source><target><connection-factory name="jms/WFMessagesCF"/><destination name="jms/WFMessages"/><context><property key="java.naming.factory.initial"value="weblogic.jndi.WLInitialContextFactory"/><property key="java.naming.provider.url" value="t3://127.0.0.1:7001"/></context></target><quality-of-service>AT_MOST_ONCE</quality-of-service><failure-retry-interval>2000</failure-retry-interval><max-retries>10</max-retries><max-batch-size>500</max-batch-size><max-batch-time>500</max-batch-time><add-messageID-in-header>true</add-messageID-in-header></jms-bridge>

如您所见,它直接引用模块,并具有源和目标定义。 源是在消息收发子系统中定义的WildFly本地消息队列:

<jms-queue name="sourceQ"><entry name="java:/jms/sourceQ"/></jms-queue>

而目标是在WebLogic Server中定义的远程队列以及连接工厂。 我假设您知道该怎么做,否则请参阅本文档 。 就是这样。 现在,我们需要向本地队列发送一条消息,而该消息将通过网桥发送到WebLogic队列。

测试桥–使用骆驼

将消息驱动的bean部署到WebLogic(是的,您必须将其作为ejb jar打包到耳朵中,所有这些)。 这个特定的示例只是将消息文本转储到记录器中。

@MessageDriven(mappedName = "jms/WFMessages", activationConfig = {@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
})public class LogMessageBean implements MessageListener {private final static Logger LOGGER = Logger.getLogger(LogMessageBean.class.getName());public LogMessageBean() {}@Overridepublic void onMessage(Message message) {TextMessage text = (TextMessage) message;try {LOGGER.log(Level.INFO, text.getText());} catch (JMSException jmxe) {LOGGER.log(Level.SEVERE, jmxe.getMessage());}}
}

现在,我们需要WildFly服务器上的生产者。 这样做,我实际上是在使用WildFly-Camel JMS集成 。

@Startup
@ApplicationScoped
@ContextName("jms-camel-context")
public class JMSRouteBuilder extends RouteBuilder {@Overridepublic void configure() throws Exception {// Initial Context LookupContext ic = new InitialContext();ConnectionFactory cf = (ConnectionFactory) ic.lookup("/ConnectionFactory");// Create the JMS ComponentJmsComponent component = new JmsComponent();component.setConnectionFactory(cf);getContext().addComponent("jms", component);// Build A JSON GreetingJsonObject text = Json.createObjectBuilder().add("Greeting", "From WildFly 8").build();// Send a Message from timer to Queuefrom("timer://sendJMSMessage?fixedRate=true.=10000").transform(constant(text.toString())).to("jms:queue:sourceQ").log("JMS Message sent");}
}

这就是整个魔术。 计时器将JSON文本消息发送到本地队列,该消息将桥接到WebLogic。

消息传递

更多提示

如果要在没有网桥的情况下测试WebLogic队列,则必须将wljmsclient包含到您的项目中。 由于这在Maven存储库(AFAIK)中不可用,因此您可以简单地在本地安装它:

mvn install:install-file -Dfile=%MW_HOME%/wlserver/server/lib/wlthint3client.jar -DgeneratePom=true -DgroupId=custom.com.oracle -DartifactId=wlthint3client -Dversion=12.1.3 -Dpackaging=jar

另一个重要的事情是,如果您尝试在桥以外的其他范围内使用自定义模块,则会在WildFly上遇到类加载问题。 因此,请密切注意,不要在其他地方使用它。

该网桥配置了较大的故障重试间隔和最大重试次数。 这是一种解决方法。 如果WildFly启动太快,并且网桥在实际配置队列之前尝试访问本地sourceQ,则会导致异常。

  • 在我的GitHub帐户中找到完整的源代码 。

翻译自: https://www.javacodegeeks.com/2015/07/sending-jms-messages-from-wildfly-8-to-weblogic-12-with-camel.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/357852.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【APICloud系列|28】 UIChatBox 模块(聊天输入框)的实现

导读:UIChatBox 模块是一个聊天输入框模块,开发者可自定义该输入框的功能 项目结构: config.xml <?xml version="1.0" encoding="UTF-8"?><widget id="A6909001303255" version="0.0.1"> <name>UIChatbox<…

mysql索引参数_MySQL索引介绍

索引由数据库表中一列或者多列组合而成&#xff0c;其作用是提高对表中数据的查询速度。创建索引是指在某个表的一列或者多列上建立一个索引&#xff0c;用来提高对表的访问速度&#xff0c;创建索引由三种方法&#xff1a;在创建表的时候创建&#xff0c;在已存在的表上创建和…

【APICloud系列|31】百度导航功能的实现

导读:百度导航基础功能。d用到了bMap模块,baiduNavigation模块,UIListView模块。样式完全来自AUI。js用到了zepto.j 效果图: 项目结构: index.html <!doctype html> <html> <head><meta charset="utf-8"><meta name="viewport…

osgi简介_OSGi:简介

osgi简介为基于Java的系统创建的OSGi提供了模块化系统的框架。 OSGi使得可以定义每个单独模块与其他模块的依赖关系&#xff0c;并使用户能够控制生命周期并动态更改系统的每个组件。 OSGi是一个规范&#xff0c;最常见的实现可以算作Equinox &#xff0c; Apache Felix和Knopl…

GC基本算法及C++GC机制

前言 垃圾收集器是一种动态存储分配器&#xff0c;它自动释放程序不再需要的已分配的块&#xff0c;这些块也称为垃圾。在程序员看来&#xff0c;垃圾就是不再被引用的对象。自动回收垃圾的过程则称为垃圾收集&#xff08;garbage collection&#xff09;。在一个支持垃圾收集的…

【APICloud系列|32】 aMapNavigation高德地图导航的实现

导读:aMapNavigation 模块封装了高德导航的sdk,支持语音导航功能。用户可自行算路策略类型。开发者只需输入起点终点经纬度即可轻松集成高德导航功能,本模块是由第三方模块开发者提供,使用本模块需在线云编译安装包。 效果图: 项目结构: index.html <!doctype html&…

JDK 9早期版本安装后的Windows注册表清理

在我的上一篇博文中 &#xff0c;我演示了在安装早期版本的JDK 9&#xff08;内部版本68&#xff09;之后围绕Oracle Java符号链接 &#xff08;基于Windows的计算机上的C:\ProgramData\Oracle\Java\javapath\目录&#xff09;的问题的解决方案。这似乎阻止了早期&#xff08;更…

java实现网上招标系统

导读:本设计尝试用JSP在网络上架构一个下沙派威客网,以推进网站无纸化,过程电子化,管理智能化的发展。本文从理论和实践两个角度出发,对一个具有数据分析功能的下沙派威客网进行设计与实现分析。论文首先较为详尽地介绍了面向对象分析与设计的有关概念与技术,特别深入介绍…

java实现俄罗斯方块项目

导读:俄罗斯方块项目,基本功能包括:游戏主界面显示模块、方块及数据显示模块、方块移动控制模块、游戏界面颜色控制模块、游戏进度、等级控制模块等。本项目结构如下: (1)游戏主界面显示模块: 显示游戏和帮助两个菜单; 游戏使用功能键盘,得分 等级; (2)画布…

js数组操作大全

shift:删除原数组第一项&#xff0c;并返回删除元素的值&#xff1b;如果数组为空则返回undefined Javascript代码 var a [1,2,3,4,5]; var b a.shift(); //a:[2,3,4,5] b:1 unshift:将参数添加到原数组开头&#xff0c;并返回数组的长度 Javascript代码 var a [1,2,…

mysql与mssql中datetime类型字段问题_excel数据存入sqlserver过程中,遇到Datetime的格式问题。...

先讲一下我实现的大致思路&#xff1a; 1 读取excel数据&#xff0c;赋值到datatable中&#xff0c;然后在页面上显示 细节描述&#xff1a;有一些列是存到数据库时要是datetime格式的&#xff0c;我在赋值到datatable时也是做 如下处理的 DataColumn dtColumn new DataColumn…

java实现即时通讯软件

导读:即时通讯软件即所谓的聊天工具,其主要用途是用于文字信息的传递与文件传输。使用eclipse作为即时通讯软件的开发工具,使用Socket建立通讯渠道,多线程实现多台计算机同时进行信息的传递,swing技术等进行实际开发相对比较合适。通过一些轻松的注册登录后,在局域网中即…

两种类型的Spark RDD task解析以及iterator解析 -- (视频笔记)

spark 每次提交一个作业&#xff0c;都会划分成不同的stage&#xff0c;除了最后一个stage&#xff08;shuffle map task&#xff09;&#xff0c;前边的stage属于一种类型&#xff08;result task&#xff09;。 spark中的job&#xff0c;内部是由具体task构成&#xff0c;由于…

JBoss BRMS复杂事件处理(CEP)性能基准

技术来了又去&#xff0c;但是一件事保持不变。 在设计企业解决方案时&#xff0c;我们喜欢使我们的生活更轻松的复杂组件&#xff0c;并且作为建筑师和开发人员&#xff0c;我们一直在寻找使我们的生活更轻松的方法。 一种方法是跟上与感兴趣的技术有关的流行新站点。 另一种…

Hey,孙叫兽的2020 CSDN年度报告已出炉,请查收!

导读&#xff1a;最近经常看到朋友圈有人分享自己2020年在常用平台的年度报告&#xff1a; 有的人分享了这一年来听了多少首歌&#xff0c;最喜爱听的歌是什么&#xff1b; 有的人分享了这一年来消费了多少钱&#xff0c;最喜欢购买的产品类型是什么&#xff1b; 有的人分享了这…

java实现儿时的超级玛丽游戏

导读:近年来,Java作为一种新的编程语言,以其简单性、可移植性和平台无关性等优点,得到了广泛地应用。J2SE称为Java标准版或Java标准平台。J2SE提供了标准的SDK开发平台。利用该平台可以开发Java桌面应用程序和低端的服务器应用程序,也可以开发Java Applet程序。 “超级玛丽…

MongoDB实战指南(二):索引与查询优化

数据库保存记录的机制是建立在文件系统上的&#xff0c;索引也是以文件的形式存储在磁盘上&#xff0c;在数据库中用到最多的索引结构就是B树。尽管索引在数据库领域是不可缺少的&#xff0c;但是对一个表建立过多的索引会带来一些问题&#xff0c;索引的建立要花费系统时间&am…

mysql学生选课系统的关系模型_使用PowerDesigner搭建学生选课管理系统(学生老师管理员一体系结构)由基础设计至数据库生成(SQL语句源代码的生成)全过程实例操作...

思考构图大小及范围首先&#xff0c;我们大致的写出要建的几张表&#xff0c;并自定义其Code(所谓Code其实就是自定义一个字段名&#xff0c;因为SQL语句不能由中文)我们可以将不同的表按照不同的类型分开&#xff0c;这样一个类型的表可以一起建并且相互之间的关系不会弄混制作…

java实现飞机大战游戏

导读:现如今,随着智能手机的兴起与普及,加上5G(the 5th Generation mobile communication ,第5代移动通信技术)网络的深入,越来越多的IT行业开始向手机行业转移重心。而手机行业中游戏方面的利润所占比重较大,并且手机游戏大多数则是由Java语言开发研制的。所以我想顺应…

merge语句使用_使用SQL:2003 MERGE语句的奥术魔术

merge语句使用时不时地&#xff0c;由于以下任何原因&#xff0c;我们不得不将INSERT与UPDATE区分开来感到尴尬&#xff1a; 我们必须至少发表两个声明 我们必须考虑性能 我们必须考虑比赛条件 我们必须在[UPDATE; 如果UPDATE_COUNT 0 THEN INSERT]和[INSERT; 如果例外然后…