在ONVZ,我們將Glassfish 3用作開發和生產應用服務器,我們對其性能和穩定性以及周圍的廣大社區感到非常滿意。 我很少遇到在stackoverflow或java.net上沒有匹配解決方案的問題。 作為我們開源策略的一部分,我們還運行了一個定制的ActiveMQ群集,稱為“ ONVZ Message Bus”。
為了使消息驅動Bean和其他EJB能夠使用ActiveMQ消息代理與之交互并從ActiveMQ消息代理產生消息,而無需考慮Glassfish隨附的內部OpenMQ代理,必須安裝ActiveMQ資源適配器。 對我來說幸運的是,Sven Hafner寫了一篇博客文章,介紹如何在Glassfish 3中運行嵌入式ActiveMQ 5代理 ,我能夠提取連接到外部代理所需的信息。 這篇博客文章描述了如何使它起作用。
安裝ActiveMQ資源適配器
- 在開始Glassfish之前,將以下庫從ActiveMQ安裝目錄或其他位置復制到Glassfish
- 將“ slf4j-api-1.5.11.jar”從ActiveMQ“ lib”目錄復制到Glassfish“ lib”目錄
- 從以下位置下載資源適配器(activemq-rar-5.5.1.rar)
- 在Glassfish中部署資源適配器
- 在Glassfish管理控制臺中, 轉到“應用程序”,然后單擊“部署”
- 創建資源適配器配置
- 在Glassfish管理控制臺中, 轉到“資源”,然后單擊“資源適配器配置”
- 創建連接器連接池
- 在Glassfish管理控制臺中, 轉到“資源”,“連接器”,“連接器連接池”
- 創建管理對象資源
- 在Glassfish管理控制臺中, 轉到“資源”,“連接器”,“管理對象資源”
現在,我們已經準備好一切(實際上在JNDI中),以開始使用標準Java EE消息驅動Bean處理消息。 您剛剛創建的“連接器連接池”導致ConnectionFactory在JNDI中注冊,而“管理對象資源”導致JMS目標。 當您轉到“資源”,“ JMS資源”時,可以在管理控制臺中找到這些對象。 在我使用的Glassfish版本(3.1.1)中,管理控制臺存在一個錯誤,該錯誤導致連接工廠和目標僅在菜單中可見,而在頁面右側不可見。
創建和部署消息驅動Bean
- 在您喜歡的IDE中創建一個新的Java Enterprise項目,并創建一個包含以下內容的消息驅動Bean:
package com.example.activemq.glassfish;import javax.ejb.*;
import javax.jms.*;@MessageDriven(activationConfig = {@ActivationConfigProperty(propertyName = 'destinationType', propertyValue = 'javax.jms.Queue'),@ActivationConfigProperty(propertyName = 'destination', propertyValue = 'jms/queue/incoming')}
)
public class ExampleMessageBean implements MessageListener {public void onMessage(Message message) {try {System.out.println('We've received a message: ' + message.getJMSMessageID());} catch (JMSException e) {e.printStackTrace();}}
}
Glassfish會將您的bean連接到已配置的隊列,但是它將嘗試使用連接到嵌入式OpenMQ代理的默認ConnectionFactory進行連接。 這不是我們想要的,所以我們將指示Glassfish使用哪個ConnectionFactory。
- 在META-INF文件夾中添加一個名為glassfish-ejb-jar.xml的文件,并插入以下內容:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE glassfish-ejb-jar PUBLIC '-//GlassFish.org//DTD GlassFish Application Server 3.1 EJB 3.1//EN' 'http://glassfish.org/dtds/glassfish-ejb-jar_3_1-1.dtd'>
<glassfish-ejb-jar><enterprise-beans><ejb><ejb-name>ExampleMessageBean</ejb-name><mdb-connection-factory><jndi-name>jms/connectionFactory</jndi-name></mdb-connection-factory><mdb-resource-adapter><resource-adapter-mid>activemq-rar-5.5.1</resource-adapter-mid></mdb-resource-adapter></ejb></enterprise-beans>
</glassfish-ejb-jar>
- 將MDB部署到glassfish
Glassfish現在使用ActiveMQ ConnectionFactory,一切都很好。 使用ActiveMQ Web控制臺將消息發送到稱為“ jms / queue / incoming”的隊列,或使用其他工具發送消息。 Glassfish會捕獲所有sysout語句并將其打印在默認的glassfish日志文件中。
參考: 如何通過我們的JCG合作伙伴 Geert Schuring在Geert Schuring博客上將Glassfish 3連接到外部ActiveMQ 5代理 。
翻譯自: https://www.javacodegeeks.com/2012/06/connect-glassfish-3-to-external.html