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" class="org.logicblaze.lingo.jms.JmsServiceExporter">
<property name="connectionFactory" 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" class="org.logicblaze.lingo.jms.JmsProxyFactoryBean">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="destination" ref="kesnQDestination"/>
<property name="serviceInterface" value="com.kesn.jms.pojomdp.MarkingService"/> //代理实现的接口
</bean>
将服务代理对象注入到本地业务对象中
<bean id="markingService" class="com.kesn.jms.pojomdp.MarkingMdp">
<property name="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是同的远程的调用方式