使用activeMQ实现jms(zhuam)
使用activeMQ实现jms
一:jms介绍
jms说白了就是javamessageservice,是J2EE规范的一部分,跟jdbc差不多,sun只提供了接口,由各个厂商(provider)来进行具体的实现,然后使用者使用他们的jar包进行开发使用即可。
另外在jms的API中,jms传递消息有两种方式,一种是点对点的Queue,还有一个是发布订阅的Topic方式。区别在于:
对于Queue模式,一个发布者发布消息,下面的接收者按队列顺序接收,比如发布了10个消息,两个接收者A,B那就是A,B总共会收到10条消息,不重复。
对于Topic模式,一个发布者发布消息,有两个接收者A,B来订阅,那么发布了10条消息,A,B各收到10条消息。
关于api的简单基础可以看下:http://www.javaeye.com/topic/64707,简单的参考!
二:ActiveMQ介绍
activeMQ是apache下的一个开源jms产品,具体参见apache官方网站;
ApacheActiveMQisfast,supportsmanyCrossLanguageClientsandProtocols,comeswitheasytouseEnterpriseIntegrationPatternsandmanyadvancedfeatureswhilefullysupportingJMS1.1andJ2EE1.4.ApacheActiveMQisreleasedundertheApache2.0License
三:开始实现代码
1:使用activeMQ来完成jms的发送,必须要下载activeMQ,然后再本机安装,并且启动activeMQ的服务才行。在官网下载完成之后,运行bin目录下面的activemq.bat,将activeMQ成功启动。
启动成功之后可以运行:http://localhost:8161/admin/index.jsp查看一下。
2:发送端,sender
importjavax.jms.Connection;
importjavax.jms.ConnectionFactory;
importjavax.jms.DeliveryMode;
importjavax.jms.Destination;
importjavax.jms.MessageProducer;
importjavax.jms.Session;
importjavax.jms.TextMessage;
importorg.apache.activemq.ActiveMQConnection;
importorg.apache.activemq.ActiveMQConnectionFactory;
publicclassSender{
privatestaticfinalintSEND_NUMBER=5;
publicstaticvoidmain(String[]args){
//ConnectionFactory:连接工厂,JMS用它创建连接
ConnectionFactoryconnectionFactory;
//Connection:JMS客户端到JMSProvider的连接
Connectionconnection=null;
//Session:一个发送或接收消息的线程
Sessionsession;
//Destination:消息的目的地;消息发送给谁.
Destinationdestination;
//MessageProducer:消息发送者
MessageProducerproducer;
//TextMessagemessage;
//构造ConnectionFactory实例对象,此处采用ActiveMq的实现jar
connectionFactory=newActiveMQConnectionFactory(
ActiveMQConnection.DEFAULT_USER,
ActiveMQConnection.DEFAULT_PASSWORD,
"tcp://localhost:61616");
try{
//构造从工厂得到连接对象
connection=connectionFactory.createConnection();
//启动
connection.start();
//获取操作连接
session=connection.createSession(Boolean.TRUE,
Session.AUTO_ACKNOWLEDGE);
//获取session注意参数值xingbo.xu-queue是一个服务器的queue,须在在ActiveMq的console配置
destination=session.createQueue("test-queue");
//得到消息生成者【发送者】
producer=session.createProducer(destination);
//设置不持久化,可以更改
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
//构造消息
sendMessage(session,producer);
session.commit();
}catch(Exceptione){
e.printStackTrace();
}finally{
try{
if(null!=connection)
connection.close();
}catch(Throwableignore){
}
}
}
publicstaticvoidsendMessage(Sessionsession,MessageProducerproducer)
throwsException{
for(inti=1;i<=SEND_NUMBER;i++){
TextMessagemessage=session
.createTextMessage("ActiveMq发送的消息"+i);
//发送消息到目的地方
System.out.println("发送消息:"+i);
producer.send(message);
}
}
}
3:接收端,receive
importjavax.jms.Connection;
importjavax.jms.ConnectionFactory;
importjavax.jms.Destination;
importjavax.jms.JMSException;
importjavax.jms.Message;
importjavax.jms.MessageConsumer;
importjavax.jms.MessageListener;
importjavax.jms.Session;
importjavax.jms.TextMessage;
importorg.apache.activemq.ActiveMQConnection;
importorg.apache.activemq.ActiveMQConnectionFactory;
publicclassReceiver{
publicstaticvoidmain(String[]args){
//ConnectionFactory:连接工厂,JMS用它创建连接
ConnectionFactoryconnectionFactory;
//Connection:JMS客户端到JMSProvider的连接
Connectionconnection=null;
//Session:一个发送或接收消息的线程
Sessionsession;
//Destination:消息的目的地;消息发送给谁.
Destinationdestination;
//消费者,消息接收者
MessageConsumerconsumer;
connectionFactory=newActiveMQConnectionFactory(
ActiveMQConnection.DEFAULT_USER,
ActiveMQConnection.DEFAULT_PASSWORD,"tcp://localhost:61616");
try{
//构造从工厂得到连接对象
connection=connectionFactory.createConnection();
//启动
connection.start();
//获取操作连接
session=connection.createSession(Boolean.FALSE,
Session.AUTO_ACKNOWLEDGE);
//test-queue跟sender的保持一致,一个创建一个来接收
destination=session.createQueue("test-queue");
consumer=session.createConsumer(destination);
consumer.setMessageListener(newMessageListener(){
publicvoidonMessage(Messagearg0){
System.out.println("==================");
try{
System.out.println("RECEIVE1第一个获得者:"
+((TextMessage)arg0).getText());
}catch(JMSExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
});
MessageConsumerconsumer1=session.createConsumer(destination);
consumer1.setMessageListener(newMessageListener(){
publicvoidonMessage(Messagearg0){
System.out.println("+++++++++++++++++++");
try{
System.out.println("RECEIVE1第二个获得者:"
+((TextMessage)arg0).getText());
}catch(JMSExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
});
}catch(Exceptione){
e.printStackTrace();
}
//在eclipse里运行的时候,这里不要关闭,这样就可以一直等待服务器发送了,不然就直接结束了。
//}finally{
//try{
//if(null!=connection)
//connection.close();
//}catch(Throwableignore){
//}
//}
}
}
4:发送端,sender
上面的是用Queue的方式来创建,下面再用topic的方式实现同样的功能。
importjavax.jms.Connection;
importjavax.jms.JMSException;
importjavax.jms.Message;
importjavax.jms.MessageConsumer;
importjavax.jms.MessageListener;
importjavax.jms.MessageProducer;
importjavax.jms.Session;
importjavax.jms.TextMessage;
importjavax.jms.Topic;
importorg.apache.activemq.ActiveMQConnectionFactory;
importorg.apache.activemq.command.ActiveMQTopic;
publicclassTopicTest{
publicstaticvoidmain(String[]args)throwsException{
ActiveMQConnectionFactoryfactory=newActiveMQConnectionFactory(
"tcp://localhost:61616");
Connectionconnection=factory.createConnection();
connection.start();
//创建一个Topic
Topictopic=newActiveMQTopic("testTopic");
Sessionsession=connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
//注册消费者1
MessageConsumercomsumer1=session.createConsumer(topic);
comsumer1.setMessageListener(newMessageListener(){
publicvoidonMessage(Messagem){
try{
System.out.println("Consumer1get"
+((TextMessage)m).getText());
}catch(JMSExceptione){
e.printStackTrace();
}
}
});
//注册消费者2
MessageConsumercomsumer2=session.createConsumer(topic);
comsumer2.setMessageListener(newMessageListener(){
publicvoidonMessage(Messagem){
try{
System.out.println("Consumer2get"
+((TextMessage)m).getText());
}catch(JMSExceptione){
e.printStackTrace();
}
}
});
//创建一个生产者,然后发送多个消息。
MessageProducerproducer=session.createProducer(topic);
for(inti=0;i<10;i++){
System.out.println("producerbeginproduce=======");
producer.send(session.createTextMessage("Message:"+i));
}
}
}