JMS編程模型java
(1) ConnectionFactoryapache
建立Connection對象的工廠,針對兩種不一樣的jms消息模型,分別有QueueConnectionFactory和TopicConnectionFactory兩種。能夠經過JNDI來查找ConnectionFactory對象。編程
(2) Destination瀏覽器
Destination的意思是消息生產者的消息發送目標或者說消息消費者的消息來源。對於消息生產者來講,它的Destination是某個隊列(Queue)或某個主題(Topic);對於消息消費者來講,它的Destination也是某個隊列或主題(即消息來源)。服務器
因此,Destination實際上就是兩種類型的對象:Queue、Topic能夠經過JNDI來查找Destination。session
(3) Connectioneclipse
Connection表示在客戶端和JMS系統之間創建的連接(對TCP/IP socket的包裝)。Connection能夠產生一個或多個Session。跟ConnectionFactory同樣,Connection也有兩種類型:QueueConnection和TopicConnection。異步
(4) Sessionsocket
Session是咱們操做消息的接口。能夠經過session建立生產者、消費者、消息等。Session提供了事務的功能。當咱們須要使用session發送/接收多個消息時,能夠將這些發送/接收動做放到一個事務中。一樣,也分QueueSession和TopicSession。tcp
(5) 消息的生產者
消息生產者由Session建立,並用於將消息發送到Destination。一樣,消息生產者分兩種類型:QueueSender和TopicPublisher。能夠調用消息生產者的方法(send或publish方法)發送消息。
(6) 消息消費者
消息消費者由Session建立,用於接收被髮送到Destination的消息。兩種類型:QueueReceiver和TopicSubscriber。可分別經過session的createReceiver(Queue)或createSubscriber(Topic)來建立。固然,也能夠session的creatDurableSubscriber方法來建立持久化的訂閱者。
(7) MessageListener
消息監聽器。若是註冊了消息監聽器,一旦消息到達,將自動調用監聽器的onMessage方法。EJB中的MDB(Message-Driven Bean)就是一種MessageListener。
企業消息系統的好處
咱們先來看看下圖,應用程序A將Message發送到服務器上,而後應用程序B從服務器中接收A發來的消息,經過這個圖咱們一塊兒來分析一下JMS的好處:
開始學習JMS吧~~~~~~~~~~~~~~~~~~~~~~~~~~~~
下載安裝activeMQ
解壓,如圖:
而後找到bin目錄下的win64(由於我是64位機器)啓動點擊「activemq.bat」啓動activieMQ,以下圖
啓動完畢後在瀏覽器地址欄敲入:
http://localhost:8161
出來以下圖界面表示activeMQ啓動完畢了
activiteMQ還有個HTML的控制檯,進入方式就是在地址欄後面加上"/admin",以下圖
進入以後是這樣的 :
接下來下一步,編寫代碼測試
瞭解過JMS規範的知道 ,消息分爲生產者和消費者,注意下面的代碼的IP地址不是localhost,由於個人activieMQ安裝在了虛擬機上面,因此用的是虛擬機IP地址
先寫生產者:
package actmq; import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.MessageProducer; import javax.jms.Session; import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnection; import org.apache.activemq.ActiveMQConnectionFactory; public class JMSProducer { // 默認鏈接用戶名 private static final String USERNAME = ActiveMQConnection.DEFAULT_USER; // 默認鏈接密碼 private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD; // 默認鏈接地址 private static final String BROKEURL = "failover://tcp://10.224.71.118:61616"; // 發送的消息數量 private static final int SENDNUM = 10000; public static void main(String[] args) { // 鏈接工廠 ConnectionFactory connectionFactory; // 鏈接 Connection connection = null; // 會話 接受或者發送消息的線程 Session session = null; // 消息的目的地 Destination destination; // 消息生產者 MessageProducer messageProducer; // 實例化鏈接工廠 connectionFactory = new ActiveMQConnectionFactory(JMSProducer.USERNAME, JMSProducer.PASSWORD, JMSProducer.BROKEURL); try { // 經過鏈接工廠獲取鏈接 connection = connectionFactory.createConnection(); // 啓動鏈接 connection.start(); // 建立session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE); // 建立一個名稱爲HelloWorld的消息隊列 destination = session.createQueue("HelloWorld"); // 建立消息生產者 messageProducer = session.createProducer(destination); // 發送消息 sendMessage(session, messageProducer); // 提交 session.commit(); } catch (Exception e) { e.printStackTrace(); } finally { if (connection != null) { try { connection.close(); } catch (JMSException e) { e.printStackTrace(); } } } } public static void sendMessage(Session session, MessageProducer messageProducer) throws Exception { for (int i = 0; i < JMSProducer.SENDNUM; i++) { // 建立一條文本消息 TextMessage message = session.createTextMessage("ActiveMQ 發送消息" + i); System.out.println("發送消息:Activemq 發送消息" + i); // 經過消息生產者發出消息 messageProducer.send(message); } } }
接下來寫消費者:
package actmq; import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.MessageConsumer; import javax.jms.Session; import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnection; import org.apache.activemq.ActiveMQConnectionFactory; public class JMSConsumer { private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;// 默認鏈接用戶名 private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;// 默認鏈接密碼 private static final String BROKEURL = "failover://tcp://10.224.71.118:61616";// 默認鏈接地址 public static void main(String[] args) { ConnectionFactory connectionFactory;// 鏈接工廠 Connection connection = null;// 鏈接 Session session;// 會話 接受或者發送消息的線程 Destination destination;// 消息的目的地 MessageConsumer messageConsumer;// 消息的消費者 // 實例化鏈接工廠 connectionFactory = new ActiveMQConnectionFactory(JMSConsumer.USERNAME, JMSConsumer.PASSWORD, JMSConsumer.BROKEURL); try { // 經過鏈接工廠獲取鏈接 connection = connectionFactory.createConnection(); // 啓動鏈接 connection.start(); // 建立session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // 建立一個鏈接HelloWorld的消息隊列 destination = session.createQueue("HelloWorld"); // 建立消息消費者 messageConsumer = session.createConsumer(destination); while (true) { TextMessage textMessage = (TextMessage) messageConsumer.receive(1000); if (textMessage != null) { System.out.println("收到的消息:" + textMessage.getText()); } else { break; } } } catch (JMSException e) { e.printStackTrace(); } finally { if(connection != null) { try { connection.close(); } catch (JMSException e) { e.printStackTrace(); } } } } }
運行一下生產者,看到eclipse控制檯打印:
觀察一下activiteMQ後臺控制檯,發現確實進來了1萬條消息,以下圖
再運行一下消費者,eclipse控制檯打印以下圖: