JBoss中的消息驱动bean

来源:互联网 发布:小熊猫 知乎 编辑:程序博客网 时间:2024/06/05 23:57

首先我们来解释一下什么叫做JMS,如下:


接下来我们来介绍一下相关概念:





代码的编写正式开始,首先新建一个工程,具体步骤不多说啦,记得要把JBoss中的JAR包关联到工程中。然后配置一个目标地址,如下:


来看看具体的代码:

<mbean code="org.jboss.mq.server.jmx.Queue"        name="jboss.mq.destination:service=Queue,name=itcastQueue"><!-- name 为目标地址的名称 -->        <attribute name="JNDIName">queue/itcastQueue</attribute><!-- JNDI名称的格式是确定的 -->        <depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>    </mbean>
然后,我们要把jndi.properties属性文件拷贝到此工程中,开始编写消息生成器,代码如下:

package com.zlb.app;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 {/** * @param args */public static void main(String[] args) {try {//得到JNDI初始化上下文InitialContext initialContext = new InitialContext();//根据上下文查找一个连接工厂QueueConnectionFactory.//该连接工厂是由JMS提供的,不需我们自己创建,每个厂商//都为它绑定了一个全局的JNDI,我们通过全局的JNDI便可获取QueueConnectionFactory factory = (QueueConnectionFactory)initialContext.lookup("ConnectionFactory");//从连接工厂得到一个连接QueueConnection conn = factory.createQueueConnection();//通过连接来创建一个会话QueueSession session = (QueueSession) conn.createSession(false, QueueSession.AUTO_ACKNOWLEDGE);//建立不需要事务的并且能自动确认消息已接受的会话//根据目标地址配置文件中的JNDI名称查找目标地址Destination destination = (Destination) initialContext.lookup("queue/itcastQueue");//根据会话以及目标地址来建立消息生产者(QueueSender和TopicPublisher都扩展自MessageProducer接口)MessageProducer producer = session.createProducer(destination);//消息生产者发送消息producer.send(session.createTextMessage("您好,Queue"));session.close();conn.close();System.out.println("Queue发送成功...");} catch (Exception e) {e.printStackTrace();}}}
关于QueueConnectionFactory中的全局JNDI的值我们可以根据下面的图片去查找:





再编写一下消息使用者,方法如下:


代码为:

package com.zlb.msg;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"),@ActivationConfigProperty(propertyName="destination",propertyValue="queue/itcastQueue"),@ActivationConfigProperty(propertyName="acknowledgeMode",propertyValue="Auto-acknowledge")})public class MessageDrivenBean implements MessageListener{@Overridepublic void onMessage(Message message) {TextMessage msg = (TextMessage)message;try {System.out.println(msg.getText());} catch (JMSException e) {e.printStackTrace();}}}
最后,再通过ANT编译一下即可,关于ANT的书写可以去参考:http://blog.csdn.net/zlb824/article/details/7067113,得到的结果为:


上面是PTP的消息传递模型,还有一种叫做Pub/Sub的消息传递模型在这里就不做详细介绍,方法很简单,只要把所有的Queue改为Topic即可!