Apache TomEE + JMS。 这从未如此简单。
我記得J2EE (1.3和1.4)的過去,使用JMS啟動項目非常困難。 您需要安裝JMS 代理 ,創建主題或隊列 ,最后使用服務器配置文件和JNDI開始自己的戰斗。
感謝JavaEE 6及其它,使用JMS確實非常簡單。 但是使用Apache TomEE則更容易上手。 在本文中,我們將了解如何創建和測試一個簡單的應用程序,該應用程序使用Apache TomEE向JMS隊列發送消息或從JMS隊列接收消息。
Apache TomEE使用Apache Active MQ作為JMS提供程序。 在此示例中,您不需要下載或安裝任何東西,因為所有元素都將作為Maven依賴項提供,但是如果您計劃(并且應該)使用Apache TomEE服務器,則需要下載Apache TomEE plus或Apache TomEE plume。 您可以在http://tomee.apache.org/comparison.html中了解有關Apache TomEE風味的更多信息。
依存關系
首先要做的是將javaee-api添加為提供的依賴項,并將junit和openejb-core添加為測試依賴項。 請注意,添加了openejb-core依賴項以使其具有運行時來執行測試,我們將在測試部分中對其進行深入了解。
<dependencies><dependency><groupId>org.apache.openejb</groupId><artifactId>javaee-api</artifactId><version>6.0-6</version><scope>provided</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><dependency><groupId>org.apache.openejb</groupId><artifactId>openejb-core</artifactId><version>4.7.1</version><scope>test</scope></dependency> </dependencies>商業代碼
下一步是創建負責發送消息和從JMS 隊列接收消息的業務代碼。 它還包含一種從隊列接收消息的方法。 對于此示例,我們將使用無狀態 EJB 。
import javax.annotation.Resource; import javax.ejb.Stateless; import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.DeliveryMode; import javax.jms.JMSException; import javax.jms.MessageConsumer; import javax.jms.MessageProducer; import javax.jms.Queue; import javax.jms.Session; import javax.jms.TextMessage;@Stateless public class Messages {//Standard @Resource annotation is used to inject the ConnectionFactory. //If no name is provided using lookup or name attribute, //the fully qualified name of the class with an slash (/) and the name of the attribute is used. //In this example: java:comp/env/org.superbiz.jms.Messages/connectionFactory.@Resource private ConnectionFactory connectionFactory;//Standard @Resource annotation is used to inject the Queue. //If no name is provided using lookup or name attribute, //the fully qualified name of the class with an slash (/) and the name of the attribute is used. //In this example: java:comp/env/org.superbiz.injection.jms.Messages/chatQueue.@Resource private Queue chatQueue;public void sendMessage(String text) throws JMSException {Connection connection = null;Session session = null;try {connection = connectionFactory.createConnection();//Connection is get from ConnectionFactory instance and it is started.connection.start(); //Creates a session to created connection.session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //Creates a MessageProducer from Session to the Queue.MessageProducer producer = session.createProducer(chatQueue);producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); TextMessage message = session.createTextMessage(text);//Tells the producer to send the messageproducer.send(message); } finally {if (session != null) session.close(); if (connection != null) connection.close();}}public String receiveMessage() throws JMSException {Connection connection = null;Session session = null;MessageConsumer consumer = null;try {connection = connectionFactory.createConnection();connection.start();session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);consumer = session.createConsumer(chatQueue); //Waits for a message with timeout. Note that because a TextMessage is sent, the receive method expects a TextMessage too.TextMessage message = (TextMessage) consumer.receive(1000); return message.getText(); } finally {if (consumer != null) consumer.close();if (session != null) session.close();if (connection != null) connection.close();}} } Messages類的最重要部分是注意注入ConnectionFactory和 
 在代碼內將實例排隊 。 您只需要使用@Resource批注,容器將為您完成其余工作。 最后請注意,由于我們尚未使用name或lookup屬性來設置名稱,因此將字段名稱用作資源名稱。 
測試
最后,我們可以編寫一個測試來斷言使用JMS隊列發送和接收消息。 例如,我們可以使用Arquilian編寫測試,但是由于這種情況,由于簡單起見,我們將使用嵌入式OpenEJB實例來部署JMS示例并運行測試。
public class MessagesTest {//Messages EJB is injected.@EJBprivate Messages messages;@Beforepublic void setUp() throws Exception {Properties p = new Properties();//Embedded OpenEJB container is started.//And current test added inside created container//So we can use javaee annotations insideEJBContainer.createEJBContainer(p).getContext().bind("inject", this); }@Testpublic void shouldSendAndReceiveMessages() throws Exception {//Three messages are sent.messages.sendMessage("Hello World!"); messages.sendMessage("How are you?");messages.sendMessage("Still spinning?");//Three messages are received.assertThat(messages.receiveMessage(), is("Hello World!")); assertThat(messages.receiveMessage(), is("How are you?"));assertThat(messages.receiveMessage(), is("Still spinning?"));}}請注意,該測試非常簡單明了,您只需要以編程方式啟動EJB容器并在其中綁定當前測試,這樣我們就可以在測試中使用JavaEE批注。 其余的是一個簡單的JUnit測試。
而且,如果您運行測試,您將收到綠色的子彈。 但是,等等,您可能想知道JMS 代理及其配置在哪里? ConnectionFactory和JMS 隊列的定義在哪里? 這就是OpenEJB (和Apache TomEE )發揮作用的地方。
在這種情況下, OpenEJB (和Apache TomEE )將以嵌入式模式使用Apache Active MQ ,因此您無需在計算機上安裝Apache Active MQ即可運行測試。 此外, Apache TomEE將為您創建所有必需的資源。 例如,它會創建一個連接工廠和一個隊列為你使用默認參數和預期的名稱(org.superbiz.Messages / connectionFactory的用于連接工廠和org.superbiz.Messages / chatQueue的隊列 ),所以你不必擔心到在測試階段配置JMS 。 Apache TomEE足夠聰明,可以為您創建和配置它們。
您可以通過閱讀下一條日志消息來檢查控制臺輸出,以了解資源是自動創建的: INFO:自動創建資源 。
Jan 10, 2015 10:32:48 AM org.apache.openejb.config.AutoConfig processResourceRef INFO: Auto-linking resource-ref 'java:comp/env/org.superbiz.Messages/connectionFactory' in bean Messages to Resource(id=Default JMS Connection Factory) Jan 10, 2015 10:32:48 AM org.apache.openejb.config.ConfigurationFactory configureService INFO: Configuring Service(id=org.superbiz.Messages/chatQueue, type=Resource, provider-id=Default Queue) Jan 10, 2015 10:32:48 AM org.apache.openejb.config.AutoConfig logAutoCreateResource INFO: Auto-creating a Resource with id 'org.superbiz.Messages/chatQueue' of type 'javax.jms.Queue for 'Messages'. Jan 10, 2015 10:32:48 AM org.apache.openejb.assembler.classic.Assembler createRecipe INFO: Creating Resource(id=org.superbiz.Messages/chatQueue) Jan 10, 2015 10:32:48 AM org.apache.openejb.config.AutoConfig processResourceEnvRef INFO: Auto-linking resource-env-ref 'java:comp/env/org.superbiz.Messages/chatQueue' in bean Messages to Resource(id=org.superbiz.Messages/chatQueue) Jan 10, 2015 10:32:48 AM org.apache.openejb.config.ConfigurationFactory configureService INFO: Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container) Jan 10, 2015 10:32:48 AM org.apache.openejb.config.AutoConfig createContainer INFO: Auto-creating a container for bean javaee.MessagesTest: Container(type=MANAGED, id=Default Managed Container)如此,借助Java EE和TomEE , JMS真的非常容易上手 。 在下一篇文章中,我們將看到如何使用消息驅動Bean (MDB)進行相同的操作。
翻譯自: https://www.javacodegeeks.com/2015/01/apache-tomee-jms-it-has-never-been-so-easy.html
總結
以上是生活随笔為你收集整理的Apache TomEE + JMS。 这从未如此简单。的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 立刻有是什么意思? 立刻有出自于什么
- 下一篇: 匕水页念什么字 颍读音及释义
