Hessianæž„å¾åˆ†å¸ƒå¼ç³»¾lŸåº”ç”?/a> 的基¼‹€ä¸Šï¼Œæˆ‘们对程åºè¿›è¡Œæ”¹˜q›ã€?br />
现在有以下比较çªå‡ºçš„问题åQ?br />
a.如果hessianæœåŠ¡ç«¯æˆ‘è¦åšçš„业务很多,怎么办?
我è¦å®šä¹‰å¾ˆå¤šä¸ªæŽ¥å£ï¼Œç„¶åŽå†å†™å®žçް¾c»ï¼Œæœ€çƒ¦çš„æ˜¯è¿˜è¦é…¾|®å®ƒã€?br />
我的设想是,hessianæœåŠ¡åªæä¾›ä¸€ä¸ªå½’å£ï¼Œå†æ¤å¯¹å¤–的接å£å®žçŽîC¸å射调用具体的业务类ã€?/p>
b.客户端在调用æ—Óž¼Œæ¯æ¬¡è°ƒç”¨˜qœç¨‹æŽ¥å£éƒ½è¦ç”¨ä»¥ä¸‹ä»£ç å—åQ?/p>
String url = "http://localhost:8080/HessianService/remote/service";
HessianProxyFactory factory = new HessianProxyFactory();
ServiceRemote rmt = (ServiceRemote) factory.create(ServiceRemote.class, url);
昄¡„¶æ˜¯ä¸éœ€è¦çš„ã€?br />
我们å¯ä»¥é€šè¿‡åŠ å…¥¾~“å˜çš„æ–¹å¼å¯¹å…¶è¿›è¡Œæ”¹è‰¯ï¼Œæˆ‘们也å¯ä»¥é€šè¿‡Spring在客æˆïL(f¨¥ng)«¯½Ž¡ç†å®ƒã€?/p>
一ã€å®Œå–„hessianæœåŠ¡ç«¯å®žçŽŽÍ¼š
1.首先修改ServiceRemote接å£åQ?/p>
package com.al;

import java.util.Map;

@SuppressWarnings("unchecked")

public interface ServiceRemote
{
public Map callService(String target, Map inputMap) throws Exception;
}
callService为统一入å£åQŒåœ¨æ¤åšå¦‚下¾U¦å®šåQ?br />
1)targetå—ç¬¦ä¸²äØ“è¦è°ƒç”¨çš„service的完整类路径+è¦è°ƒç”¨çš„æ–ÒŽ(gu¨©)³•ã€?br />
2)service的方法å‡ç”¨ä»¥ä¸‹æ–¹æ³•ç¾å:
public Map ***(Map inputMap);
å…¥å‚为MapåQŒè¿”回å€ég¹Ÿä¸ºMapåQŒåŸºæœ¬å¯ä»¥æ»¡‘Ïx‰€æœ‰æƒ…况了。(臛_°‘å…¥å‚为MapåQŒå¾ˆé€‚åˆè°ƒç”¨iBatisæ¥å¯¹DB˜q›è¡Œæ“作。)
2.修改接å£å®žçް¾c»ServiceåQŒæ¤¾cÖM¸åšå…·ä½“业务,而是å射调用具体业务¾c»ï¼š
package com.al;

import java.lang.reflect.Method;
import java.util.Map;

import org.apache.commons.beanutils.MethodUtils;
import org.apache.commons.lang.StringUtils;

@SuppressWarnings("unchecked")

public class Service implements ServiceRemote
{


public Map callService(String target, Map inputMap) throws Exception
{
String className = StringUtils.substringBeforeLast(target, ".");
String methodName = StringUtils.substringAfterLast(target, ".");
Class serviceClass = loadClass(className);
Method method = getMethod(serviceClass, methodName, Map.class);
// æä¾›è®‰K—®æ•ˆçއ
method.setAccessible(true);
// 调用具体业务¾c?/span>
return (Map) method.invoke(serviceClass.newInstance(), inputMap);
}

private static <T> Class<T> loadClass(String className) throws ClassNotFoundException
{
return (Class<T>) getClassLoader().loadClass(className);
}

private static ClassLoader getClassLoader()
{
return Thread.currentThread().getContextClassLoader();
}

private static Method getMethod(Class<?> cls, String name, Class<?>
parameterTypes)
{
return MethodUtils.getAccessibleMethod(cls, name, parameterTypes);
}
}
3.举个例ååQŒæœåŠ¡ç«¯æä¾›ä¸šåŠ¡¾c»DisplayUserService.java
package com.al.service;

import java.util.HashMap;
import java.util.Map;

@SuppressWarnings("unchecked")

public class DisplayUserService
{
public static final String selectUsers = "com.al.service.DisplayUserService.selectUsers";
public static final String deleteUser = "com.al.service.DisplayUserService.deleteUser";

public Map selectUsers(Map inputMap)
{
Map ret = new HashMap();
// æ•°æ®åº“æ“作å–得用户列è¡?nbsp;çœç•¥
ret.put("User", "User");
return ret;
}

public Map deleteUser(Map inputMap)
{
// æ•°æ®åº“æ“作å–得用户列è¡?nbsp;çœç•¥
return null;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="serviceRemote" class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
<property name="serviceUrl" value="http://localhost:8080/HessianService/remote/service" />
<property name="serviceInterface" value="com.al.ServiceRemote" />
</bean>
</beans>
2.客户端如下调用å³å¯ï¼š
package com.ai.client;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.al.ServiceRemote;
import com.al.service.DisplayUserService;


public class ClientTest
{

public static void main(String[] args) throws Exception
{
ClassPathXmlApplicationContext cxt = new ClassPathXmlApplicationContext("application.xml");
ServiceRemote rmt = (ServiceRemote)cxt.getBean("serviceRemote");
System.out.println(rmt.callService(DisplayUserService.selectUsers, null));
}
}
å¦å¤–一¿U方法是自己实现¾~“å˜ã€?br />
也就是第一‹Æ¡è°ƒç”¨è¿œ½E‹ä»£ç 时生æˆServiceRemote对象åQŒå°†å…¶ä¿å˜åœ¨é™æ€çš„容器(HashMap)ä¸ï¼Œ
æ¯æ¬¡å‡†å¤‡è°ƒç”¨æ¤è¿œ½E‹ä»£ç æ—¶åQŒå…ˆåˆ¤æ–容噍䏿˜¯å¦æœ‰ServiceRemote对象åQŒæœ‰åˆ™ç›´æŽ¥å°†å…¶å–å‡ºåÆˆä½¿ç”¨å›_¯åQŒè¦æ³¨æ„的就是在˜q™ä¸ªå®¹å™¨ä¸Šçš„åŒæ¥é—®é¢˜ã€?br />
具体实现ž®×ƒ¸åšäº†åQŒå¾ˆ½Ž€å•ã€?/p>
在项目ä¸åQŒå¯¹äºŽå®¢æˆïL(f¨¥ng)«¯ä»£ç æ¥è®²åQŒè¿˜æ˜¯æœ‰è®¸å¤šå·¥ä½œè¦åšçš„:
1) 如果我们è¦è°ƒç”¨å¤šä¸ªè¿œ½E‹æœåŠ¡æ€Žä¹ˆåŠžï¼Ÿ
æˆ‘ä»¬è¦æä¾›ä¸€ä¸ªç»Ÿä¸€è°ƒç”¨åQŒå°†˜qœç¨‹è°ƒç”¨çš„动作å°è£…è“væ¥ï¼Œè®©ä‹É用的äºÞZ¸çŸ¥é“自己调用了ä¸åŒçš„˜qœç¨‹æœåŠ¡ã€?br />
åªè¦è°ƒç”¨æŸä¸ªæ–ÒŽ(gu¨©)³•ã€ä¼ 入傿•°å³å¯ã€?/p>
2) 如何方便开å‘员调试˜qœç¨‹çš„æœåŠ¡ä»£ç ?
在åšåˆ†å¸ƒå¼ç³»¾lŸå¼€å‘的时候,如果æ¯ä¿®æ”¹ä¸€ä¸‹åº”用层的serviceåQŒå°±è¦å¯¹å…¶è¿›è¡Œå‘布,然åŽå†åŽ»è°ƒç”¨çœ‹æ˜¯å¦å·²OKåQŒé‚£æ•ˆçŽ‡ä¼šå¾ˆä½Žã€?/p>
3) 如何½Ž¡ç†å¤šæ–¹è°ƒç”¨çš„远½E‹æœåŠ¡ï¼Ÿ
4) 如何æé«˜˜qœç¨‹è°ƒç”¨çš„æ•ˆçŽ‡ï¼Ÿ
是å¦å¯ä»¥é€šè¿‡å¯?对象˜q›è¡Œ¾~“å˜ã€æ–¹æ³•是å¦ä¹Ÿå¯ä»¥¾~“å˜åQŸç”šè‡Ïx˜¯å¯¹è°ƒç”¨ç»“果进行缓å˜ï¼Ÿ
5) ½{‰ç‰..
˜q™äº›åœ¨å…·ä½“çš„™å¹ç›®ä¸éƒ½æ˜¯ä¸å¾—ä¸è€ƒè™‘的问题。以åŽå†æ…¢æ…¢è®¨è®ºå§ã€?/p>
