J2EE与JMS
JMS是J2EE的13种核心技术规范之一,是J2EE众多应用程序组件中的重要一员。J2EE有标准的JMS API开放,以支持各个JMS应用生产厂商的产品,开源的有jbossmq,openjms,mantamq,ActiveMQ等,不过大多已停止发展; 商业的有IBM WebSphere MQ, BEA WebLogic JMS, Oracle AQ等。
它功能强大,支持多种语言编写的客户端,符合J2EE1.4规范,支持持久化,甚至支持Ajax等等.
JMS开发入门
环境: jdk1.5以上, eclipse for j2ee版本, ${download}/activemq5.4.2/bin/activemq.exe运行起来
jar包: activemq-all-5.4.2.jar(官方发布里有) commons-logging-1.1.jar
废话不多说, 上代码先, demo1代码:
/* * xcch@cnic.cn * 消息发送者 */ import java.util.Date; import javax.jms.*; import org.apache.activemq.ActiveMQConnectionFactory; public class MessageSender { public static void main(String[] args) throws Exception { //ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("failover:(tcp://primary:61616)?timeout=3000&startupMaxReconnectAttempts=1&maxReconnectAttempts=0");//failover:失效转移 ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://primary:61616?connectionTimeout=3000"); Connection connection = connectionFactory.createConnection(); //connection.setExceptionListener(new MyJmsException()); connection.start(); Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE); Destination destination = session.createQueue("my-queue"); MessageProducer producer = session.createProducer(destination); for(int i=0; i<3; i++) { MapMessage message = session.createMapMessage(); message.setLong("count", new Date().getTime()); Thread.sleep(1000); //通过消息生产者发出消息 producer.send(message); } session.commit(); session.close(); connection.close(); } }
/* * 消息接收者 */ import java.util.Date; import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.Destination; import javax.jms.MapMessage; import javax.jms.MessageConsumer; import javax.jms.Session; import org.apache.activemq.ActiveMQConnectionFactory; public class MessageReceiver { public static void main(String[] args) throws Exception { ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(); Connection connection = connectionFactory.createConnection(); connection.start(); final Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE); Destination destination = session.createQueue("my-queue"); MessageConsumer consumer = session.createConsumer(destination); int i = 0; while (i < 3) { i++; MapMessage message = (MapMessage) consumer.receive(); session.commit(); // TODO something.... System.out.println("收到消息:" + new Date(message.getLong("count"))); } session.close(); connection.close(); } }
注意,这里要求先将activemq.exe运行起来,作为JMS的Provider.其实J2EE官方发行版里面应该也带有JMS的一个Provider,相关的demo参考2
字符串 "tcp://primary:61616?connectionTimeout=3000" 表示一个URI,它包括了协议部分,url部分,及选项. ActiveMQ其实支持多种transport(参考2),不同的transport对应不同的URI(格式,选项参数等不同).
参考:
- Oracle-JMS部分参考/javaee/1.3/jms/tutorial/1_3_1-fcs/doc/client.html
- J2EE-JMS部分参考:/javaee/6/tutorial/doc/bncdr.html
- JMS常见transport参考:/blog/164933