本文提供一个在Jboss服务器下的以jsp为消息发布客户端,MDB为消息消费者,并将消息持久化....
一、在Myeclipse中创建EJB
1.创建映射POJO类对应数据库中的表,persistence.xml根据你在Jboss中数据源的配置进行配置。代码如下:
package com.MDBExperiment;
import javax.persistence.*;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
@Entity
@Table(name="MDBtest")
public class MDB {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column(name="time")
private String time;
@Column(name="URL")
private String url;
@Column(name="ip")
private String ip;
public MDB() {
}
public Integer getId() {
return id;
}
2.创建MDB
public void setId(Integer id) {
this.id = id;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public int hashCode() {
return (this.id == null) ? 0 : this.id.hashCode();
}
public boolean equals(Object object) {
if (object instanceof MDB) {
final MDB obj = (MDB) object;
return (this.id != null) ? this.id.equals(obj.id)
: (obj.id == null);
}
return false;
}
}
package com.MDBExperiment;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import com.MDBExperiment.*;;
@MessageDriven(mappedName = "jms/QueueMDB", activationConfig = {
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/queueMDB")})
public class QueueMDB implements MessageListener {
//依赖注入(IoC)
@PersistenceContext(unitName="MDBExperimentPU")
EntityManager em; //容器对象(DAO对象)
public void onMessage(Message msg) {
// TODO Auto-generated method stub
try{
if(msg instanceof MapMessage){
MapMessage map = (MapMessage) msg;
System.out.println("[ejb2.1,queue]" + map.getString("time"));
System.out.println("[ejb2.1,queue]" + map.getString("url"));
System.out.println("[ejb2.1,queue]" + map.getString("ip"));
//write to db
MDB mdb = new MDB();
mdb.setTime(map.getString("time"));
mdb.setUrl(map.getString("url"));
mdb.setIp(map.getString("ip"));
em.persist(mdb);
}
}catch(Exception ex){
ex.printStackTrace();
}
}
}
3.创建Jboss队列
<?xml version="1.0" encoding="UTF-8" ?>
<server>
<mbean code="org.jboss.mq.server.jmx.Queue"
name="jboss.org.destination:server=Queue,name=queueMDB" >
<attribute name="JNDIName" >queue/queueMDB </attribute>
<depends optional-attribute-name = "DestinationManager" >
jboss.mq:service=DestinationManager
</depends>
</mbean>
</server>
4.创建WEB工程,编写jsp实现消息的发送
<%@ page language="java" pageEncoding="ISO-8859-1"%>
<%@ page import="javax.naming.*, javax.jms.*, java.util.Properties"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'test.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<%
QueueConnection cnn = null;
QueueSender sender = null;
QueueSession sess = null;
Queue queue = null;
MapMessage msg = null;
try {
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 ctx = new InitialContext(props);
QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("ConnectionFactory");
cnn = factory.createQueueConnection();
sess = cnn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
queue = (Queue) ctx.lookup("queue/queueMDB");
} catch (Exception e) {
out.println(e.getMessage());
}
sender = sess.createSender(queue);
String time = request.getParameter("time");
String url = request.getRequestURI().toString();
String ip = request.getRemoteAddr();
msg = sess.createMapMessage();
msg.clearBody();
msg.setString("time",time);
msg.setString("url",url);
msg.setString("ip",ip);
sender.send(msg);
sess.close ();
out.println("OK");
%>
</body>
</html>
项目发布时记得在web项目里面添加引用EJB项目,运行Jboss,打开浏览器输入url执行,再打开数据库就可以看到效果出来了....