ActiveMQ入門樣本

來源:互聯網
上載者:User

企業中各項目中相互協作的時候可能用得到訊息通知機制。比如有東西更新了,可以通知做索引。

在 Java 裡有 JMS 的多個實現。其中 apache 下的 ActiveMQ 就是不錯的選擇。ActiveMQ 是Apache出品,最流行的,能力強勁的開源訊息匯流排。ActiveMQ 是一個完全支援JMS1.1和J2EE 1.4規範的 JMS Provider實現。這裡樣本下使用 ActiveMQ

用 ActiveMQ 最好還是瞭解下 JMS

JMS 公用 點對點域 發布/訂閱域
ConnectionFactory QueueConnectionFactory TopicConnectionFactory
Connection QueueConnection TopicConnection
Destination Queue Topic
Session QueueSession TopicSession
MessageProducer QueueSender TopicPublisher
MessageConsumer QueueReceiver TopicSubscriber

JMS 定義了兩種方式:Quere(點對點);Topic(發布/訂閱)。

ConnectionFactory 是串連工廠,負責建立Connection。

Connection 負責建立 Session。

Session 建立 MessageProducer(用來發訊息) 和 MessageConsumer(用來接收訊息)。

Destination 是訊息的目的地。

詳細的可以網上找些 JMS 規範(有中文版)。

下載 apache-activemq-5.3.0。http://activemq.apache.org/download.html

,解壓,然後雙擊 bin/activemq.bat。運行後,可以在 http://localhost:8161/admin

觀察。也有 demo, http://localhost:8161/demo

。把 activemq-all-5.3.0.jar 加入 classpath。

Jms 發送 代碼:

public static void main(String[] args) throws Exception {<br /> ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(); </p><p> Connection connection = connectionFactory.createConnection();<br /> connection.start(); </p><p> Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);<br /> Destination destination = session.createQueue("my-queue"); </p><p> MessageProducer producer = session.createProducer(destination);<br /> for(int i=0; i<3; i++) {<br /> MapMessage message = session.createMapMessage();<br /> message.setLong("count", new Date().getTime());<br /> Thread.sleep(1000);<br /> //通過訊息生產者發出訊息<br /> producer.send(message);<br /> }<br /> session.commit();<br /> session.close();<br /> connection.close();<br />}

 

Jms 接收代碼:

public static void main(String[] args) throws Exception {<br /> ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(); </p><p> Connection connection = connectionFactory.createConnection();<br /> connection.start(); </p><p> final Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);<br /> Destination destination = session.createQueue("my-queue"); </p><p> MessageConsumer consumer = session.createConsumer(destination);<br /> int i=0;<br /> while(i<3) {<br /> i++;<br /> MapMessage message = (MapMessage) consumer.receive();<br /> session.commit(); </p><p> //TODO something....<br /> System.out.println("收到訊息:" + new Date(message.getLong("count")));<br /> } </p><p> session.close();<br /> connection.close();<br />}

 

 

 

JMS五種訊息的發送/接收的例子

轉自:http://chenjumin.javaeye.com/blog/687124
 

1、訊息發送

//串連工廠<br />ConnectionFactory connFactory = new ActiveMQConnectionFactory(<br /> ActiveMQConnection.DEFAULT_USER,<br /> ActiveMQConnection.DEFAULT_PASSWORD,<br /> "tcp://localhost:61616"); </p><p>//串連到JMS提供者<br />Connection conn = connFactory.createConnection();<br />conn.start(); </p><p>//事務性會話,自動確認訊息<br />Session session = conn.createSession(true, Session.AUTO_ACKNOWLEDGE); </p><p>//訊息的目的地<br />Destination destination = session.createQueue("queue.hello"); </p><p>//訊息生產者<br />MessageProducer producer = session.createProducer(destination);<br />producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); //不持久化 </p><p>//簡訊<br />TextMessage textMessage = session.createTextMessage("簡訊");<br />producer.send(textMessage); </p><p>//索引值對訊息<br />MapMessage mapMessage = session.createMapMessage();<br />mapMessage.setLong("age", new Long(32));<br />mapMessage.setDouble("sarray", new Double(5867.15));<br />mapMessage.setString("username", "索引值對訊息");<br />producer.send(mapMessage); </p><p>//流訊息<br />StreamMessage streamMessage = session.createStreamMessage();<br />streamMessage.writeString("streamMessage流訊息");<br />streamMessage.writeLong(55);<br />producer.send(streamMessage); </p><p>//位元組訊息<br />String s = "BytesMessage位元組訊息";<br />BytesMessage bytesMessage = session.createBytesMessage();<br />bytesMessage.writeBytes(s.getBytes());<br />producer.send(bytesMessage); </p><p>//對象訊息<br />User user = new User("cjm", "對象訊息"); //User對象必須實現Serializable介面<br />ObjectMessage objectMessage = session.createObjectMessage();<br />objectMessage.setObject(user);<br />producer.send(objectMessage); </p><p>session.commit(); //在事務性會話中,只有commit之後,訊息才會真正到達目的地<br />producer.close();<br />session.close();<br />conn.close();

2、訊息接收:通過訊息監聽器的方式接收訊息

public class Receiver implements MessageListener{<br /> private boolean stop = false; </p><p> public void execute() throws Exception {<br /> //串連工廠<br /> ConnectionFactory connFactory = new ActiveMQConnectionFactory(<br /> ActiveMQConnection.DEFAULT_USER,<br /> ActiveMQConnection.DEFAULT_PASSWORD,<br /> "tcp://localhost:61616"); </p><p> //串連到JMS提供者<br /> Connection conn = connFactory.createConnection();<br /> conn.start(); </p><p> //事務性會話,自動確認訊息<br /> Session session = conn.createSession(true, Session.AUTO_ACKNOWLEDGE); </p><p> //訊息的來源地<br /> Destination destination = session.createQueue("queue.hello"); </p><p> //訊息消費者<br /> MessageConsumer consumer = session.createConsumer(destination);<br /> consumer.setMessageListener(this); </p><p> //等待接收訊息<br /> while(!stop){<br /> Thread.sleep(5000);<br /> } </p><p> session.commit(); </p><p> consumer.close();<br /> session.close();<br /> conn.close();<br /> } </p><p> public void onMessage(Message m) {<br /> try{<br /> if(m instanceof TextMessage){ //接收簡訊<br /> TextMessage message = (TextMessage)m;<br /> System.out.println(message.getText());<br /> }else if(m instanceof MapMessage){ //接收索引值對訊息<br /> MapMessage message = (MapMessage)m;<br /> System.out.println(message.getLong("age"));<br /> System.out.println(message.getDouble("sarray"));<br /> System.out.println(message.getString("username"));<br /> }else if(m instanceof StreamMessage){ //接收流訊息<br /> StreamMessage message = (StreamMessage)m;<br /> System.out.println(message.readString());<br /> System.out.println(message.readLong());<br /> }else if(m instanceof BytesMessage){ //接收位元組訊息<br /> byte[] b = new byte[1024];<br /> int len = -1;<br /> BytesMessage message = (BytesMessage)m;<br /> while((len=message.readBytes(b))!=-1){<br /> System.out.println(new String(b, 0, len));<br /> }<br /> }else if(m instanceof ObjectMessage){ //接收對象訊息<br /> ObjectMessage message = (ObjectMessage)m;<br /> User user = (User)message.getObject();<br /> System.out.println(user.getUsername() + " _ " + user.getPassword());<br /> }else{<br /> System.out.println(m);<br /> } </p><p> stop = true;<br /> }catch(JMSException e){<br /> stop = true;<br /> e.printStackTrace();<br /> }<br /> }<br />}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.