查网站备案,怎样将建设银行网站加入可信站,建网站 开发app,seo点击排名工具系统集成是一个很好的挑战。 特别是当您在寻找通信标准和可靠的解决方案时。 在当今的微服务世界中#xff0c;每个人都在谈论REST服务和基于http的协议。 实际上#xff0c;对于大多数企业项目来说#xff0c;这往往是远远不够的#xff0c;而这些项目通常具有更复杂的要求… 系统集成是一个很好的挑战。 特别是当您在寻找通信标准和可靠的解决方案时。 在当今的微服务世界中每个人都在谈论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 xmlnsurn:jboss:module:2.0 namecustom.oracle.weblogicresourcesresource-root pathwlthint3client.jarfilterexclude-setpath namejavax.ejb/path namejavax.ejb.spi/path namejavax.transaction/path namejavax.jms/path namejavax.xml/path namejavax.xml.stream//exclude-set/filter/resource-root/resourcesdependenciesmodule namejavax.api/module namesun.jdk exportfalse servicesimportexportsinclude-setpath namesun/security/acl/path nameMETA-INF/services//include-set/exports/modulemodule namecom.sun.xml.bind /module nameorg.omg.api/module namejavax.ejb.api exportfalse /module namejavax.transaction.api exportfalse /module namejavax.jms.api exportfalse /module namejavax.xml.stream.api exportfalse /module nameorg.picketbox optionaltrue/module namejavax.servlet.api optionaltrue/module nameorg.jboss.logging optionaltrue/module nameorg.jboss.as.web optionaltrue/module nameorg.jboss.as.ejb3 optionaltrue/module nameorg.hornetq //dependencies
/module 该文件定义了所有必需的资源和依赖项以及相关的排除项。 如果完成了我们最终需要消息桥。 HornetQ JMS消息桥 JMS桥的功能是使用来自源JMS目标的消息并将其发送到目标JMS目标。 通常源或目标目标位于不同的服务器上。 只要它们兼容JMS 1.1该桥接器还可用于桥接来自其他非HornetQ JMS服务器的消息。 打开standalone-full.xml并将以下配置添加到消息传递子系统 jms-bridge namewls-bridge modulecustom.oracle.weblogicsourceconnection-factory namejava:/ConnectionFactory/destination namejava:/jms/sourceQ//sourcetargetconnection-factory namejms/WFMessagesCF/destination namejms/WFMessages/contextproperty keyjava.naming.factory.initialvalueweblogic.jndi.WLInitialContextFactory/property keyjava.naming.provider.url valuet3://127.0.0.1:7001//context/targetquality-of-serviceAT_MOST_ONCE/quality-of-servicefailure-retry-interval2000/failure-retry-intervalmax-retries10/max-retriesmax-batch-size500/max-batch-sizemax-batch-time500/max-batch-timeadd-messageID-in-headertrue/add-messageID-in-header/jms-bridge 如您所见它直接引用模块并具有源和目标定义。 源是在消息收发子系统中定义的WildFly本地消息队列 jms-queue namesourceQentry namejava:/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?fixedRatetrue.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 -DgeneratePomtrue -DgroupIdcustom.com.oracle -DartifactIdwlthint3client -Dversion12.1.3 -Dpackagingjar 另一个重要的事情是如果您尝试在桥以外的其他范围内使用自定义模块则会在WildFly上遇到类加载问题。 因此请密切注意不要在其他地方使用它。 该网桥配置了较大的故障重试间隔和最大重试次数。 这是一种解决方法。 如果WildFly启动太快并且网桥在实际配置队列之前尝试访问本地sourceQ则会导致异常。 在我的GitHub帐户中找到完整的源代码 。 翻译自: https://www.javacodegeeks.com/2015/07/sending-jms-messages-from-wildfly-8-to-weblogic-12-with-camel.html