JMS筆記(windows下的activeMQ之helloworld)

  1. 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。

  2. 企業消息系統的好處

咱們先來看看下圖,應用程序A將Message發送到服務器上,而後應用程序B從服務器中接收A發來的消息,經過這個圖咱們一塊兒來分析一下JMS的好處: 
這裏寫圖片描述

  1. 提供消息靈活性
  2. 鬆散耦合
  3. 異步性

開始學習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控制檯打印以下圖:

相關文章
相關標籤/搜索