Just a little smile ^ ^

yoyo_zeng

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

转自百度百科:

JMS

jms即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。

 

JMS(Java Messaging Service)是Java平台上有关面向消息中间件(MOM)的技术规范,它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发,翻译为Java消息服务

简介

  JMS是一种与厂商无关的 API,用来访问消息收发系统消息。它类似于 JDBC(Java Database Connectivity):这里,JDBC 是可以用来访问许多不同关系数据库的 API,而 JMS 则提供同样与厂商无关的访问方法,以访问消息收发服务。许多厂商目前都支持 JMS,包括 IBM 的 MQSeries、BEA的 Weblogic JMS service和 Progress 的 SonicMQ,这只是几个例子。 JMS 使您能够通过消息收发服务(有时称为消息中介程序或路由器)从一个 JMS 客户机向另一个 JMS客户机发送消息。消息是 JMS 中的一种类型对象, 由两部分组成:报头和消息主体。报头由路由信息以及有关该消息的元数据组成。消息主体则携带着应用程序的数据或有效负载。根据有效负载的类型来划分,可以 将消息分为几种类型,它们分别携带:简单文本 (TextMessage)、可序列化的对象 (ObjectMessage)、属性集合 (MapMessage)、字节流 (BytesMessage)、原始值流 (StreamMessage),还有无有效负载的消息 (Message)。

体系架构

JMS对象模型

  JMS对象模型包含如下几个要素:[1]   

1)连接工厂。连接工厂(ConnectionFactory)是由管理员创建,并绑定到JNDI树中。客户端使用JNDI查找连接工厂,然后利用连接工厂创建一个JMS连接。   

2)JMS连接。JMS连接(Connection)表示JMS客户端和服务器端之间的一个活动的连接,是由客户端通过调用连接工厂的方法建立的。   

3)JMS会话。JMS会话(Session)表示JMS客户与JMS服务器之间的会话状态。JMS会话建立在JMS连接上,表示客户与服务器之间的一个会话线程。   

4)JMS目的。JMS目的(Destination),又称为消息队列,是实际的消息源。   

5)JMS生产者和消费者。生产者(Message Producer)和消费者(Message Consumer)对象由Session对象创建,用于发送和接收消息。   

6)JMS消息通常有两种类型:   ① 点对点(Point-to-Point)。在点对点的消息系统中,消息分发给一个单独的使用者。点对点消息往往与队列(javax.jms.Queue)相关联。   ② 发布/订阅(Publish/Subscribe)。发布/订阅消息系统支持一个事件驱动模型,消息生产者和消费者都参与消息的传递。生产者发布事件,而使用者订阅感兴趣的事件,并使用事件。该类型消息一般与特定的主题(javax.jms.Topic)关联。

定义connection bean
<bean id="connectionFactory" //it knows how to connect to ActiveMQ(message broker)
class="org.apache.activemq.spring.ActiveMQConnectionFactory">
<propertyname="brokerURL"value="tcp://localhost:61616"/> //where the message broker
is located,jms消息提供者的地址
</bean> 定义消息队列 <bean id="queue"class="org.apache.activemq.command.ActiveMQQueue"> <constructor-argvalue="spitter.queue"/> </bean> 或者 <bean id="topic"class="org.apache.activemq.command.ActiveMQTopic"> <constructor-argvalue="spitter.topic"/> </bean>
//send message
ConnectionFactorycf=new ActiveMQConnectionFactory("tcp://localhost:61616");
Connectionconn=null;
Session session=null;
try {
  conn =cf.createConnection();//创建连接
  session=conn.createSession(false,Session.AUTO_ACKNOWLEDGE); //创建session
  Destinationdestination=new ActiveMQQueue("spitter.queue"); //消息队列
  MessageProducerproducer=session.createProducer(destination); //创建生产者
  TextMessagemessage=session.createTextMessage(); //创建消息
  message.setText("Helloworld!");
  producer.send(message); //发布
} catch(JMSExceptione){
  // handleexception?
} finally{
  try {
    if (session!=null){
    session.close();
    }
    if (conn!=null){
    conn.close();
    }
  } catch(JMSExceptionex){
  }
}

//receive message
ConnectionFactorycf=new ActiveMQConnectionFactory("tcp://localhost:61616");
Connectionconn=null;
Session session=null;
try {
  conn =cf.createConnection();
  conn.start();
  session=conn.createSession(false,Session.AUTO_ACKNOWLEDGE);
  Destinationdestination=new ActiveMQQueue("spitter.queue");
  MessageConsumerconsumer=session.createConsumer(destination);
  Messagemessage=consumer.receive();
  TextMessagetextMessage=(TextMessage)message;
  System.out.println("GOTAMESSAGE:"+textMessage.getText());
  conn.start();
} catch(JMSExceptione){
  // handleexception?
} finally{
  try {
    if (session!=null){
      session.close();
    }
    if (conn!=null){
      conn.close();
    }
  } catch(JMSExceptionex){
  }
}

 

使用jmsTemplate可以简化以上步骤,处理异常

<bean id="jmsTemplate"
class="org.springframework.jms.core.JmsTemplate">
<propertyname="connectionFactory"ref="connectionFactory"/>
<propertyname="defaultDestinationName"
value="spittle.alert.queue"/>
</bean>

 

//send message
public
classAlertServiceImplimplementsAlertService{ public void sendSpittleAlert(finalSpittlespittle){   jmsTemplate.send(     "spittle.alert.queue", //发送到的消息队列,如果jsmTemplate有设置defaultDestinationName,则可以省略这个参数     new MessageCreator(){       public MessagecreateMessage(Sessionsession) throws JMSException{         return session.createObjectMessage(spittle); //ask for an object message from the session, giving it the Spittle object to build
the object message from.       }     }   ); }   @Autowired   JmsTemplatejmsTemplate; }
//receive message
public SpittlegetAlert(){
  try {
    ObjectMessagereceivedMessage=(ObjectMessage) jmsTemplate.receive();//Receive message
    return(Spittle)receivedMessage.getObject();//Get object
  } catch(JMSExceptionjmsException){
    throwJmsUtils.convertJmsAccessException(jmsException);
  }
}
//唯一一处使用jmstemplate 需要处理异常,由于ObjectMessage’s getObject()抛出
//receive()是同步的

 

消息监听

<bean id="spittleHandler"
class="com.habuma.spitter.alerts.SpittleAlertHandler"/>

<jms:listener-containerconnection-factory="connectionFactory">
<jms:listenerdestination="spitter.alert.queue"
ref="spittleHandler"method="processSpittle"/>
</jms:listener-container>
public classSpittleAlertHandler{
    public voidprocessSpittle(Spittlespittle){
        // ...implementationgoeshere...
    }
}

参考: http://blog.csdn.net/kkdelta/article/details/5604218 

http://uh.9ria.com/space-63908-do-blog-id-7075.html   详解

http://wenku.baidu.com/view/f8af7923ccbff121dd368314.html  技术原理

 

posted on 2012-12-04 15:11  yoyo_zeng  阅读(3294)  评论(0编辑  收藏  举报