基于Topic和Queue的区别在上节已经给了说明,下面我们看看他们在创建时有什么不同之处
1.首先看看生产者
package com.ejb.mdb;
import java.util.Properties;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSession;
import javax.jms.TextMessage;
import javax.naming.InitialContext;
public class MsgProduct {
/**
* @param args
*/
public static void main(String[] args) {
QueueConnection qconn = null;
QueueSession qsession = null;
//上下文信息
Properties props = new Properties();
props.setProperty("java.naming.factory.initial",
"org.jnp.interfaces.NamingContextFactory");
props.setProperty("java.naming.provider.url", "localhost:1099");
props.setProperty("java.naming.factory.url.pkgs",
"org.jboss.naming:org.jnp.interfaces");
try {
/*初始化jndi*/
InitialContext ctx = new InitialContext(props);
/*查找链接工厂*/
QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("ConnectionFactory");
/*使用链接工厂创建jms链接*/
qconn = factory.createQueueConnection();
/*使用jms创建session*/
qsession = qconn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
/*查找目的地*/
Destination destioation = (Destination) ctx.lookup("topic/myTopic");
/*创建消息生产者*/
MessageProducer producer = qsession.createProducer(destioation);
/*创建和发布消息*/
TextMessage textMessage = qsession.createTextMessage("hello mdb!this is topic/myTopic");
producer.send(textMessage);
/*打印信息*/
System.out.println("jms消息已发出!");
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
/*关闭资源*/
qsession.close();
qconn.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
(在Topic中对于生产者来说变化的就是将消息发送到目的地的位置发生了变化,此例中是
topic/myTopic目的地,也就是配置文件中的
JNDIName的别名,下面已经标出)
2.消费者
package com.ejb.mdb;
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 = {
/**
* 设定MDB所监听消息目的的类型
*/
@ActivationConfigProperty(propertyName="destinationType"
,propertyValue="javax.jms.Topic"),//队列类型
@ActivationConfigProperty(propertyName="acknowledgeMode"
,propertyValue="Auto-acknowledge"),
/**
* 设定MDB所监听消息目的的JNDI绑定名
*/
@ActivationConfigProperty(propertyName="destination"
,propertyValue="topic/myTopic")
},
/**
* 指定MDB所监听的消息目的的JNDI绑定名
*/
mappedName="MessageQueue"
)
public class MsgCustomer implements MessageListener {
public void onMessage(Message msg) {
if(msg instanceof TextMessage){
TextMessage txt = (TextMessage) msg;
try {
String context = txt.getText();
System.out.println("JMS消息为" + context);
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
(这里可以看出消费者基于Topic在开发上与queue的不同之处在于它的队列的类型和设定MDB所监听消息目的的JNDI绑定名,JNDI绑定名就是xml配置文件的JNDIName,下面用蓝色标记出来)
3.然后是配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- $Id: mail-service.xml 62350 2007-04-15 16:50:12Z dimitris@jboss.org $ -->
<server>
<mbean code="org.jboss.mq.server.jmx.Topic" name="jboss.org.destination:server=Topic,name=myTopic" >
<attribute name="JNDIName" >topic/myTopic</attribute>
<depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
</mbean>
</server>
(在配置文件中我们可以看到topic与queue的区别在于code和那么属性上有所不同,其他则一样)
4.运行结果
a、控制台:jms消息已发出!
b、server中控制台:16:40:59,859 INFO [STDOUT] JMS消息为hello mdb!this is topic/myTopic
(可以看出消息的生产者和消费者已经正常的处理驱动消息,对上面如有疑问可email:zhenlai2011@hotmail.com)