用户数据同步:A系统在自己的数据库里有用户数据表,B系统在自己的数据库里有用户数据表,即他们相互独立。现在要求他们表里的用户名和密码能保持同步。A系统w r,B系统r;在A系统中进行用户的CRUD。B系统用户数据必须进行同步的CRUD。
针对这个场景,立哥给我提出了2个思路。
实时性要求比较高的:
*A系统w,发送一条mq消息。B系统监听mq,收到消息,做单条数据同步
实时行要求不高的:
*可以考虑数据库同步--定时任务
由于用户在2个系统里来回浏览相对频繁,实时性要求较高。我们都偏向于第一个思路。
原先我打算采用httpclient。
即在A系统修改用户数据,通过httpclient来对B系统的进行操作。即按照传统的思想同步操作,但这样又带来了一个问题:增加了A系统和B系统的耦合度。
考虑异步方式:JMS (ActiveMQ)
[quote]
JMS
* 它可以把不影响用户执行结果又比较耗时的任务(比如发邮件通知管理员)异步的扔给JMS 服务端去做,而尽快的把屏幕返还给用户。
* 服务端能够多线程排队响应高并发的请求,并保证请求不丢失。
* 可以在Java世界里达到最高的解耦。客户端与服务端无需直连,甚至无需知晓对方是谁、在哪里、有多少人,只要对流过的信息作响应就行了,在企业应用环境复杂时作用明显。
ActiveMQ的特性:
* 完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,也是Apache Geronimo默认的JMS provider。
* POJO withdout EJB Container,不需要实现EJB繁琐复杂的Message Bean接口和配置。
* Spring Base,可以使用Spring的各种特性如IOC、AOP 。
* Effective,基于Jencks的JCA Container实现 pool connection,control transactions and manage security。[/quote]
JMS两种实现方法
Topic==>消息主题 是发布/订阅机制 一个消息产生多个对应 1:N
Queue==>消息队列 是点到点机制 一个消息产生一个对应 1:1
无论采用哪种实现方式,在两个系统中,对应的physicalName必须相同,这样才能接收到消息。
JMS消息类型
1.使用 TextMessage 类
2.使用 BytesMessage 类
3.使用映射消息
4.使用流消息
5.使用对象消息
我采用的是第5种,[color=red]注意对象必须实现java.io.Serializable接口,不然会抛出java.io.InvalidClassException。在A和B系统中的两个POJO必须完全一样,serialVersionUID也一样。[/color]
使用JMS集成两个应用,需要两个应用连接同一个jms server。
所以首先要确保B应用连接到A应用启动的embedded ActiceMQ。
关于ActiveMQ,可以参考
Apache ActiveMQ > Using ActiveMQ > Xml Reference > XBean XML Reference 5.0
[url]http://activemq.apache.org/xbean-xml-reference-50.html#XBeanXMLReference5.0-connectionFactoryelement[/url]
ActiveMQ5.0实战一、二、三
[url]http://www.iteye.com/topic/153171[/url]
引用来自:ActiveMQ4.1 +Spring2.0的POJO JMS方案
[url]http://wiki.springside.org.cn/display/springside/ActiveMQ[/url]
针对这个场景,立哥给我提出了2个思路。
实时性要求比较高的:
*A系统w,发送一条mq消息。B系统监听mq,收到消息,做单条数据同步
实时行要求不高的:
*可以考虑数据库同步--定时任务
由于用户在2个系统里来回浏览相对频繁,实时性要求较高。我们都偏向于第一个思路。
原先我打算采用httpclient。
即在A系统修改用户数据,通过httpclient来对B系统的进行操作。即按照传统的思想同步操作,但这样又带来了一个问题:增加了A系统和B系统的耦合度。
考虑异步方式:JMS (ActiveMQ)
[quote]
JMS
* 它可以把不影响用户执行结果又比较耗时的任务(比如发邮件通知管理员)异步的扔给JMS 服务端去做,而尽快的把屏幕返还给用户。
* 服务端能够多线程排队响应高并发的请求,并保证请求不丢失。
* 可以在Java世界里达到最高的解耦。客户端与服务端无需直连,甚至无需知晓对方是谁、在哪里、有多少人,只要对流过的信息作响应就行了,在企业应用环境复杂时作用明显。
ActiveMQ的特性:
* 完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,也是Apache Geronimo默认的JMS provider。
* POJO withdout EJB Container,不需要实现EJB繁琐复杂的Message Bean接口和配置。
* Spring Base,可以使用Spring的各种特性如IOC、AOP 。
* Effective,基于Jencks的JCA Container实现 pool connection,control transactions and manage security。[/quote]
JMS两种实现方法
Topic==>消息主题 是发布/订阅机制 一个消息产生多个对应 1:N
Queue==>消息队列 是点到点机制 一个消息产生一个对应 1:1
无论采用哪种实现方式,在两个系统中,对应的physicalName必须相同,这样才能接收到消息。
JMS消息类型
1.使用 TextMessage 类
2.使用 BytesMessage 类
3.使用映射消息
4.使用流消息
5.使用对象消息
我采用的是第5种,[color=red]注意对象必须实现java.io.Serializable接口,不然会抛出java.io.InvalidClassException。在A和B系统中的两个POJO必须完全一样,serialVersionUID也一样。[/color]
使用JMS集成两个应用,需要两个应用连接同一个jms server。
所以首先要确保B应用连接到A应用启动的embedded ActiceMQ。
<!-- embedded ActiveMQ Broker -->
<amq:broker useJmx="false" persistent="true">
<amq:persistenceAdapter>
<amq:amqPersistenceAdapter directory="/home/dylan/JavaPro/amq"/>
</amq:persistenceAdapter>
<amq:transportConnectors>
<amq:transportConnector uri="tcp://localhost:61616" />
</amq:transportConnectors>
</amq:broker>
ActiveMQ connectionFactory -->
<!--连接自己的activeMQ -->
<amq:connectionFactory id="jmsConnectionFactory" brokerURL="vm://localhost" />
<amq:connectionFactory id="jmsConnectionFactory" brokerURL="tcp://localhost:61616" />
关于ActiveMQ,可以参考
Apache ActiveMQ > Using ActiveMQ > Xml Reference > XBean XML Reference 5.0
[url]http://activemq.apache.org/xbean-xml-reference-50.html#XBeanXMLReference5.0-connectionFactoryelement[/url]
ActiveMQ5.0实战一、二、三
[url]http://www.iteye.com/topic/153171[/url]
引用来自:ActiveMQ4.1 +Spring2.0的POJO JMS方案
[url]http://wiki.springside.org.cn/display/springside/ActiveMQ[/url]