现在的位置: 首页 > 综合 > 正文

消息驱动bean(五)—发布订阅模式

2012年06月01日 ⁄ 综合 ⁄ 共 2941字 ⁄ 字号 评论关闭

MDB代码:

package com.persia.ejb;


import javax.ejb.MessageDriven;
import javax.ejb.ActivationConfigProperty;
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/mytopic")
}		
)
public class MyTopicMDB implements MessageListener {

	public void onMessage(Message msg) {
		
	try {
		TextMessage tm=(TextMessage)msg;
		System.out.println("my topic mdb 01 被调用 "+tm.getText());
	} catch (JMSException e) {
		
		e.printStackTrace();
	}
	
	}

}
总共有01,02,03这三个topic的MDB
 
客户端:
package com.persia.ejb.mdb;

import java.util.Properties;

import javax.jms.JMSException;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicPublisher;
import javax.jms.TopicSession;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class TopicMdbClient {

	/**
	 * @param args
	 * @throws NamingException 
	 * @throws JMSException 
	 */
	public static void main(String[] args) throws NamingException, JMSException {
		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");
		InitialContext context=new InitialContext(props);
		
		//获得TopicConnectionFactory对象
		TopicConnectionFactory factory=(TopicConnectionFactory) context.lookup("ConnectionFactory");
		
		//创建TopicConnection
		TopicConnection connection=factory.createTopicConnection();
		
		//创建TopicSession对象
		TopicSession session=connection.createTopicSession(false, TopicSession.AUTO_ACKNOWLEDGE);
	
		
		//获取destination对象
		Topic topic=(Topic) context.lookup("topic/mytopic");
		
		//创建文本消息
		TextMessage txt=session.createTextMessage("hello persia!");
		
		//创建发布者
		TopicPublisher publisher=session.createPublisher(topic);
		
		//发布消息
		publisher.send(txt);
		
		//关闭会话
		session.close();
		connection.close();
		
		System.out.println("消息已经发布!");
		
		
		

	}

}

 

运行结果:

19:07:28,859 INFO  [JmxKernelAbstraction] creating wrapper delegate for: org.jboss.ejb3.mdb.MDB
19:07:28,859 INFO  [JmxKernelAbstraction] installing MBean: jboss.j2ee:jar=MDBdemo.jar,name=MyTopicMDB02,service=EJB3 with dependencies:
19:07:28,859 INFO  [EJBContainer] STARTED EJB: com.persia.ejb.MyTopicMDB02 ejbName: MyTopicMDB02
19:07:28,875 INFO  [JmxKernelAbstraction] creating wrapper delegate for: org.jboss.ejb3.mdb.MDB
19:07:28,875 INFO  [JmxKernelAbstraction] installing MBean: jboss.j2ee:jar=MDBdemo.jar,name=MyTopicMDB03,service=EJB3 with dependencies:
19:07:28,890 INFO  [EJBContainer] STARTED EJB: com.persia.ejb.MyTopicMDB03 ejbName: MyTopicMDB03
19:07:28,890 INFO  [EJB3Deployer] Deployed: file:/D:/DevelopTool/jboss-4.2.2.GA/server/default/deploy/MDBdemo.jar/
19:07:34,875 INFO  [STDOUT] my topic mdb 01 被调用 hello persia!
19:07:34,875 INFO  [STDOUT] my topic mdb 03 被调用 hello persia!
19:07:34,875 INFO  [STDOUT] my topic mdb 02 被调用 hello persia!

这是与点到点方式不同的地方,点到点只允许一个消息被接收。

抱歉!评论已关闭.