3.开发Java消息驱动bean实例代码

java消息服务(JMS)是用于访问企业消息系统的开发商中立的API。企业消息系统可以协助应用软件通过网络进行消息交互。
应用程序A发送一条消息到消息服务器的某个目的地(Destination),然后消息服务器把消息转发给应用程序B。程序A和程序B没有直接的代码关联,两种实现了解偶。

消息传递系统的中心就是消息,一条Message由三个部分组成:头,属性,主体
消息有下面几种类型,他们都是派生自Message接口
StreamMessage:一种主体中包含java基元流的消息。其填充和读取均按顺序进行
MapMessage:一种主体中包含一组键值对的消息,没有定义条目顺序
TextMessage:一种主体中包含java字符串的消息(json/xml/...)
ObjectMessage:一种主体中包含序列化java对象的消息
BytesMessage:一种主体中包含字节流的消息

消息传递模型
点对点(PTP):规定了一条消息只能传递给一个接收方,采用java.jms.Queue
发布/订阅(PUB/SUB)一条消息传递给多个接收方,采用java.jms.Topic
这两个都继承自java.jms.Destination

用途
支持异步通信、消息produce和recept松耦合 
发送者把消息发送到服务器的消息队列中,接收者一一进行处理
此功能可以用在不着急将结果返回给用户的情况下,如发送电子邮件等,有助于减缓服务器的压力,尤其是在高并发的情况下。
1.配置消息目标地址
将此配置文件放入jboss-4.2.3.GA\server\default\deploy目录下,名字为 ***-service.xml(以-service.xml结尾)
<?xml version="1.0" encoding="UTF-8"?>
<server> 
 <!--配置点对点消息传送模型(Queue)-->
    <mbean code="org.jboss.mq.server.jmx.Queue" 
        name="jboss.mq.destination:service=Queue,name=myQueue">
        <!--name=myQueue:目标地址的名称,这里可能会出现因为名字起的不合理,jboss报错的情况,名字一定不要和jboss内部的冲突 -->
        <!--queue/tQueue:目标地址的JDNI名称 -->
        <attribute name="JNDIName">queue/tQueue</attribute>
        <depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
    </mbean>
    
    <!--配置发布/订阅传递模型(Topic)-->
    <mbean code="org.jboss.mq.server.jmx.Topic" name="jboss.mq.destination:service=Queue,name=myTopic">
        <attribute name="JNDIName">topic/tTopic</attribute>
        <depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
    </mbean>
</server>    

新建一个普通java项目,把jboss-4.2.3.GA\client下的所有jar包导入
2.开发点对点接收者

import javax.ejb.ActivationConfigProperty; import javax.ejb.MessageDriven; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.TextMessage; @MessageDriven( activationConfig
={ @ActivationConfigProperty (propertyName="destinationType",propertyValue="javax.jms.Queue"), //java.jms.Queue表明是点对点模式 @ActivationConfigProperty (propertyName="destination",propertyValue="queue/tQueue") // queue/tQueue对应配置文件中的JNDI名称 } ) public class QueueMessageDrivenBean implements MessageListener{//必须实现MessageListener接口 @Override public void onMessage(Message msg) { TextMessage txtmsg = (TextMessage)msg; try{ System.out.println("Queue 获取到信息:"+txtmsg.getText()); }catch(JMSException e){ e.printStackTrace(); } } }
3.开发发布/订阅接收者,在这里可以创建多个实现类,内容都如下所示
import javax.ejb.ActivationConfigProperty; import javax.ejb.MessageDriven; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.TextMessage; @MessageDriven( activationConfig
={ @ActivationConfigProperty (propertyName="destinationType",propertyValue="javax.jms.Topic"), @ActivationConfigProperty (propertyName="destination",propertyValue="topic/tTopic") } ) public class TopicMessageDrivenBean1 implements MessageListener{ @Override public void onMessage(Message msg) { TextMessage txtmsg = (TextMessage)msg; try{ System.out.println("topic1 获取到信息:"+txtmsg.getText()); }catch(JMSException e){ e.printStackTrace(); } } }

到这里,两种类型的接收者已经写好了,只需要将他们打成jar包,放入jboss-4.2.3.GA\server\default\deploy目录下即可

下面开始开发发送者

 

在src目录下新建文件jndi.properties
内容如下

java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=127.0.0.1:1099

 

点对点消息发送者
import javax.jms.Destination; import javax.jms.MessageProducer; import javax.jms.QueueConnection; import javax.jms.QueueConnectionFactory; import javax.jms.QueueSession; import javax.naming.InitialContext;
public class QueueSender { public static void main(String[] args) { QueueConnection queueConn = null; QueueSession session = null; try{ InitialContext ctx = new InitialContext(); QueueConnectionFactory queueConnectionFactory = (QueueConnectionFactory)ctx.lookup("QueueConnectionFactory"); queueConn = queueConnectionFactory.createQueueConnection(); session = queueConn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE); //javax.jms.Destination是javax.jms.Queue和javax.jms.Topic的父类 Destination destination = (Destination)ctx.lookup("queue/tQueue"); MessageProducer producer = session.createProducer(destination); producer.send(session.createTextMessage("Queue Test ..测试。。。")); //把消息发送到服务器上对应的jndi的消息队列中 //用于做异步,像邮件发送 System.out.println("发送完毕!"); }catch(Exception e){ e.printStackTrace(); }finally{ try{ if(session != null){ session.close(); } if(queueConn != null){ queueConn.close(); } }catch(Exception e){ e.printStackTrace(); } } } }

 

 

发布/订阅消息发送者
import javax.jms.Destination; import javax.jms.MessageProducer; import javax.jms.QueueConnection; import javax.jms.QueueConnectionFactory; import javax.jms.QueueSession; import javax.naming.InitialContext;
public class TopicSender { public static void main(String[] args) { QueueConnection queueConn = null; QueueSession session = null; try{ InitialContext ctx = new InitialContext(); QueueConnectionFactory queueConnectionFactory = (QueueConnectionFactory)ctx.lookup("QueueConnectionFactory"); queueConn = queueConnectionFactory.createQueueConnection(); session = queueConn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE); //javax.jms.Destination是javax.jms.Queue和javax.jms.Topic的父类 Destination destination = (Destination)ctx.lookup("topic/tTopic"); MessageProducer producer = session.createProducer(destination); producer.send(session.createTextMessage("Topic Test ..测试。。。")); //把消息发送到服务器上对应的jndi的消息队列中 //用于做异步,像邮件发送 System.out.println("发送完毕!"); }catch(Exception e){ e.printStackTrace(); }finally{ try{ if(session != null){ session.close(); } if(queueConn != null){ queueConn.close(); } }catch(Exception e){ e.printStackTrace(); } } } }

下面进行测试:

启动jboss,首先确保消息目标地址配置文件消息接受者的jar包已经放入了jboss的deploy目录下

测试点对点,运行QueueSender.java

测试发布/订阅,运行TopicSender.java

测试通过。。

 

转载于:https://www.cnblogs.com/wwzyy/p/5658025.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值