1、ActiveMQ解析ActiveMQ解析JMS始终在JavaEE五花八门的协议里,WebService满天飞的时候占一位置,是因为:它可以把不影响用户执行结果又比较耗时的任务(比如发邮件通知管理员)异步的扔给JMS 服务端去做,而尽快的把屏幕返还给用户。 服务端能够多线程排队响应高并发的请求。 可以在Java世界里达到最高的解耦。客户端与服务端无需直连,甚至无需知晓对方是谁、在哪里、有多少人,只要对流过的信息作响应就行了,在企业应用环境复杂时作用明显。 JMS(Java Message Service)即 java消息服务 用于分布式系统得消息通信,JMS是J2EE技术中的一个部分,Sun公司
2、定义了JMS的标准接口,即javax.jms.*。JMS服务使得分布式系统的信息通信松散连接的,发送信息的客户端只需要负责发送信息,接收信息的客户端接收信息,两个客户端之间没有必要是同时可用的,甚至发送客户端都没有必要知道客户端的信息,只要负责发送到接收的服务端就可以,JMS可以说是低耦合的。同时JMS API 做到了以下2点异步的,服务端可以发送信息到一个客户端,客户端不需要为了收到信息而请求信息。可靠的,JMS API保证了服务端所有发送的信息最少发送一次和只发送一次下面介绍一些JMS API 的基本知识JMS API 基本组成 JMS provider服务者,是一个消息系统通过实现JMS
3、 API 接口,用于管理和控制信息。 JMS client 客户端用于发送和接收信息,通常是用在java程序中用java编写的 Messages 用于在客户端信息通信的对象 Administered Objects 由JMS provider为了client创建的对象,通常是connectionFactory和destinationMessages 通信方式JMS通信方式分为点对点通信,和发布/订阅方式点对点方式(point-to-point)点对点的消息发送方式主要建立在 Message Queue,Sender,reciever上,Message Queue 存贮消息,Sneder 发送消
4、息,receive接收消息,具体的信息就是 Sender Client发送Message 到Queue ,而 receiver Cliernt 从Queue中接收消息和发送消息已接受到Quere,确认消息接收。在使用点对点方式时需要注意,一条消息只有一个接收端,消息发送客户端与接收客户端没有时间上的依赖,发送客户端可以在任何时刻发送信息到Queue,而不需要知道接收客户端是不是在运行发布/订阅 方式(publish/subscriber Messaging)发布/订阅方式用于多接收客户端的方式作为发布订阅的方式,可能存在多个接收客户端,并且接收端客户端与发送客户端存在时间上的依赖。一个接收端只
5、能接收他创建以后发送客户端发送的信息。作为subscriber ,在接收消息时有两种方法,destination的receive方法,和实现message listener 接口的onMessage 方法。基础知识这里说的很少,具体的可以参照.的JMS API 指南 ActiveMQ的特性:完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,也是Apache Geronimo默认的JMS provider。 POJO withdout EJB Container,不需要实现EJB繁琐复杂的Message Bean接口和配置。 Spring Base,可以使用Spring
6、的各种特性如IOC、AOP 。 Effective,基于Jencks的JCA Container实现 pool connection,control transactions and manage security。 下面是它的特性列表 (详细的特性清单请参考http:/activemq.apache.org/features.html) 1.多种语言和协议编写客户端 语言: Java, C, C+, C#, Ruby, Perl, Python, PHP 应用协议: OpenWire,Stomp REST,WS Notification,XMPP,AMQP 2.完全支持JMS1.1和J2EE
7、 1.4规范 (持久化,XA消息,事务) 3.对Spring的支持,ActiveMQ可以很容得内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性4.通过了常见J2EE服务器(如 Geronimo,JBoss 4, GlassFish,WebLogic)的测试,其中通过JCA 1.5 resource adaptors的配置, 可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上5.支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA6.支持通过JDBC和journal提供高速的消息持久化7.从设计上保证了高性能的集群
8、,客户端-服务器,点对点8.支持Ajax9.支持与Axis的整合10.可以很容易得调用内嵌JMS provider,进行测试作为一个JMS client 都需要以下的组成Administered Objects:ConnectionFactory,DestinationConnection;SessionMessage Producers/Message CosumersMessagesHello实例=Hello.java=import java.io.Serializable;/*Hello.java用来传递JAVA对象* Author: cjp* Date: 2005-11-8* Time
9、: 22:24:02*/public class Hello implements Serializable private String id;private Hello hello;private PointList pointList;public String getId() return id;public void setId(String id) this.id = id;public Hello getHello() return hello;public void setHello(Hello hello) this.hello = hello;=SpringTest .ja
10、va=import org.springframework.jms.core.JmsTemplate;import org.springframework.jms.core.MessageCreator;import org.springframework.test.AbstractDependencyInjectionSpringContextTests;import javax.jms.*;/*发送JMS消息*/public class SpringTest extends AbstractDependencyInjectionSpringContextTestsprotected Str
11、ing getConfigLocations()return new Stringfile:D:wosametestcomwosameroomjmsjms.xml;public void testSendMessage() throws ExceptionJmsTemplate jmsTemplate = (JmsTemplate) applicationContext.getBean(jmsTemplate);jmsTemplate.send(new MessageCreator()public Message createMessage(Session session) throws JM
12、SExceptionObjectMessage message=session.createObjectMessage();Hello hello=new Hello();hello.setId(test);message.setObject(hello);return message;);=HelloMDP .java=/*处理JMS消息*/import mons.logging.Log;import mons.logging.LogFactory;import javax.jms.*;public class HelloMDP implements MessageListenerprote
13、cted Log log = LogFactory.getLog(HelloMDP.class);public void onMessage(Message message)tryObjectMessage objMessage = (ObjectMessage) message;Hello hello= (Hello) objMessage.getObject();System.out.println(hello.getId() = + hello.getId(); catch (JMSException e)log.error(Parse failed, e);=jms.xml= 例子二
14、MQ源码import java.util.Arrays;import java.util.Date;import javax.jms.Connection;import javax.jms.DeliveryMode;import javax.jms.Destination;import javax.jms.MessageProducer;import javax.jms.Session;import javax.jms.TextMessage;import org.apache.activemq.ActiveMQConnection;import org.apache.activemq.Act
15、iveMQConnectionFactory;import org.apache.activemq.util.IndentPrinter;/* A simple tool for publishing messages* * version $Revision: 1.2 $*/public class ProducerTool private Destination destination; private int messageCount = 10; private long sleepTime = 0L; private boolean verbose = true; private in
16、t messageSize = 255; private long timeToLive; private String user = ActiveMQConnection.DEFAULT_USER; private String password = ActiveMQConnection.DEFAULT_PASSWORD; private String url = ActiveMQConnection.DEFAULT_BROKER_URL; private String subject = TOOL.DEFAULT; private boolean topic = false; privat
17、e boolean transacted = false; private boolean persistent = false; public static void main(String args) ProducerTool producerTool = new ProducerTool(); String unknonwn = CommnadLineSupport.setOptions(producerTool, args); if( unknonwn.length 0 ) System.out.println(Unknown options: +Arrays.toString(unk
18、nonwn); System.exit(-1); producerTool.run(); public void run() Connection connection=null; try System.out.println(Connecting to URL: + url); System.out.println(Publishing a Message with size + messageSize+ to + (topic ? topic : queue + : + subject); System.out.println(Using + (persistent ? persisten
19、t : non-persistent + messages ; System.out.println(Sleeping between publish + sleepTime + ms ; if (timeToLive != 0) System.out.println(Messages time to live + timeToLive + ms ; / Create the connection. ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(user, password, url);
20、connection = connectionFactory.createConnection(); connection.start(); / Create the session Session session = connection.createSession(transacted, Session.AUTO_ACKNOWLEDGE); if (topic) destination = session.createTopic(subject); else destination = session.createQueue(subject); / Create the producer. MessageProducer producer = session.createProducer(destination); if (persistent) producer.setDeliveryMode(DeliveryMode.PERSISTENT); else producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1