使用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));

}

}

}

相关推荐