基于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 !