camel 使用_使用Camel从WildFly 8向WebLogic 12发送JMS消息
camel 使用
系統(tǒng)集成是一個很好的挑戰(zhàn)。 特別是當(dāng)您在尋找通信標(biāo)準(zhǔn)和可靠的解決方案時。 在當(dāng)今的微服務(wù)世界中,每個人都在談?wù)揜EST服務(wù)和基于http的協(xié)議。 實(shí)際上,對于大多數(shù)通常具有更復(fù)雜的需求集的大多數(shù)企業(yè)項(xiàng)目來說,這是遠(yuǎn)遠(yuǎn)不夠的。 合理的解決方案是基于Java消息服務(wù)的集成。 而且,盡管我們不再關(guān)注集中式基礎(chǔ)架構(gòu)和ESB,但我們希望為定義的服務(wù)進(jìn)行基于點(diǎn)對點(diǎn)的集成。 讓我們看看我們是否可以使其工作并在JBoss WildFly和Oracle WebLogic Server之間發(fā)送消息。
業(yè)務(wù)案例–從Java EE到微服務(wù)
但我想先退一步:為什么要有人? 我認(rèn)為,這種情況背后的主要動機(jī)之一是遷移路徑緩慢。 從單一的單一平臺應(yīng)用程序一直到最后,我們希望具有足夠的靈活性以將那些大型安裝中的單個服務(wù)封裝起來,并使它們作為服務(wù)可用。 假設(shè)這是可能的,并且舊版應(yīng)用程序具有不錯的設(shè)計(jì)。 或者我們想提高個性化服務(wù),從技術(shù)角度來說。 在這個特定的示例中,我們迫不及待地想將Java EE 7功能引入我們的應(yīng)用程序,而WebLogic仍然主要停留在EE 6上。我們可以使用REST服務(wù)甚至WebServices來做到這一點(diǎn),但是我們可能想要更多。 這就是JMS規(guī)范的來源。
WildFly中的Oracle JMS客戶端庫
為了在兩個不同的服務(wù)器之間發(fā)送消息,您需要將各個客戶端庫集成到發(fā)送端。 對于WebLogic,這是WebLogic JMS瘦客戶端 (wljmsclient.jar)。 與WebLogic Install或Full客戶端相比,使用較小的客戶端資源提供了Java EE和WebLogic JMS功能,而與Thin T3客戶端相比,其提供的客戶端資源也較小。 實(shí)際上,它包含Java EE JMS API和實(shí)現(xiàn),它們將直接與WildFly提供的實(shí)現(xiàn)相沖突。 要使用它們,我們必須將它們打包為一個模塊,并在HornetQ中配置一個JMS Bridge來使用它。 首先是添加新模塊。 將文件夾更改為wildfly-8.2.0.Final \ modules \ system \ layers \ base,然后創(chuàng)建一個新的文件夾結(jié)構(gòu):custom \ oracle \ weblogic \ main在其下方。 從此處的%MW_HOME%\ server \ lib文件夾復(fù)制wlthint3client.jar。 現(xiàn)在,您必須添加一個模塊描述符文件,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>該文件定義了所有必需的資源和依賴項(xiàng)以及相關(guān)的排除項(xiàng)。 如果完成了,我們最終需要消息橋。
HornetQ JMS消息橋
JMS橋的功能是使用來自源JMS目標(biāo)的消息,并將其發(fā)送到目標(biāo)JMS目標(biāo)。 通常,源或目標(biāo)目標(biāo)位于不同的服務(wù)器上。 只要它們兼容JMS 1.1,該橋接器還可用于橋接來自其他非HornetQ JMS服務(wù)器的消息。 打開standalone-full.xml并將以下配置添加到消息傳遞子系統(tǒng):
<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>如您所見,它直接引用模塊,并具有源和目標(biāo)定義。 源是在消息收發(fā)子系統(tǒng)中定義的WildFly本地消息隊(duì)列:
<jms-queue name="sourceQ"><entry name="java:/jms/sourceQ"/></jms-queue>而目標(biāo)是在WebLogic Server中定義的遠(yuǎn)程隊(duì)列以及連接工廠。 我假設(shè)您知道該怎么做,否則請參閱本文檔 。 就是這樣。 現(xiàn)在,我們需要向本地隊(duì)列發(fā)送一條消息,而該消息將通過網(wǎng)橋發(fā)送到WebLogic隊(duì)列。
測試橋梁–使用駱駝
將消息驅(qū)動的bean部署到WebLogic(是的,您必須將其作為ejb jar打包到耳朵中,所有這些)。 這個特定的示例只是將消息文本轉(zhuǎn)儲到記錄器中。
@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());}} }現(xiàn)在,我們需要WildFly服務(wù)器上的生產(chǎn)者。 這樣做,我實(shí)際上正在使用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");} }這就是整個魔術(shù)。 計(jì)時器將JSON文本消息發(fā)送到本地隊(duì)列,該消息將橋接到WebLogic。
更多提示
如果要在沒有網(wǎng)橋的情況下測試WebLogic隊(duì)列,則必須將wljmsclient包含到您的項(xiàng)目中。 由于這在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另一個重要的事情是,如果您嘗試在橋以外的其他范圍內(nèi)使用自定義模塊,則會在WildFly上遇到類加載問題。 因此,請密切注意,不要在其他地方使用它。
該網(wǎng)橋配置了較大的故障重試間隔和最大重試次數(shù)。 這是一種解決方法。 如果WildFly啟動太快,并且網(wǎng)橋在實(shí)際配置隊(duì)列之前嘗試訪問本地sourceQ,則會導(dǎo)致異常。
- 在我的GitHub帳戶中找到完整的源代碼 。
翻譯自: https://www.javacodegeeks.com/2015/07/sending-jms-messages-from-wildfly-8-to-weblogic-12-with-camel.html
camel 使用
總結(jié)
以上是生活随笔為你收集整理的camel 使用_使用Camel从WildFly 8向WebLogic 12发送JMS消息的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jboss性能指标_JBoss BRMS
- 下一篇: jboss8日志级别设置_罐中研讨会:设