TomEE
Apache TomEE 是一個 Tomcat 的發行版本,完全整合了 ActiveMQ Classic,為純 war 檔案、Servlet 等提供完整的 JMS 支援。不需要任何設定,像以下這樣的程式碼就能立即運作。
import javax.annotation.Resource; import javax.servlet.http.HttpServlet; import javax.jms.Topic; import javax.jms.Queue; import javax.jms.ConnectionFactory;
public class MyServet extends HttpServlet {
@Resource(name = "foo")
private Topic fooTopic;
@Resource(name = "bar")
private Queue barQueue;
@Resource
private ConnectionFactory connectionFactory;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//...
Connection connection = connectionFactory.createConnection();
connection.start();
// Create a Session
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// Create a MessageProducer from the Session to the Topic or Queue
MessageProducer producer = session.createProducer(fooTopic);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
// Create a message
TextMessage message = session.createTextMessage("Hello World!");
// Tell the producer to send the message
producer.send(message);
//...
} }
當在程式碼中正確宣告時,所有主題和佇列都會自動建立,如上所示。例如,程式碼中的以下參考
@Resource(name = "foo")
private Topic fooTopic;
與以下在
<Resource id="foo" type="javax.jms.Topic" />
在兩種情況下,主題名稱都會是 ‘foo’。
設定嵌入式訊息代理器
如果沒有設定訊息代理器,且在 webapp 中使用了 JMS,TomEE 會建立一個等同於以下宣告的訊息代理器
這會建立一個在 TomEE 內部執行的 ActiveMQ Classic 訊息代理器,並繫結到 someHostName:61616
位址。這個訊息代理器將在 TomEE 啟動時啟動,並在 TomEE 關閉時關閉。所有在 TomEE 內部發生的 JMS 通訊,都將透過 ActiveMQ Classic 「vm」傳輸,使用嵌入式 ActiveMQ Classic 訊息代理器進行,該傳輸已針對在與訊息代理器相同的 JVM 中傳送和接收訊息進行了最佳化。
連線到外部訊息代理器
可以連線到在外部執行的 ActiveMQ Classic 訊息代理器。設定與上述類似,只有兩個變更。
這裡的 BrokerXmlConfig
屬性為空,因為我們沒有設定在 TomEE 內部執行的嵌入式訊息代理器。ServerUrl
現在指向一個明確的遠端主機和連接埠 someHostName:61616
,其中必須執行一個 ActiveMQ Classic 訊息代理器。這個訊息代理器可以是普通的 ActiveMQ Classic 安裝,或是嵌入在 TomEE 安裝中的 ActiveMQ Classic 訊息代理器。