Spring調(diào)用RMI
RMI(Remote Method Invocation) 遠(yuǎn)程方法調(diào)用,實(shí)現(xiàn)JAVA應(yīng)用之間的遠(yuǎn)程通信。下面介紹使用Spring如何使用RMI。
包的結(jié)構(gòu)如下:
定義調(diào)用接口
1
2
3
4
5
|
public interface UserDao { public String getUser(String username) throws Exception; } |
接口實(shí)現(xiàn)類
1
2
3
4
5
6
7
8
9
|
public class UserDaoImplimplements UserDao { public String getUser(Stringusername) throws Exception { return "test:" +username; } } |
(1)配置RMI服務(wù):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
applicationContext-rmi-server.xml <beanid= "userDaoImpl" class = "com.rmi.UserDaoImpl" /> <beanid= "userDaoImpl_Exporter" class = "org.springframework.remoting.rmi.RmiServiceExporter" > <propertyname= "service" ref= "userDaoImpl" /> <propertyname= "serviceName" value= "rmi/userDaoImpl" /> <propertyname= "serviceInterface" value= "com.rmi.UserDao" /> <propertyname= "registryPort" value= "8819" /> </bean> |
(2)啟動(dòng)RMI服務(wù):
1
2
3
4
5
6
7
8
9
|
public class RmiServer { publicstaticfinal ApplicationContextcontext = new ClassPathXmlApplicationContext( "applicationContext-rmi-server.xml" ); publicstaticvoid main(String[] args) { } } |
(3)訪問RMI服務(wù)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
applicationContext-rmi-client.xml <beanid= "userDaoImpl_client" class = "org.springframework.remoting.rmi.RmiProxyFactoryBean" > <propertyname= "serviceUrl" value= "rmi://localhost:8819/rmi/userDaoImpl" /> <propertyname= "serviceInterface" value= "com.rmi.UserDao" /> <propertyname= "refreshStubOnConnectFailure" value= "true" /> <propertyname= "lookupStubOnStartup" value= "false" /> </bean> public class RmiClient { publicstaticvoid main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext( "applicationContext-rmi-client.xml" ); UserDao userDao = (UserDao)context.getBean( "userDaoImpl_client" ); if (userDao != null ){ try { System.out.println(userDao.getUser( "li" )); } catch (Exception e) { e.printStackTrace(); } } } } |
spring調(diào)用quartz
1.quartz是一個(gè)作業(yè)調(diào)度框架,spring集成的quartz,使用非常方便。
2.編寫執(zhí)行類
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class QuartzTest { public static void main(String[] args) { System.out.println( "Test start." ); ApplicationContext context = new ClassPathXmlApplicationContext( "applicationContext-quartz.xml" ); //如果配置文件中將startQuertz bean的lazy-init設(shè)置為false 則不用實(shí)例化 //context.getBean("startQuertz"); System.out.print( "Test end.." ); } } |
3.編寫配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
<!-- 要調(diào)用的工作類 --> <bean id= "quartzJob" class = "com.quartz.QuartzJob" /> <!-- 定義調(diào)用對(duì)象和調(diào)用對(duì)象的方法 --> <bean id= "jobDetail" class = "org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean" > <property name= "targetObject" ref= "quartzJob" /> <property name= "targetMethod" value= "work" /> </bean> <!-- 定義觸發(fā)時(shí)間 --> <bean id= "doTime" class = "org.springframework.scheduling.quartz.CronTriggerBean" > <property name= "jobDetail" > <ref bean= "jobDetail" /> </property> <!-- cron表達(dá)式 --> <property name= "cronExpression" > <value> 2 / 5 44 - 46 22 , 23 9 9 ? 2012 </value> <!-- 從左到右分別是:秒、分、時(shí)、日、月、年、星期 ? 號(hào)只能用在日和周域上,但是不能在這兩個(gè)域上同時(shí)使用。你可以認(rèn)為 ? 字符是 "我并不關(guān)心在該域上是什么值。" 這不同于星號(hào),星號(hào)是指示著該域上的每一個(gè)值。? 是說不為該域指定值。 逗號(hào) (,) 是用來在給某個(gè)域上指定一個(gè)值列表的。例如,使用值 0 , 15 , 30 , 45 在秒域上意味著每 15 秒觸發(fā)一個(gè) trigger。 斜杠 (/) 是用于時(shí)間表的遞增的。我們剛剛用了逗號(hào)來表示每 15 分鐘的遞增,但是我們也能寫成這樣 0 / 15 。 中劃線 (-) 用于指定一個(gè)范圍。例如,在小時(shí)域上的 3 - 8 意味著 "3,4,5,6,7 和 8 點(diǎn)。" 域的值不允許回卷,所以像 50 - 10 這樣的值是不允許的。 星號(hào)(*) 指示著你想在這個(gè)域上包含所有合法的值。例如,在月份域上使用星號(hào)意味著每個(gè)月都會(huì)觸發(fā)這個(gè) trigger。 字母L 說明了某域上允許的最后一個(gè)值。它僅被日和周域支持。 W 字符代表著平日 (Mon-Fri),并且僅能用于日域中。它用來指定離指定日的最近的一個(gè)平日(非周六日)。 # 字符僅能用于周域中。它用于指定月份中的第幾周的哪一天。例如,如果你指定周域的值為 6 # 3 ,它意思是某月的第三個(gè)周五 ( 6 =星期五,# 3 意味著月份中的第三周)。 --> </property> </bean> <!-- 總管理類 如果將lazy-init= 'false' 那么容器啟動(dòng)就會(huì)執(zhí)行調(diào)度程序 --> <bean id= "startQuertz" lazy-init= "false" autowire= "no" class = "org.springframework.scheduling.quartz.SchedulerFactoryBean" > <property name= "triggers" > <list> <ref bean= "doTime" /> </list> </property> </bean> |
4.關(guān)于cronExpression表達(dá)式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<!-- cron表達(dá)式 --> <property name= "cronExpression" > <value> 2 / 5 44 - 46 22 , 23 9 9 ? 2012 </value> <!-- 從左到右分別是:秒、分、時(shí)、日、月、年、星期 ? 號(hào)只能用在日和周域上,但是不能在這兩個(gè)域上同時(shí)使用。 你可以認(rèn)為 ? 字符是 "我并不關(guān)心在該域上是什么值。" 這不同于星號(hào),星號(hào)是指示著該域上的每一個(gè)值。 ? 是說不為該域指定值。 逗號(hào) (,) 是用來在給某個(gè)域上指定一個(gè)值列表的。例如,使用值 0 , 15 , 30 , 45 在秒域上意味著每 15 秒觸發(fā)一個(gè) trigger。 斜杠 (/) 是用于時(shí)間表的遞增的。我們剛剛用了逗號(hào)來表示每 15 分鐘的遞增,但是我們也能寫成這樣 0 / 15 。 中劃線 (-) 用于指定一個(gè)范圍。例如,在小時(shí)域上的 3 - 8 意味著 "3,4,5,6,7 和 8 點(diǎn)。" 域的值不允許回卷,所以像 50 - 10 這樣的值是不允許的。 星號(hào)(*) 指示著你想在這個(gè)域上包含所有合法的值。例如,在月份域上使用星號(hào)意味著每個(gè)月都會(huì)觸發(fā)這個(gè) trigger。 字母L 說明了某域上允許的最后一個(gè)值。它僅被日和周域支持。 W 字符代表著平日 (Mon-Fri),并且僅能用于日域中。它用來指定離指定日的最近的一個(gè)平日(非周六日)。 # 字符僅能用于周域中。它用于指定月份中的第幾周的哪一天。例如,如果你指定周域的值為 6 # 3 ,它意思是某月的第三個(gè)周五 ( 6 =星期五,# 3 意味著月份中的第三周)。 --> |