读书人

jms 学习札记3

发布时间: 2012-10-20 14:12:48 作者: rapoo

jms 学习笔记3

Lingo 是一个Spring的子项目,是一种基于Spring的远程调用方式,可以将Bean的功能输出成Login服务,然后通过代理的方式转入到本地客户使用.Lingo是RPC和异步消息通信之间的一种互补,Login远程调用可以采用JMS的队列和主题来承载信息,这样就可以保证即使在消息的接收都不可能用的情况,调用会保存在队列或主题中,当接收方可用时,仍然可以接收到消息,Lingo做为

Spring的一个子项目存在!? 下面是一个简单的例子

在工程中导入 lingo.jar 和 jsde_concurrent-9.0.jar 两个jar包.

spring文件中如何配置? Lingo将Bean输出成Login服务,该服务是基于JMS消息目标的

?

<!-- 输出服务 -->
??? <bean id="server" ref="connectionFactory"/>
??? ??? <property name="destination" ref="kesnQDestination"/>
??? ??? <property name="service" ref="markingPojoMdp"/>???? //Bean
??? ??? <property name="serviceInterface" value="com.kesn.jms.pojomdp.MarkingService"/>?? //服务要实现的接口
??? </bean>

?

通过代理工厂的方式创建服务代理对象
??? <!-- 代理工厂 产生使用Lingo输出服务的代理对象-->
??? <bean id="marking" ref="connectionFactory"/>
??? ??? <property name="destination" ref="kesnQDestination"/>
??? ??? <property name="serviceInterface" value="com.kesn.jms.pojomdp.MarkingService"/>? //代理实现的接口
??? </bean>

将服务代理对象注入到本地业务对象中
??? <bean id="markingService" ref="marking"/>
??? </bean>

?

本地业务的接口和实现类

package com.kesn.jms.pojomdp;

import com.kesn.jms.entity.Motorist;

public interface MarkingService {
??? public void handleMessage(Motorist m);
???
??? public void addMotorist(Motorist m);
}

?

package com.kesn.jms.pojomdp;

import org.apache.log4j.Logger;
import com.kesn.jms.entity.Motorist;
public class MarkingMdp implements MarkingService{
??? private Logger log=Logger.getLogger(MarkingMdp.class);
??? private MarkingService markingService;
???

//??? public void handleMessage(Map map) {
//??? ??? Motorist m=new Motorist();
//??? ??? m.setName(map.get("name").toString());
//??? ??? m.setEmail(map.get("email").toString());
//??? ??? m.setAge(map.get("age").toString());
//??? ??? log.info("name:"+m.getName());
//??? }
???
??? public void setMarkingService(MarkingService markingService) {
??? ??? this.markingService = markingService;
??? }


??? public void handleMessage(Motorist m) {
??? ??? log.info("name:"+m.getName());
??? }


??? @Override
??? public void addMotorist(Motorist m) {
??? ??? markingService.handleMessage(m);
??? }
}

?

测试类

package com.kesn.jms.client;

import org.apache.log4j.Logger;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.kesn.jms.entity.Motorist;
import com.kesn.jms.pojomdp.MarkingService;

public class LingoClient {
??? private static Logger log=Logger.getLogger(LingoClient.class);
??? public static void main(String[] args) {
??? ??? ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
??? ??? MarkingService ms=(MarkingService)context.getBean("markingService");
??? ??? Motorist m=new Motorist();
??? ??? m.setName("李乐平1");
??? ??? m.setEmail("lilpjob");
??? ??? m.setAge("1");
??? ??? ms.addMotorist(m);
??? }
}

?

测试过程中,调用添加Matorist 对象后,可以调用服务代理的方法,调用Handmessage() 方法是基于JMS的调用方式,真实的应用场景中,两个方法是分布在不同的进程中的!

?

Lingo的RPC调用的方式不同之处在Lingo的调用可以是异步的,如果通过Lingo调用的远程方法没有返回值,系统就可以做其它事情,不必等待;? RPC是同的远程的调用方式

读书人网 >编程

热点推荐