基于JBoss开发EJB3 Message[消息驱动] Bean

基于JBoss开发EJB3 Message[消息驱动] Bean

 

环境:

JDK 1.6

jboss-4.2.3.GA-jdk6

 

>>1,配置Queue对象,在{JBOSS_HOME}\server\default\deploy里(或其子目录中,可以是多层子目录)创建一个文件名为xxx-service.xml文件,这里xxx可以任意正常字符串,这里取名为message-service.xml。

message-service.xml:

<?xml version="1.0" encoding="UTF-8"?>
<server>
  <mbean code="org.jboss.mq.server.jmx.Queue" name="jboss.mq.destination:service=Queue,name=RdsGenerateQueue">
	<attribute name="JNDIName">queue/rds/generateQueue</attribute>
    <depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
  </mbean>
</server>

当在Jboss里部署成功后,就会出现如下信息:

 

14:59:30,211 INFO  [RdsGenerateQueue] Bound to JNDI name: queue/rds/generateQueue 

>>2,开发消息发送者.这里当然有两种方式,一种是通过普通的java类来发送消息,另一种是通过EJB Session Bean来发送消息(对于企业应用中,多数使用此方式).下面将进行一一介绍.

 

普通的java类来发送消息:

package com.jerval.ejb3.mdb;

import java.util.Properties;

import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.ObjectMessage;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSession;
import javax.naming.InitialContext;

public class MainTest {

	/**
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {
		Properties properties = new Properties();
		// java.naming.factory.initial为固定写法
		// org.jnp.interfaces.NamingContextFactory 为jboss的链接工厂
		properties.setProperty("java.naming.factory.initial",
				"org.jnp.interfaces.NamingContextFactory");
		// 用于设置命名服务器的链接URL
		properties.setProperty("java.naming.provider.url", "localhost:1099");

		InitialContext ctx = new InitialContext(properties);
		QueueConnectionFactory factory = (QueueConnectionFactory) ctx
				.lookup("ConnectionFactory");
		QueueConnection connection = factory.createQueueConnection();
		QueueSession session = connection.createQueueSession(false,
				QueueSession.AUTO_ACKNOWLEDGE);
		Destination destination = (Queue) ctx.lookup("queue/rds/generateQueue");
		MessageProducer messageProducer = session.createProducer(destination);
		ObjectMessage objectMessage = session.createObjectMessage();
		objectMessage.setObject(new User(888, "jerval"));
		messageProducer.send(objectMessage);
		session.close();
		connection.close();
	}

}

 User.java :

 

 

package com.jerval.ejb3.mdb;

import java.io.Serializable;

public class User implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = -444431407185425444L;
	private Integer userId;
	private String userName;

	public User() {
	}

	public User(Integer userId, String userName) {
		super();
		this.userId = userId;
		this.userName = userName;
	}

	public Integer getUserId() {
		return userId;
	}

	public void setUserId(Integer userId) {
		this.userId = userId;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	@Override
	public String toString() {
		return "User [userId=" + userId + ", userName=" + userName + "]";
	}

}

 

通过EJB Session Bean来发送消息:

MessageSenderBean:

 

package com.jerval.ejb3.mdb;

import javax.annotation.Resource;
import javax.ejb.Local;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;

@Stateless
@Remote(MessageSenderService.class)
@Local(MessageSenderService.class)
public class MessageSenderBean implements MessageSenderService {
	@Resource(mappedName = "ConnectionFactory")
	private ConnectionFactory connectionFactory;
	@Resource(mappedName = "queue/rds/generateQueue")
	private Queue queue;

	@Override
	public void sendMessage(String guestName) throws Exception {
		Connection connection = connectionFactory.createConnection();
		Session session = connection.createSession(false,
				Session.AUTO_ACKNOWLEDGE);
		MessageProducer messageProducer = session.createProducer(queue);
		TextMessage textMessage = session.createTextMessage("Hello "
				+ guestName + ",I am jerval !");
		messageProducer.send(textMessage);
		connection.close();
	}

}

MessageSenderService:

package com.jerval.ejb3.mdb;

public interface MessageSenderService {

	void sendMessage(String guestName) throws Exception;
}

 Invode Sender Service :

package com.jerval.ejb3.mdb;

import java.util.Properties;

import javax.naming.InitialContext;

public class Test {

	/**
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		Properties properties = new Properties();
		//java.naming.factory.initial为固定写法
		//org.jnp.interfaces.NamingContextFactory 为jboss的链接工厂
		properties.setProperty("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
		//用于设置命名服务器的链接URL
		properties.setProperty("java.naming.provider.url", "localhost:1099");

		InitialContext ctx = new InitialContext(properties);  
		MessageSenderService messageSenderService = (MessageSenderService) ctx.lookup("MessageSenderBean/remote"); 
		messageSenderService.sendMessage("World");
        
	}

}

 

>>3,开发EJB3 Message[消息驱动] Bean,即消息接受者.首先将{JBOSS_HOME}\client里的所有jar放到项目的classpath . 然后创建一个名为RdsGenerateMDB的java文件,文件内容如下:

RdsGenerateMDB.java

 

package com.jerval.ejb3.mdb;

import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;
import javax.jms.TextMessage;

@MessageDriven(activationConfig = {
		@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
		@ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/rds/generateQueue") })
public class RdsGenerateMDB implements MessageListener {

	@Override
	public void onMessage(Message message) {
		try {
			if (message instanceof ObjectMessage) {
				ObjectMessage objectMessage = (ObjectMessage) message;
				User user = (User) objectMessage.getObject();
				System.out.println("User Info : " + user);
			} else if (message instanceof TextMessage) {
				TextMessage textMessage = (TextMessage) message;
				System.out.println("Text Info : " + textMessage.getText());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

当分别调用这两种方法后,后台将出现如下信息:

16:26:38,032 INFO  [STDOUT] User Info : User [userId=888, userName=jerval]

  

16:26:55,954 INFO  [STDOUT] Text Info : Hello World,I am jerval !

 

 

 

 

你可能感兴趣的:(message)