关键字:JAVA JMS Active MQ XML INI Eclipse Resin
jms服务器 , active MQ 我这一篇应该是第一篇比较详细的用代码+注释介绍的中文文档了
activeMQ是一个开源的C核心的jms服务器,在国外的应用相当广泛.所以这个项目我放弃了jboss4的用数据库作为消息载体的jms服务,改用active MQ
整个项目的架构如下,用户通过http请求提交消息, webserver 收到提交请求后将消息封装到一个implements Serializable的class 然后通过active mq的 jms服务发送给server端,入库
另一个进程将处理好的记录从数据库种取出,通过httpconnection发送给 用户提供的数据接收的webservice.
程序中负责接收http请求的servlet
ToolSupport.java jms传递的基类
发送jms的class smsMQSender
接收jms的类 smsMQRecv .java
XMLAnalyse.java 分析xml配置文件的类
smsData.java 数据载体类
commTools.java 部分公共函数
HttpSend.java 将处理完的数据发送给用户提供的web接口
项目需要的lib Resin_lib ,ActiveMQ_lib
项目需要的第三方平台 Resin 2.19 ActiveMQ 3.2.2
Java sdk 1.5
项目在eclipse 3.12下完成
Resin的配置文件
resin.conf
config.xml 配置文件的格式,用来进行ip和权限验证
smsmq.ini初始化文件
#header
#Sun Feb 12 22:20:48 CST 2006
url=tcp\://localhost\:61616
durable=false
user=Khan
clientID=null
topic=false
ackMode=1
pwd=966123
subject=SMS.MQ
project=SMSMQ
sleepTime=0
timeToLive=0
HttpServer=http://127.0.0.1:8083/SmsRecv/recv
web.xml web部分布局文件
jms服务器 , active MQ 我这一篇应该是第一篇比较详细的用代码+注释介绍的中文文档了
activeMQ是一个开源的C核心的jms服务器,在国外的应用相当广泛.所以这个项目我放弃了jboss4的用数据库作为消息载体的jms服务,改用active MQ
整个项目的架构如下,用户通过http请求提交消息, webserver 收到提交请求后将消息封装到一个implements Serializable的class 然后通过active mq的 jms服务发送给server端,入库
另一个进程将处理好的记录从数据库种取出,通过httpconnection发送给 用户提供的数据接收的webservice.
程序中负责接收http请求的servlet
package
sms.khan;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.URLDecoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import sms.khan.mq.smsMQSender;
import comm.khan.LoadIni;
import comm.khan.commTools;
// import javax.naming.*;
// import javax.sql.DataSource;
public class recv extends HttpServlet {
private static final long serialVersionUID = 1L ;
public recv() {
}
private static final String CONTENT_TYPE = " text/html; charset=GBK " ;
// Initialize global variables
public void init() throws ServletException {
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
int ackMode = 1 ;
String clientID = " null " ;
boolean durable = false ;
String subject = "" ;
String url = "" ;
String pwd = "" ;
String user = "" ;
boolean topic = false ;
long timeToLive = 0 ;
long sleepTime = 0 ;
response.setContentType(CONTENT_TYPE);
PrintWriter out = response.getWriter();
InputStream in = null ;
try {
in = new BufferedInputStream( new FileInputStream( " web/config.xml " ));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
/* 获取发送者的信息 */
SmsData sd = new SmsData();
if (commTools.existPara(request, " spid " ))
sd.setSpid(request.getParameter( " spid " ));
if (commTools.existPara(request, " passwd " ))
sd.setPasswd(request.getParameter( " passwd " ));
if (commTools.existPara(request, " seq " ))
sd.setSeq(request.getParameter( " seq " ));
if (commTools.existPara(request, " port " ))
sd.setPort(request.getParameter( " port " ));
if (commTools.existPara(request, " mobile " ))
sd.setMobile(request.getParameter( " mobile " ));
if (commTools.existPara(request, " service " ))
sd.setService(request.getParameter( " service " ));
if (commTools.existPara(request, " style " ))
sd.setStyle(request.getParameter( " style " ));
if (commTools.existPara(request, " content " ))
sd.setContent(URLDecoder.decode(request.getParameter( " content " ), " GB2312 " ));
if (commTools.existPara(request, " smscid " ))
sd.setSmscid(request.getParameter( " smscid " ));
if (commTools.existPara(request, " moseq " ))
sd.setMoseq(request.getParameter( " moseq " ));
// TODO 可以在此验证spid,ip,password
XMLAnalyse.parseXml(in);
out.println( " <html> " );
out.println( " <head><title>文件读写测试</title></head> " );
out.println( " <body bgcolor=\ " #ffffff\ " > " );
out.println( " <p>content: " + sd.getContent() + " </p> " );
out.println( " <p>ip: " + request.getRemoteHost() + " port: " + request.getServerPort() + " </p> " );
out.println( " </body></html> " );
LoadIni ini = new LoadIni(); // 装载配置文件
ini.setFilename( " web " + File.separator + " smsmq.ini " );
try {
ackMode = Integer.parseInt( ini.readINI( " ackMode " ) );
clientID = ini.readINI( " clientID " );
durable = ini.readINI( " durable " ).equals( " true " ) ? true : false ;
subject = ini.readINI( " subject " );
url = ini.readINI( " url " );
pwd = ini.readINI( " pwd " );
user = ini.readINI( " user " );
topic = ini.readINI( " topic " ).equals( " true " ) ? true : false ;
timeToLive = Integer.parseInt(ini.readINI( " timeToLive " ));
sleepTime = Integer.parseInt(ini.readINI( " sleepTime " ));
} catch (IOException e){
e.printStackTrace();
} catch (Exception e){
e.printStackTrace();
}
//将数据发送到jms
smsMQSender smq = new smsMQSender(ackMode, clientID, durable,subject, url,
pwd, user, topic,timeToLive, sleepTime, sd);
smq.run();
out.flush();
out.close();
}
// Process the HTTP Post request
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
public void destroy() {
}
}
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.URLDecoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import sms.khan.mq.smsMQSender;
import comm.khan.LoadIni;
import comm.khan.commTools;
// import javax.naming.*;
// import javax.sql.DataSource;
public class recv extends HttpServlet {
private static final long serialVersionUID = 1L ;
public recv() {
}
private static final String CONTENT_TYPE = " text/html; charset=GBK " ;
// Initialize global variables
public void init() throws ServletException {
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
int ackMode = 1 ;
String clientID = " null " ;
boolean durable = false ;
String subject = "" ;
String url = "" ;
String pwd = "" ;
String user = "" ;
boolean topic = false ;
long timeToLive = 0 ;
long sleepTime = 0 ;
response.setContentType(CONTENT_TYPE);
PrintWriter out = response.getWriter();
InputStream in = null ;
try {
in = new BufferedInputStream( new FileInputStream( " web/config.xml " ));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
/* 获取发送者的信息 */
SmsData sd = new SmsData();
if (commTools.existPara(request, " spid " ))
sd.setSpid(request.getParameter( " spid " ));
if (commTools.existPara(request, " passwd " ))
sd.setPasswd(request.getParameter( " passwd " ));
if (commTools.existPara(request, " seq " ))
sd.setSeq(request.getParameter( " seq " ));
if (commTools.existPara(request, " port " ))
sd.setPort(request.getParameter( " port " ));
if (commTools.existPara(request, " mobile " ))
sd.setMobile(request.getParameter( " mobile " ));
if (commTools.existPara(request, " service " ))
sd.setService(request.getParameter( " service " ));
if (commTools.existPara(request, " style " ))
sd.setStyle(request.getParameter( " style " ));
if (commTools.existPara(request, " content " ))
sd.setContent(URLDecoder.decode(request.getParameter( " content " ), " GB2312 " ));
if (commTools.existPara(request, " smscid " ))
sd.setSmscid(request.getParameter( " smscid " ));
if (commTools.existPara(request, " moseq " ))
sd.setMoseq(request.getParameter( " moseq " ));
// TODO 可以在此验证spid,ip,password
XMLAnalyse.parseXml(in);
out.println( " <html> " );
out.println( " <head><title>文件读写测试</title></head> " );
out.println( " <body bgcolor=\ " #ffffff\ " > " );
out.println( " <p>content: " + sd.getContent() + " </p> " );
out.println( " <p>ip: " + request.getRemoteHost() + " port: " + request.getServerPort() + " </p> " );
out.println( " </body></html> " );
LoadIni ini = new LoadIni(); // 装载配置文件
ini.setFilename( " web " + File.separator + " smsmq.ini " );
try {
ackMode = Integer.parseInt( ini.readINI( " ackMode " ) );
clientID = ini.readINI( " clientID " );
durable = ini.readINI( " durable " ).equals( " true " ) ? true : false ;
subject = ini.readINI( " subject " );
url = ini.readINI( " url " );
pwd = ini.readINI( " pwd " );
user = ini.readINI( " user " );
topic = ini.readINI( " topic " ).equals( " true " ) ? true : false ;
timeToLive = Integer.parseInt(ini.readINI( " timeToLive " ));
sleepTime = Integer.parseInt(ini.readINI( " sleepTime " ));
} catch (IOException e){
e.printStackTrace();
} catch (Exception e){
e.printStackTrace();
}
//将数据发送到jms
smsMQSender smq = new smsMQSender(ackMode, clientID, durable,subject, url,
pwd, user, topic,timeToLive, sleepTime, sd);
smq.run();
out.flush();
out.close();
}
// Process the HTTP Post request
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
public void destroy() {
}
}
ToolSupport.java jms传递的基类
package
sms.khan.mq;
import org.activemq.ActiveMQConnection;
import org.activemq.ActiveMQConnectionFactory;
import org.activemq.util.IndentPrinter;
import javax.jms.Connection;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Session;
/**
* 消息传输类的抽象接口
*
* @version $Revision: 1.2 $
*/
public class ToolSupport {
/** 消息发送的目的地 */
protected Destination destination;
/** 消息池d名字 */
protected String subject = " TOOL.DEFAULT " ;
/** 点对点传输模式或订阅模式 true 订阅模式,false 点对点模式 */
protected boolean topic = false ;
protected String user = ActiveMQConnection.DEFAULT_USER;
protected String pwd = ActiveMQConnection.DEFAULT_PASSWORD;
protected String url = ActiveMQConnection.DEFAULT_BROKER_URL;
/* 消息的transacted模式 */
protected boolean transacted = false ;
/** 传递模式, 有两种模式: PERSISTENT 和NON_PERSISTENT,PERSISTENT
* 表示该消息一定要被送到目的地,否则会导致应用错误。NON_PERSISTENT
* 表示偶然丢失该消息是被允许的,这两种模式使开发者可以在消息传递的可
* 靠性和吞吐量之间找到平衡点 */
protected boolean durable = false ;
protected String clientID;
/**
* AUTO_ACKNOWLEDGE session将自动地确认收到一则消息。
* CLIENT_ACKNOWLEDGE 客户端程序将确认收到一则消息,调用这则消息的确认方法。
* DUPS_OK_ACKNOWLEDGE 这个选项命令session“懒散的”确认消息传递,可以想到,
* 这将导致消息提供者传递的一些复制消息可能会出错。这种确认的方式只应当用于消
* 息消费程序可以容忍潜在的副本消息存在的情况。 */
protected int ackMode = Session.AUTO_ACKNOWLEDGE;
protected String consumerName = " James " ;
/** 建立一个会话
* @param Connection 消息池连接
* @return Session 会话
* @exception Exception */
protected Session createSession(Connection connection) throws Exception {
Session session = connection.createSession(transacted, ackMode);
if (topic) {
destination = session.createTopic(subject); // 发布-订阅消息模式
} else {
destination = session.createQueue(subject); // 点对点消息队列模式
}
return session;
}
/** 与消息池建立连接,并准备通讯
* @return Connection 返回连接Connection
* @exception JMSException
* @exception Exception */
protected Connection createConnection() throws JMSException, Exception {
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(user, pwd, url);
Connection connection = connectionFactory.createConnection();
if (durable && clientID != null ) {
connection.setClientID(clientID);
}
connection.start(); // 开始消息传递
return connection;
}
/** 关闭连接和会话
* @param Connection 连接
* @param Session 会话
* @exception JMSException */
protected void close(Connection connection, Session session) throws JMSException {
// lets dump the stats
// dumpStats(connection);
if (session != null ) {
session.close();
}
if (connection != null ) {
connection.close();
}
}
/** 打印当前连接的状态信息
* @param Connection 连接 */
protected void dumpStats(Connection connection) {
ActiveMQConnection c = (ActiveMQConnection) connection;
c.getConnectionStats().dump( new IndentPrinter());
}
}
import org.activemq.ActiveMQConnection;
import org.activemq.ActiveMQConnectionFactory;
import org.activemq.util.IndentPrinter;
import javax.jms.Connection;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Session;
/**
* 消息传输类的抽象接口
*
* @version $Revision: 1.2 $
*/
public class ToolSupport {
/** 消息发送的目的地 */
protected Destination destination;
/** 消息池d名字 */
protected String subject = " TOOL.DEFAULT " ;
/** 点对点传输模式或订阅模式 true 订阅模式,false 点对点模式 */
protected boolean topic = false ;
protected String user = ActiveMQConnection.DEFAULT_USER;
protected String pwd = ActiveMQConnection.DEFAULT_PASSWORD;
protected String url = ActiveMQConnection.DEFAULT_BROKER_URL;
/* 消息的transacted模式 */
protected boolean transacted = false ;
/** 传递模式, 有两种模式: PERSISTENT 和NON_PERSISTENT,PERSISTENT
* 表示该消息一定要被送到目的地,否则会导致应用错误。NON_PERSISTENT
* 表示偶然丢失该消息是被允许的,这两种模式使开发者可以在消息传递的可
* 靠性和吞吐量之间找到平衡点 */
protected boolean durable = false ;
protected String clientID;
/**
* AUTO_ACKNOWLEDGE session将自动地确认收到一则消息。
* CLIENT_ACKNOWLEDGE 客户端程序将确认收到一则消息,调用这则消息的确认方法。
* DUPS_OK_ACKNOWLEDGE 这个选项命令session“懒散的”确认消息传递,可以想到,
* 这将导致消息提供者传递的一些复制消息可能会出错。这种确认的方式只应当用于消
* 息消费程序可以容忍潜在的副本消息存在的情况。 */
protected int ackMode = Session.AUTO_ACKNOWLEDGE;
protected String consumerName = " James " ;
/** 建立一个会话
* @param Connection 消息池连接
* @return Session 会话
* @exception Exception */
protected Session createSession(Connection connection) throws Exception {
Session session = connection.createSession(transacted, ackMode);
if (topic) {
destination = session.createTopic(subject); // 发布-订阅消息模式
} else {
destination = session.createQueue(subject); // 点对点消息队列模式
}
return session;
}
/** 与消息池建立连接,并准备通讯
* @return Connection 返回连接Connection
* @exception JMSException
* @exception Exception */
protected Connection createConnection() throws JMSException, Exception {
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(user, pwd, url);
Connection connection = connectionFactory.createConnection();
if (durable && clientID != null ) {
connection.setClientID(clientID);
}
connection.start(); // 开始消息传递
return connection;
}
/** 关闭连接和会话
* @param Connection 连接
* @param Session 会话
* @exception JMSException */
protected void close(Connection connection, Session session) throws JMSException {
// lets dump the stats
// dumpStats(connection);
if (session != null ) {
session.close();
}
if (connection != null ) {
connection.close();
}
}
/** 打印当前连接的状态信息
* @param Connection 连接 */
protected void dumpStats(Connection connection) {
ActiveMQConnection c = (ActiveMQConnection) connection;
c.getConnectionStats().dump( new IndentPrinter());
}
}
发送jms的class smsMQSender
package
sms.khan.mq;
import javax.jms.Connection;
import javax.jms.DeliveryMode;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.ObjectMessage;
// import javax.jms.TextMessage;
/** 发送一个object到指定消息池
* */
public class smsMQSender extends ToolSupport {
private long timeToLive;
protected long sleepTime = 0L ;
private Object object;
// "1000 255 null"
/** 构造器
* @param int ackMode
* @param String ClientID
* @param boolean durable
* @param String subject
* @param String url
* @param String pwd
* @param String user
* @param boolean topic
* @param long timeToLive
* @param long sleepTime
* @param Object object
* */
public smsMQSender( int ackMode, String clientID, boolean durable,
String subject, String url, String pwd, String user, boolean topic,
long timeToLive, long sleepTime, Object object) {
this .ackMode = ackMode;
this .clientID = clientID; //
this .durable = durable; // false
this .subject = subject; // TEST.FOO
this .url = url; // localhost:61616
this .pwd = pwd;
this .user = user;
this .topic = topic; // false
this .timeToLive = timeToLive;
this .sleepTime = sleepTime;
this .object = object;
}
/** 连接消息池并发送消息 */
public void run() {
try {
System.out.println( " 连接到 to URL: " + url);
System.out.println( " 发送消息到 " + (topic ? " topic " : " queue " ) + " : " + subject);
System.out.println( " 使用 " + (durable ? " durable " : " non-durable " ) + " 传递模式 " );
if (timeToLive != 0 ) {
System.out.println( " 消息的生存期为 " + timeToLive + " ms " );
}
Connection connection = createConnection(); // 建立一个消息池的连接
Session session = createSession(connection); // 建立会话
MessageProducer producer = createProducer(session); // 建立消息生产者
sendLoop(session, producer);
System.out.println( " 完成. " );
close(connection, session);
} catch (Exception e) {
System.out.println( " Caught: " + e);
e.printStackTrace();
}
}
/**
* 建立消息生产者
* @param Session 会话
* @return MessageProducer 消息生产者
* @exception JMSException
*/
protected MessageProducer createProducer(Session session) throws JMSException {
MessageProducer producer = session.createProducer(destination);
if (durable) {
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
} else {
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
}
if (timeToLive != 0 )
producer.setTimeToLive(timeToLive);
return producer;
}
/** 循环发送消息
* @param Session
* @param MessageProducer
* @exception Exception */
protected void sendLoop(Session session, MessageProducer producer) throws Exception {
ObjectMessage message = session.createObjectMessage();
message.setObject((sms.khan.SmsData)object);
producer.send(message);
if (transacted) {
session.commit();
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
import javax.jms.Connection;
import javax.jms.DeliveryMode;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.ObjectMessage;
// import javax.jms.TextMessage;
/** 发送一个object到指定消息池
* */
public class smsMQSender extends ToolSupport {
private long timeToLive;
protected long sleepTime = 0L ;
private Object object;
// "1000 255 null"
/** 构造器
* @param int ackMode
* @param String ClientID
* @param boolean durable
* @param String subject
* @param String url
* @param String pwd
* @param String user
* @param boolean topic
* @param long timeToLive
* @param long sleepTime
* @param Object object
* */
public smsMQSender( int ackMode, String clientID, boolean durable,
String subject, String url, String pwd, String user, boolean topic,
long timeToLive, long sleepTime, Object object) {
this .ackMode = ackMode;
this .clientID = clientID; //
this .durable = durable; // false
this .subject = subject; // TEST.FOO
this .url = url; // localhost:61616
this .pwd = pwd;
this .user = user;
this .topic = topic; // false
this .timeToLive = timeToLive;
this .sleepTime = sleepTime;
this .object = object;
}
/** 连接消息池并发送消息 */
public void run() {
try {
System.out.println( " 连接到 to URL: " + url);
System.out.println( " 发送消息到 " + (topic ? " topic " : " queue " ) + " : " + subject);
System.out.println( " 使用 " + (durable ? " durable " : " non-durable " ) + " 传递模式 " );
if (timeToLive != 0 ) {
System.out.println( " 消息的生存期为 " + timeToLive + " ms " );
}
Connection connection = createConnection(); // 建立一个消息池的连接
Session session = createSession(connection); // 建立会话
MessageProducer producer = createProducer(session); // 建立消息生产者
sendLoop(session, producer);
System.out.println( " 完成. " );
close(connection, session);
} catch (Exception e) {
System.out.println( " Caught: " + e);
e.printStackTrace();
}
}
/**
* 建立消息生产者
* @param Session 会话
* @return MessageProducer 消息生产者
* @exception JMSException
*/
protected MessageProducer createProducer(Session session) throws JMSException {
MessageProducer producer = session.createProducer(destination);
if (durable) {
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
} else {
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
}
if (timeToLive != 0 )
producer.setTimeToLive(timeToLive);
return producer;
}
/** 循环发送消息
* @param Session
* @param MessageProducer
* @exception Exception */
protected void sendLoop(Session session, MessageProducer producer) throws Exception {
ObjectMessage message = session.createObjectMessage();
message.setObject((sms.khan.SmsData)object);
producer.send(message);
if (transacted) {
session.commit();
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
接收jms的类 smsMQRecv .java
package
sms.khan.mq;
import java.io.File;
import java.io.IOException;
import javax.jms.Connection;
import javax.jms.ExceptionListener;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.ObjectMessage;
import javax.jms.Topic;
import comm.khan.LoadIni;
import sms.khan.SmsData;
/**
* 接收类,消费者模型
* @version $Revision: 1.1.1.1 $
*/
public class smsMQRecv extends ToolSupport implements MessageListener, ExceptionListener {
protected int count = 0 ;
protected int dumpCount = 10 ;
protected boolean verbose = true ;
protected int maximumMessages = 0 ;
private boolean pauseBeforeShutdown;
private boolean running;
private Session session;
private long sleepTime = 0 ;
/** 构造器
* */
public smsMQRecv(){
}
public static void main(String[] args) {
smsMQRecv tool = new smsMQRecv();
LoadIni ini = new LoadIni(); // 装载配置文件
ini.setFilename( " web " + File.separator + " smsmq.ini " );
try {
tool.clientID = ini.readINI( " clientID " );
tool.durable = ini.readINI( " durable " ).equals( " true " ) ? true : false ;
tool.subject = ini.readINI( " subject " );
tool.url = ini.readINI( " url " );
tool.topic = ini.readINI( " topic " ).equals( " true " ) ? true : false ;
tool.sleepTime = Integer.parseInt(ini.readINI( " sleepTime " ));
} catch (IOException e){
e.printStackTrace();
} catch (Exception e){
e.printStackTrace();
}
if (args.length > 4 ) {
tool.maximumMessages = Integer.parseInt(args[ 4 ]);
}
// if (args.length > 6) {
// tool.transacted = "true".equals(args[6]);
// }
tool.run();
}
public void run() {
try {
running = true ;
System.out.println( " 连接到服务器: " + url);
System.out.println( " Consuming " + (topic ? " topic " : " queue " ) + " : " + subject);
System.out.println( " Using " + (durable ? " durable " : " non-durable " ) + " subscription " );
Connection connection = createConnection(); // 建立一个消息池连接
connection.setExceptionListener( this ); // 设置ExceptionListener为this ,因为this implements ExceptionListener
session = createSession(connection);
MessageConsumer consumer = null ; // 建立一个消息消费者
if (durable && topic) {
consumer = session.createDurableSubscriber((Topic) destination, consumerName);
} else {
consumer = session.createConsumer(destination);
}
if (maximumMessages <= 0 ) {
consumer.setMessageListener( this );
}
if (maximumMessages > 0 ) {
consumeMessagesAndClose(connection, session, consumer);
}
} catch (Exception e) {
System.out.println( " Caught: " + e);
e.printStackTrace();
}
}
/** MessageListener 的abstract 接口
* @param Message 从消息池接收到的消息 */
public void onMessage(Message message) {
try {
if (message instanceof ObjectMessage) {
ObjectMessage Msg = ((ObjectMessage) message);
SmsData sd = (SmsData)(Msg.getObject());
System.out.println(sd.getMobile() + sd.getContent());
if (verbose) System.out.println( " Received: " + sd.getMobile());
} else {
if (verbose) System.out.println( " Received: " + message);
}
if (transacted) {
session.commit();
}
} catch (JMSException e) {
System.out.println( " Caught: " + e);
e.printStackTrace();
} finally {
if (sleepTime > 0 ) {
try {
Thread.sleep(sleepTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/** ExceptionListener的abstract 接口
* @param JMSException 接收到的JMS异常 */
synchronized public void onException(JMSException ex) {
System.out.println( " JMS Exception occured. Shutting down client. " );
running = false ;
}
/** 检测实例是否正在运行 */
synchronized boolean isRunning() {
return running;
}
protected void consumeMessagesAndClose(Connection connection, Session session,
MessageConsumer consumer) throws JMSException, IOException {
System.out.println( " 系统等待,直到接收到 " + maximumMessages + " 条消息再退出 " );
while ( isRunning()){
Message message = consumer.receive();
onMessage(message);
}
/*
for (int i = 0; i < maximumMessages && isRunning();) {
Message message = consumer.receive(10);
if (message != null) {
i++;
onMessage(message);
}
} */
System.out.println( " Closing connection " );
consumer.close();
session.close();
connection.close();
if (pauseBeforeShutdown) {
System.out.println( " Press return to shut down " );
System.in.read();
}
}
}
import java.io.File;
import java.io.IOException;
import javax.jms.Connection;
import javax.jms.ExceptionListener;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.ObjectMessage;
import javax.jms.Topic;
import comm.khan.LoadIni;
import sms.khan.SmsData;
/**
* 接收类,消费者模型
* @version $Revision: 1.1.1.1 $
*/
public class smsMQRecv extends ToolSupport implements MessageListener, ExceptionListener {
protected int count = 0 ;
protected int dumpCount = 10 ;
protected boolean verbose = true ;
protected int maximumMessages = 0 ;
private boolean pauseBeforeShutdown;
private boolean running;
private Session session;
private long sleepTime = 0 ;
/** 构造器
* */
public smsMQRecv(){
}
public static void main(String[] args) {
smsMQRecv tool = new smsMQRecv();
LoadIni ini = new LoadIni(); // 装载配置文件
ini.setFilename( " web " + File.separator + " smsmq.ini " );
try {
tool.clientID = ini.readINI( " clientID " );
tool.durable = ini.readINI( " durable " ).equals( " true " ) ? true : false ;
tool.subject = ini.readINI( " subject " );
tool.url = ini.readINI( " url " );
tool.topic = ini.readINI( " topic " ).equals( " true " ) ? true : false ;
tool.sleepTime = Integer.parseInt(ini.readINI( " sleepTime " ));
} catch (IOException e){
e.printStackTrace();
} catch (Exception e){
e.printStackTrace();
}
if (args.length > 4 ) {
tool.maximumMessages = Integer.parseInt(args[ 4 ]);
}
// if (args.length > 6) {
// tool.transacted = "true".equals(args[6]);
// }
tool.run();
}
public void run() {
try {
running = true ;
System.out.println( " 连接到服务器: " + url);
System.out.println( " Consuming " + (topic ? " topic " : " queue " ) + " : " + subject);
System.out.println( " Using " + (durable ? " durable " : " non-durable " ) + " subscription " );
Connection connection = createConnection(); // 建立一个消息池连接
connection.setExceptionListener( this ); // 设置ExceptionListener为this ,因为this implements ExceptionListener
session = createSession(connection);
MessageConsumer consumer = null ; // 建立一个消息消费者
if (durable && topic) {
consumer = session.createDurableSubscriber((Topic) destination, consumerName);
} else {
consumer = session.createConsumer(destination);
}
if (maximumMessages <= 0 ) {
consumer.setMessageListener( this );
}
if (maximumMessages > 0 ) {
consumeMessagesAndClose(connection, session, consumer);
}
} catch (Exception e) {
System.out.println( " Caught: " + e);
e.printStackTrace();
}
}
/** MessageListener 的abstract 接口
* @param Message 从消息池接收到的消息 */
public void onMessage(Message message) {
try {
if (message instanceof ObjectMessage) {
ObjectMessage Msg = ((ObjectMessage) message);
SmsData sd = (SmsData)(Msg.getObject());
System.out.println(sd.getMobile() + sd.getContent());
if (verbose) System.out.println( " Received: " + sd.getMobile());
} else {
if (verbose) System.out.println( " Received: " + message);
}
if (transacted) {
session.commit();
}
} catch (JMSException e) {
System.out.println( " Caught: " + e);
e.printStackTrace();
} finally {
if (sleepTime > 0 ) {
try {
Thread.sleep(sleepTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/** ExceptionListener的abstract 接口
* @param JMSException 接收到的JMS异常 */
synchronized public void onException(JMSException ex) {
System.out.println( " JMS Exception occured. Shutting down client. " );
running = false ;
}
/** 检测实例是否正在运行 */
synchronized boolean isRunning() {
return running;
}
protected void consumeMessagesAndClose(Connection connection, Session session,
MessageConsumer consumer) throws JMSException, IOException {
System.out.println( " 系统等待,直到接收到 " + maximumMessages + " 条消息再退出 " );
while ( isRunning()){
Message message = consumer.receive();
onMessage(message);
}
/*
for (int i = 0; i < maximumMessages && isRunning();) {
Message message = consumer.receive(10);
if (message != null) {
i++;
onMessage(message);
}
} */
System.out.println( " Closing connection " );
consumer.close();
session.close();
connection.close();
if (pauseBeforeShutdown) {
System.out.println( " Press return to shut down " );
System.in.read();
}
}
}
XMLAnalyse.java 分析xml配置文件的类
package
sms.khan;
import java.io. * ;
import java.io.FileInputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom. * ;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;
public class XMLAnalyse {
public XMLAnalyse() {
}
public static void main(String args[]) {
InputStream in = null ;
// byte[] buf = new byte[255];
try {
in = new BufferedInputStream( new FileInputStream( " web/config.xml " ));
/* while (in.read(buf) != -1) {
for (int i = 0; i < 255; i++) {
if (buf[i] == 0) break;
System.out.print((char) buf[i]);
buf[i] = '\0';
}
}
System.out.print('\n');
in = new BufferedInputStream(new FileInputStream("web/config.xml")); */
} catch (FileNotFoundException e) {
e.printStackTrace();
} // catch (IOException e) {
// e.printStackTrace();
// }
XMLAnalyse.parseXml(in);
}
public static int parseXml(InputStream inputstream) {
DocumentBuilderFactory df = DocumentBuilderFactory.newInstance();
DocumentBuilder doc = null ;
try {
doc = df.newDocumentBuilder();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
Document document = null ;
try {
document = doc.parse(inputstream);
} catch (DOMException dom) {
dom.printStackTrace();
} catch (SAXException ioe) {
ioe.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Element root = document.getDocumentElement();
for ( int i = 0 ; i < root.getChildNodes().getLength(); i ++ ) {
NodeList nl = root.getChildNodes().item(i).getChildNodes();
int len = nl.getLength();
if ( len > 1 ) {
System.out.println( " 处理sp名单 " );
for ( int j = 0 ; j < len; j ++ ) {
String name = nl.item(j).getNodeName();
if ( ! name.equals( " #text " )){ // 回车和空格会产生的nodename "#text"
System.out.println( " name: " + name + " value: " + nl.item(j).getLastChild().getNodeValue());
}
}
}
}
return 0 ;
}
}
import java.io. * ;
import java.io.FileInputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom. * ;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;
public class XMLAnalyse {
public XMLAnalyse() {
}
public static void main(String args[]) {
InputStream in = null ;
// byte[] buf = new byte[255];
try {
in = new BufferedInputStream( new FileInputStream( " web/config.xml " ));
/* while (in.read(buf) != -1) {
for (int i = 0; i < 255; i++) {
if (buf[i] == 0) break;
System.out.print((char) buf[i]);
buf[i] = '\0';
}
}
System.out.print('\n');
in = new BufferedInputStream(new FileInputStream("web/config.xml")); */
} catch (FileNotFoundException e) {
e.printStackTrace();
} // catch (IOException e) {
// e.printStackTrace();
// }
XMLAnalyse.parseXml(in);
}
public static int parseXml(InputStream inputstream) {
DocumentBuilderFactory df = DocumentBuilderFactory.newInstance();
DocumentBuilder doc = null ;
try {
doc = df.newDocumentBuilder();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
Document document = null ;
try {
document = doc.parse(inputstream);
} catch (DOMException dom) {
dom.printStackTrace();
} catch (SAXException ioe) {
ioe.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Element root = document.getDocumentElement();
for ( int i = 0 ; i < root.getChildNodes().getLength(); i ++ ) {
NodeList nl = root.getChildNodes().item(i).getChildNodes();
int len = nl.getLength();
if ( len > 1 ) {
System.out.println( " 处理sp名单 " );
for ( int j = 0 ; j < len; j ++ ) {
String name = nl.item(j).getNodeName();
if ( ! name.equals( " #text " )){ // 回车和空格会产生的nodename "#text"
System.out.println( " name: " + name + " value: " + nl.item(j).getLastChild().getNodeValue());
}
}
}
}
return 0 ;
}
}
smsData.java 数据载体类
package
sms.khan;
import java.io.Serializable;
// import comm.khan.commTools;
public class SmsData implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L ;
private String spid = "" ;
private String passwd = "" ;
private String seq = "" ;
private String port = "" ;
private String mobile = "" ;
private String service = "" ;
private String style = "" ;
private String content = "" ;
private String smscid = "" ;
private String moseq = "" ;
public SmsData(){}
public SmsData(String content,String mobile,
String moseq,String passwd,String port,
String seq,String service,String smscid,
String spid,String style) {
this .content = content;
this .mobile = mobile;
this .moseq = moseq;
this .passwd = passwd;
this .port = port;
this .seq = seq;
this .service = service;
this .smscid = smscid;
this .spid = spid;
this .style = style;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this .content = content;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this .mobile = mobile;
}
public String getMoseq() {
return moseq;
}
public void setMoseq(String moseq) {
this .moseq = moseq;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this .passwd = passwd;
}
public String getPort() {
return port;
}
public void setPort(String port) {
this .port = port;
}
public String getSeq() {
return seq;
}
public void setSeq(String seq) {
this .seq = seq;
}
public String getService() {
return service;
}
public void setService(String service) {
this .service = service;
}
public String getSmscid() {
return smscid;
}
public void setSmscid(String smscid) {
this .smscid = smscid;
}
public String getSpid() {
return spid;
}
public void setSpid(String spid) {
this .spid = spid;
}
public String getStyle() {
return style;
}
public void setStyle(String style) {
this .style = style;
}
}
import java.io.Serializable;
// import comm.khan.commTools;
public class SmsData implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L ;
private String spid = "" ;
private String passwd = "" ;
private String seq = "" ;
private String port = "" ;
private String mobile = "" ;
private String service = "" ;
private String style = "" ;
private String content = "" ;
private String smscid = "" ;
private String moseq = "" ;
public SmsData(){}
public SmsData(String content,String mobile,
String moseq,String passwd,String port,
String seq,String service,String smscid,
String spid,String style) {
this .content = content;
this .mobile = mobile;
this .moseq = moseq;
this .passwd = passwd;
this .port = port;
this .seq = seq;
this .service = service;
this .smscid = smscid;
this .spid = spid;
this .style = style;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this .content = content;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this .mobile = mobile;
}
public String getMoseq() {
return moseq;
}
public void setMoseq(String moseq) {
this .moseq = moseq;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this .passwd = passwd;
}
public String getPort() {
return port;
}
public void setPort(String port) {
this .port = port;
}
public String getSeq() {
return seq;
}
public void setSeq(String seq) {
this .seq = seq;
}
public String getService() {
return service;
}
public void setService(String service) {
this .service = service;
}
public String getSmscid() {
return smscid;
}
public void setSmscid(String smscid) {
this .smscid = smscid;
}
public String getSpid() {
return spid;
}
public void setSpid(String spid) {
this .spid = spid;
}
public String getStyle() {
return style;
}
public void setStyle(String style) {
this .style = style;
}
}
commTools.java 部分公共函数
package
comm.khan;
import java.util.HashMap;
// import java.util.Iterator;
import javax.servlet.http. * ;
import java.util.Enumeration;
public class commTools {
public commTools() {
// TODO Auto-generated constructor stub
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
/** 取得所有得参数列表
* @param req HttpServletRequest
* @return HashMap 返回包含参数列表的HashMap
*/
public static HashMap getParas(HttpServletRequest req) {
HashMap hm = new HashMap();
Enumeration ea = req.getParameterNames();
while (ea.hasMoreElements()) {
String s = (String) ea.nextElement();
hm.put(s, req.getParameter(s));
}
return hm;
}
/** 取得http head
* @param req HttpServletRequest
* @return HashMap
*/
public static HashMap gethead(HttpServletRequest req) {
HashMap hm = new HashMap();
Enumeration ea = req.getHeaderNames();
while (ea.hasMoreElements()) {
String s = (String) ea.nextElement();
hm.put(s, req.getHeader(s));
}
return hm;
}
/** 检测参数列表中是否存在某个参数
* @param req HttpServletRequest
* @param para String 参数名
* @return boolean 是否存在这个参数
*/
public static boolean existPara(HttpServletRequest req, String para) {
HashMap hm = getParas(req);
return hm.containsKey(para);
}
}
import java.util.HashMap;
// import java.util.Iterator;
import javax.servlet.http. * ;
import java.util.Enumeration;
public class commTools {
public commTools() {
// TODO Auto-generated constructor stub
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
/** 取得所有得参数列表
* @param req HttpServletRequest
* @return HashMap 返回包含参数列表的HashMap
*/
public static HashMap getParas(HttpServletRequest req) {
HashMap hm = new HashMap();
Enumeration ea = req.getParameterNames();
while (ea.hasMoreElements()) {
String s = (String) ea.nextElement();
hm.put(s, req.getParameter(s));
}
return hm;
}
/** 取得http head
* @param req HttpServletRequest
* @return HashMap
*/
public static HashMap gethead(HttpServletRequest req) {
HashMap hm = new HashMap();
Enumeration ea = req.getHeaderNames();
while (ea.hasMoreElements()) {
String s = (String) ea.nextElement();
hm.put(s, req.getHeader(s));
}
return hm;
}
/** 检测参数列表中是否存在某个参数
* @param req HttpServletRequest
* @param para String 参数名
* @return boolean 是否存在这个参数
*/
public static boolean existPara(HttpServletRequest req, String para) {
HashMap hm = getParas(req);
return hm.containsKey(para);
}
}
HttpSend.java 将处理完的数据发送给用户提供的web接口
/**
*
*/
package sms.khan;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* @author Administrator
*
*/
public class HttpSend {
/**
* 构造器
*/
public HttpSend() {
}
private static String log = null ;
public String connectURL(String dest_url, String commString) {
String rec_string = "" ;
URL url = null ;
HttpURLConnection urlconn = null ;
try {
url = new URL(dest_url);
urlconn = (HttpURLConnection) url.openConnection();
urlconn.setRequestProperty( " content-type " , " text/plain " );
urlconn.setRequestProperty( " User-Agent " , " Khan HttpConnection request " );
urlconn.setRequestProperty( " Content-Language " , " en-US " );
urlconn.setRequestMethod( " POST " );
urlconn.setDoInput( true );
urlconn.setDoOutput( true );
OutputStream out = urlconn.getOutputStream();
out.write(commString.getBytes( " UTF-8 " ));
out.flush();
out.close();
BufferedReader rd = new BufferedReader( new InputStreamReader(urlconn.getInputStream()));
StringBuffer sb = new StringBuffer();
int ch;
while ((ch = rd.read()) > - 1 )
sb.append(( char ) ch);
rec_string = sb.toString();
rd.close();
urlconn.disconnect();
} catch (Exception e) {
log = String.valueOf(String.valueOf(( new StringBuffer( " 请求错误: " )).append(e.getMessage()).append(e.toString())));
System.out.println( " log = " + log);
}
return rec_string;
}
/**
* @param args
*/
public static void main(String[] args) {
String url = "" ;
comm.khan.LoadIni li = new comm.khan.LoadIni();
try {
url = li.readINI( " httpServer " );
} catch (java.io.IOException e){
e.printStackTrace();
} catch (Exception e){
e.printStackTrace();
}
HttpSend hc = new HttpSend();
String xml = "" ;
String s = hc.connectURL(url, xml);
System.out.println( " Recived: " .concat(String.valueOf(String.valueOf(s))));
}
}
*
*/
package sms.khan;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* @author Administrator
*
*/
public class HttpSend {
/**
* 构造器
*/
public HttpSend() {
}
private static String log = null ;
public String connectURL(String dest_url, String commString) {
String rec_string = "" ;
URL url = null ;
HttpURLConnection urlconn = null ;
try {
url = new URL(dest_url);
urlconn = (HttpURLConnection) url.openConnection();
urlconn.setRequestProperty( " content-type " , " text/plain " );
urlconn.setRequestProperty( " User-Agent " , " Khan HttpConnection request " );
urlconn.setRequestProperty( " Content-Language " , " en-US " );
urlconn.setRequestMethod( " POST " );
urlconn.setDoInput( true );
urlconn.setDoOutput( true );
OutputStream out = urlconn.getOutputStream();
out.write(commString.getBytes( " UTF-8 " ));
out.flush();
out.close();
BufferedReader rd = new BufferedReader( new InputStreamReader(urlconn.getInputStream()));
StringBuffer sb = new StringBuffer();
int ch;
while ((ch = rd.read()) > - 1 )
sb.append(( char ) ch);
rec_string = sb.toString();
rd.close();
urlconn.disconnect();
} catch (Exception e) {
log = String.valueOf(String.valueOf(( new StringBuffer( " 请求错误: " )).append(e.getMessage()).append(e.toString())));
System.out.println( " log = " + log);
}
return rec_string;
}
/**
* @param args
*/
public static void main(String[] args) {
String url = "" ;
comm.khan.LoadIni li = new comm.khan.LoadIni();
try {
url = li.readINI( " httpServer " );
} catch (java.io.IOException e){
e.printStackTrace();
} catch (Exception e){
e.printStackTrace();
}
HttpSend hc = new HttpSend();
String xml = "" ;
String s = hc.connectURL(url, xml);
System.out.println( " Recived: " .concat(String.valueOf(String.valueOf(s))));
}
}
项目需要的lib Resin_lib ,ActiveMQ_lib
项目需要的第三方平台 Resin 2.19 ActiveMQ 3.2.2
Java sdk 1.5
项目在eclipse 3.12下完成
Resin的配置文件
resin.conf
<
caucho
.com
>
< java compiler ="internal" args ="-g" work-dir ="work" />
< http-server >
< http port ="8083" />
< web-app id ="/SmsRecv" >
< app-dir > D:\Develop\eclipse\Workspace\SmsRecv\web </ app-dir >
< servlet-mapping url-pattern ="/servlet/*" servlet-name ="invoker" />
< servlet-mapping url-pattern ='*.xtp' servlet-name ='com.caucho.jsp.XtpServlet'/>
<servlet-mapping url-pattern ='*.jsp' servlet-name ='com.caucho.jsp.JspServlet'/>
</web-app >
</ http-server >
</ caucho.com >
< java compiler ="internal" args ="-g" work-dir ="work" />
< http-server >
< http port ="8083" />
< web-app id ="/SmsRecv" >
< app-dir > D:\Develop\eclipse\Workspace\SmsRecv\web </ app-dir >
< servlet-mapping url-pattern ="/servlet/*" servlet-name ="invoker" />
< servlet-mapping url-pattern ='*.xtp' servlet-name ='com.caucho.jsp.XtpServlet'/>
<servlet-mapping url-pattern ='*.jsp' servlet-name ='com.caucho.jsp.JspServlet'/>
</web-app >
</ http-server >
</ caucho.com >
config.xml 配置文件的格式,用来进行ip和权限验证
<?
xml version="1.0" encoding="UTF-8"
?>
< sp_command version ="1.0" >
< pack_name > sp_config </ pack_name >
< SpConfig >
< spid > khan </ spid >
< spip > 192.18.1.59 </ spip >
< sppwd > 966123 </ sppwd >
</ SpConfig >
< SpConfig >
< spid > holly </ spid >
< spip > 192.18.1.122 </ spip >
< sppwd > 123456 </ sppwd >
</ SpConfig >
</ sp_command >
< sp_command version ="1.0" >
< pack_name > sp_config </ pack_name >
< SpConfig >
< spid > khan </ spid >
< spip > 192.18.1.59 </ spip >
< sppwd > 966123 </ sppwd >
</ SpConfig >
< SpConfig >
< spid > holly </ spid >
< spip > 192.18.1.122 </ spip >
< sppwd > 123456 </ sppwd >
</ SpConfig >
</ sp_command >
smsmq.ini初始化文件
#header
#Sun Feb 12 22:20:48 CST 2006
url=tcp\://localhost\:61616
durable=false
user=Khan
clientID=null
topic=false
ackMode=1
pwd=966123
subject=SMS.MQ
project=SMSMQ
sleepTime=0
timeToLive=0
HttpServer=http://127.0.0.1:8083/SmsRecv/recv
web.xml web部分布局文件
<?
xml version="1.0" encoding="UTF-8"
?>
<! DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
< web-app >
< display-name > SmsRecv </ display-name >
< servlet >
< servlet-name > recv </ servlet-name >
< servlet-class > sms.khan.recv </ servlet-class >
</ servlet >
< servlet-mapping >
< servlet-name > recv </ servlet-name >
< url-pattern > /recv </ url-pattern >
</ servlet-mapping >
< resource-ref >
< res-ref-name > jdbc/Sql </ res-ref-name >
< res-type > javax.sql.DataSource </ res-type >
< init-param driver-name ="com.microsoft.jdbc.sqlserver.SQLServerDriver" />
< init-param url ="jdbc:microsoft:sqlserver://Khan:1433;databaseName=WapServer" />
< init-param user ="sa" />
< init-param password ="" />
< init-param max-connections ="20" />
< init-param max-idle-time ="30" />
</ resource-ref >
</ web-app >
<! DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
< web-app >
< display-name > SmsRecv </ display-name >
< servlet >
< servlet-name > recv </ servlet-name >
< servlet-class > sms.khan.recv </ servlet-class >
</ servlet >
< servlet-mapping >
< servlet-name > recv </ servlet-name >
< url-pattern > /recv </ url-pattern >
</ servlet-mapping >
< resource-ref >
< res-ref-name > jdbc/Sql </ res-ref-name >
< res-type > javax.sql.DataSource </ res-type >
< init-param driver-name ="com.microsoft.jdbc.sqlserver.SQLServerDriver" />
< init-param url ="jdbc:microsoft:sqlserver://Khan:1433;databaseName=WapServer" />
< init-param user ="sa" />
< init-param password ="" />
< init-param max-connections ="20" />
< init-param max-idle-time ="30" />
</ resource-ref >
</ web-app >