åœ?Java 里有 JMS 的多个实玎ͼŒActiveMQ 是Apache出å“åQŒæœ€‹¹è¡Œçš„ï¼Œèƒ½åŠ›å¼ºåŠ²çš„å¼€æºæ¶ˆæ¯æ€Èº¿ã€‚ActiveMQ 是一个完全支æŒJMS1.1å’ŒJ2EE 1.4规范çš?JMS Provider实现ã€?/p>
JMS 定义了两¿Uæ–¹å¼ï¼šQuereåQˆç‚¹å¯¹ç‚¹åQ‰ï¼›TopicåQˆå‘å¸?订阅åQ‰ã€?/p>
ConnectionFactory 是连接工厂,负责创å¾Connection。Connection è´Ÿè´£åˆ›å¾ Session。Destination 是消æ¯çš„目的地ã€?/p>
Session åˆ›å¾ MessageProduceråQˆç”¨æ¥å‘消æ¯åQ?å’?MessageConsumeråQˆç”¨æ¥æŽ¥æ”¶æ¶ˆæ¯ï¼‰ã€?/p>
ActiveMQ的官方网å€åQ?a >http://activemq.apache.org。在æ¤å¯ä»¥ä¸‹è½½ActiveMQ的最新版本和阅读相关文档ã€?/p>
䏋颿˜¯ä‹É用ActiveMQå‘é€å’ŒæŽ¥æ”¶æ¶ˆæ¯çš„JAVA实现åQ?/p>
1ã€æ¶ˆæ¯å‘é€è€?/p>
package com.jmsd;
import javax.jms.BytesMessage;
import javax.jms.Connection;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.MessageProducer;
import javax.jms.ObjectMessage;
import javax.jms.Session;
import javax.jms.StreamMessage;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
* 说明åQ?activemq send message
*
* @author xajava
* @version åˆ›å¾æ—‰™—´åQ?012-10-24 下åˆ1:22:40
*/
public class JmsSender {
private String USER = ActiveMQConnection.DEFAULT_USER;
private String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
private String URL = ActiveMQConnection.DEFAULT_BROKER_URL;
private String SUBJECT = "ActiveMQ.Demo";
private Destination destination = null;
private Connection conn = null;
private Session session = null;
private MessageProducer producer = null;
// åˆå§‹åŒ?br /> private void initialize() throws JMSException, Exception {
// ˜qžæŽ¥å·¥åŽ‚
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(USER, PASSWORD, URL);
conn = connectionFactory.createConnection();
// 事务性会è¯ï¼Œè‡ªåЍ¼‹®è®¤æ¶ˆæ¯
session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 消æ¯çš„目的地åQˆQueue/TopicåQ?br />destination = session.createQueue(SUBJECT);
// destination = session.createTopic(SUBJECT);
// 消æ¯çš„æä¾›è€…(生äñ”者)
producer = session.createProducer(destination);
// 䏿Œä¹…化消æ¯
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
}
public void sendMessage(String msgType) throws JMSException, Exception {
initialize();
// ˜qžæŽ¥åˆ°JMSæä¾›è€…(æœåŠ¡å™¨ï¼‰
conn.start();
// å‘逿–‡æœ¬æ¶ˆæ?br />if ("text".equals(msgType)) {
String textMsg = "ActiveMQ Text Message!";
TextMessage msg = session.createTextMessage();
// TextMessage msg = session.createTextMessage(textMsg);
msg.setText(textMsg);
producer.send(msg);
}
// å‘é€Map消æ¯
if ("map".equals(msgType)) {
MapMessage msg = session.createMapMessage();
msg.setBoolean("boolean", true);
msg.setShort("short", (short) 0);
msg.setLong("long", 123456);
msg.setString("MapMessage", "ActiveMQ Map Message!");
producer.send(msg);
}
// å‘逿µæ¶ˆæ¯
if ("stream".equals(msgType)) {
String streamValue = "ActiveMQ stream Message!";
StreamMessage msg = session.createStreamMessage();
msg.writeString(streamValue);
msg.writeBoolean(false);
msg.writeLong(1234567890);
producer.send(msg);
}
// å‘é€å¯¹è±¡æ¶ˆæ?br />if ("object".equals(msgType)) {
JmsObjectMessageBean jmsObject = new JmsObjectMessageBean("ActiveMQ Object Message", 18, false);
ObjectMessage msg = session.createObjectMessage();
msg.setObject(jmsObject);
producer.send(msg);
}
// å‘é€å—节消æ?br />if ("bytes".equals(msgType)) {
String byteValue = "å—节消æ¯";
BytesMessage msg = session.createBytesMessage();
msg.writeBytes(byteValue.getBytes());
producer.send(msg);
}
}
// 关闘qžæŽ¥
public void close() throws JMSException {
if (producer != null)
producer.close();
if (session != null)
session.close();
if (conn != null)
conn.close();
}
}
2ã€æ¶ˆæ¯æŽ¥æ”¶è€?/p>
package com.jmsd;
import java.util.Enumeration;
import javax.jms.BytesMessage;
import javax.jms.Connection;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;
import javax.jms.Session;
import javax.jms.StreamMessage;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
* 说明åQ?br /> *
* @author xajava
* @version åˆ›å¾æ—‰™—´åQ?012-10-24 下åˆ2:06:48
*/
public class JmsReceiver implements MessageListener {
private String USER = ActiveMQConnection.DEFAULT_USER;
private String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
private String URL = ActiveMQConnection.DEFAULT_BROKER_URL;
private String SUBJECT = "ActiveMQ.Demo";
private Destination dest = null;
private Connection conn = null;
private Session session = null;
private MessageConsumer consumer = null;
private boolean stop = false;
// åˆå§‹åŒ?br /> private void initialize() throws JMSException, Exception {
// ˜qžæŽ¥å·¥åŽ‚æ˜¯ç”¨æˆ·åˆ›å»ø™¿žæŽ¥çš„对象.
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(USER, PASSWORD, URL);
// ˜qžæŽ¥å·¥åŽ‚åˆ›å¾ä¸€ä¸ªjms connection
conn = connectionFactory.createConnection();
// 是生产和消费的一个啾U¿ç¨‹ä¸Šä¸‹æ–‡ã€‚会è¯ç”¨äºŽåˆ›å»ºæ¶ˆæ¯çš„生äñ”者,消费者和消æ¯ã€‚ä¼šè¯æä¾›äº†ä¸€ä¸ªäº‹åŠ¡æ€§çš„ä¸Šä¸‹æ–‡ã€?br /> session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); // 䏿”¯æŒäº‹åŠ?br /> // ç›®çš„åœ°æ˜¯å®¢æˆ·ç”¨æ¥æŒ‡å®šä»–生产消æ¯çš„ç›®æ ‡˜q˜æœ‰ä»–消è´Ò޶ˆæ¯çš„æ¥æºçš„对è±?
dest = session.createQueue(SUBJECT);
// dest = session.createTopic(SUBJECT);
// 会è¯åˆ›å¾æ¶ˆæ¯çš„生产者将消æ¯å‘é€åˆ°ç›®çš„åœ?br /> consumer = session.createConsumer(dest);
}
/**
* 消费消æ¯
*
* @throws JMSException
* @throws Exception
*/
public void receiveMessage() throws JMSException, Exception {
initialize();
conn.start();
consumer.setMessageListener(this);
// ½{‰å¾…接收消æ¯
while (!stop) {
Thread.sleep(5000);
}
}
@SuppressWarnings("rawtypes")
@Override
public void onMessage(Message msg) {
try {
if (msg instanceof TextMessage) {
TextMessage message = (TextMessage) msg;
System.out.println("------Received TextMessage------");
System.out.println(message.getText());
} else if (msg instanceof MapMessage) {
MapMessage message = (MapMessage) msg;
System.out.println("------Received MapMessage------");
System.out.println(message.getLong("long"));
System.out.println(message.getBoolean("boolean"));
System.out.println(message.getShort("short"));
System.out.println(message.getString("MapMessage"));
System.out.println("------Received MapMessage for while------");
Enumeration enumer = message.getMapNames();
while (enumer.hasMoreElements()) {
Object obj = enumer.nextElement();
System.out.println(message.getObject(obj.toString()));
}
} else if (msg instanceof StreamMessage) {
StreamMessage message = (StreamMessage) msg;
System.out.println("------Received StreamMessage------");
System.out.println(message.readString());
System.out.println(message.readBoolean());
System.out.println(message.readLong());
} else if (msg instanceof ObjectMessage) {
System.out.println("------Received ObjectMessage------");
ObjectMessage message = (ObjectMessage) msg;
JmsObjectMessageBean jmsObject = (JmsObjectMessageBean) message.getObject();
System.out.println(jmsObject.getUserName() + "__" + jmsObject.getAge() + "__" + jmsObject.isFlag());
} else if (msg instanceof BytesMessage) {
System.out.println("------Received BytesMessage------");
BytesMessage message = (BytesMessage) msg;
byte[] byteContent = new byte[1024];
int length = -1;
StringBuffer content = new StringBuffer();
while ((length = message.readBytes(byteContent)) != -1) {
content.append(new String(byteContent, 0, length));
}
System.out.println(content.toString());
} else {
System.out.println(msg);
}
stop = true;
} catch (JMSException e) {
e.printStackTrace();
} finally {
try {
this.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
// 关闘qžæŽ¥
public void close() throws JMSException {
System.out.println("Consumer:->Closing connection");
if (consumer != null)
consumer.close();
if (session != null)
session.close();
if (conn != null)
conn.close();
}
}
3ã€å¯¹è±¡æ¶ˆæ?/p>
package com.jmsd;
import java.io.Serializable;
/**
* 说明åQ?JMS 对象消毽CÞZ¾‹å¯¹è±¡
*
* @author xajava
* @version åˆ›å¾æ—‰™—´åQ?012-10-24 下åˆ1:56:07
*/
public class JmsObjectMessageBean implements Serializable {
private static final long serialVersionUID = 2620024932905963095L;
private String userName;
private int age = 16;
private boolean flag = true;
public JmsObjectMessageBean(String userName,int age,boolean flag){
this.setUserName(userName);
this.setAge(age);
this.setFlag(flag);
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
}
4ã€æµ‹è¯•ç±»
package com.jmsd;
import javax.jms.JMSException;
/**
* 说明åQ?
*
* @author xajava
* @version åˆ›å¾æ—‰™—´åQ?012-10-22 下åˆ4:33:17
*/
public class Test {
public static void main(String[] args) throws JMSException, Exception {
JmsSender sender = new JmsSender();
JmsReceiver receiver = new JmsReceiver();
sender.sendMessage("bytes");
sender.close();
receiver.receiveMessage();
receiver.close();
}
}
package com.jmsd;
import javax.jms.JMSException;
/**
* 说明åQ?
*
* @author xajava
* @version åˆ›å¾æ—‰™—´åQ?012-10-22 下åˆ4:33:17
*/
public class Test {
public static void main(String[] args) throws JMSException, Exception {
JmsSender sender = new JmsSender();
JmsReceiver receiver = new JmsReceiver();
sender.sendMessage("bytes");
sender.close();
receiver.receiveMessage();
receiver.close();
}
}
package com.jmsd;
import javax.jms.JMSException;
/**
* 说明åQ?
*
* @author xajava
* @version åˆ›å¾æ—‰™—´åQ?012-10-22 下åˆ4:33:17
*/
public class Test {
public static void main(String[] args) throws JMSException, Exception {
JmsSender sender = new JmsSender();
JmsReceiver receiver = new JmsReceiver();
sender.sendMessage("bytes");
sender.close();
receiver.receiveMessage();
receiver.close();
}
}