日期:2014-05-16  浏览次数:20534 次

QX项目实战-10.基础架构实验一:传递消息、序列化对象和数据库封装

      为了验证ActiveMQ传递序列化对象与同步的可行性,搭建一个小的测试系统来测试。这个系统的结构为:


      其中DB为数据库,服务器端和客户端数据定义和数据是一致的。服务器端CURD为数据库操作类,它将操作对象信息序列化后发送给MQAPP,MQAPP负责和ActiveMQ交互传递序列化后的信息。客户端MQAPP接收到序列化后对象反序列化后,重新交给CURD程序写到数据库中。以上步骤来保证数据库同步。

      这个实验的步骤大体如下:

1.      对象序列化、重建对象

2.      传递序列化消息、重建对象

3.      建立数据库、数据库操作类、封装操作对象

4.      传递操作信息、重建对象、数据库操作

5.      消息平台实现与完善

      实验一的实现方法,序列化对象需要实现Serializable接口,由ObjectOutputStream输出对象到文件或网络,再由ObjectInputStream接受流重新生成对象。序列化代码如下:

user u = new user();
u.setName("gongqingkui");
u.setPassword("123");
ObjectOutputStream oos = new ObjectOutputStream(newFileOutputStream("a.txt"));
oos.writeObject(u);

      以上代码序列化一个用户到文件a.txt中,以下程序解析a.txt中内容,反序列化为对象之后输出:

ObjectInputStream in = new ObjectInputStream(newFileInputStream("a.txt"));
user u = (user)in.readObject();
System.out.println(u.toString());

      第二步,在ActiveMQ上,传递序列化之后的消息,再由客户端接收到消息后反序列化成新的对象。序列化之后的字串,存储在文本文件中,再重新生成对象是可行的。但是在ActiveMQ中传递文本消息牵涉到消息头问题,比较复杂。这里采用对象消息的形式,在ActiveMQ中采用ObjectMessage(serializables)的方法传递序列化之后的对象,在接收端重新恢复为对象即可。发送对象消息的代码为:

public void produceObeject(Serializable s) throws JMSException,Exception{
                   initialize();
                   ObjectMessageom = session.createObjectMessage(s);
                   connection.start();
                   producer.send(om);
                   //System.out.println("objectmessage ok");
         }

      上述代码建立了ObjectMessage消息,传递了序列化之后的User对象到消息队列中。解析对象消息的客户端代码为:

if(message instanceof ObjectMessage){
                            //System.out.println(message);
                            ObjectMessageom = (ObjectMessage)message;
                            useru = null;
                            try{
                                     u= (user)om.getObject();
                            }catch (JMSException e) {
                                     e.printStackTrace();
                            }
                            System.out.println("A"+u.toString());
                   }

      上述代码,接受传递过来的ObjectMessage,强制类型转换后,重新构建为user对象,调用user对象的方法,输出信息。

      实验三,建立数据库和数据库操作类,并对操作对象进行封装。这里采用SQLServer数据库,数据表为user,定义SQL语句为:

if exists (select * from dbo.sysobjects where id =object_id(N'[dbo].[user]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[user]
GO
 
CREATE TABLE [dbo].[user] (
         [id] [int] IDENTITY(1, 1) NOT NULL ,
         [name] [char] (15)COLLATE Chinese_PRC_CI_AS NULL ,
         [password] [char] (32)COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO

      对数据表user的封装采用类user,其定义为:

package db;
 
import java.io.Serializable;
 
public class user implements Serializable{
         private String name;
         private Stringpassword;
         //访问器略
         @Override
         public StringtoString() {
                   return"object user: name:"+getName()+" password:"+getPassword();
         }
}

      对sql操作语句封装为sql对象:

package curd;
 
import java.io.Serializable;
 
public class sql implements Serializable{
         private String query;
         //访问器略
         pub