设为首页 收藏本站
查看: 969|回复: 0

[经验分享] java message send

[复制链接]

尚未签到

发表于 2017-2-19 08:06:58 | 显示全部楼层 |阅读模式
  转自百度百科:

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  技术原理

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-344023-1-1.html 上篇帖子: 我的JavaEE学习路线图 下篇帖子: 看淘宝大牛们晒一晒淘宝网技术内幕
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表