Java的Spring框架下RMI与quartz的调用方法

时间:2021-10-01 14:37:02

Spring调用RMI
RMI(Remote Method Invocation) 远程方法调用,实现JAVA应用之间的远程通信。下面介绍使用Spring如何使用RMI。

包的结构如下:

Java的Spring框架下RMI与quartz的调用方法

定义调用接口

?
1
2
3
4
5
public interface UserDao {
 
  public String getUser(String username)throws Exception;
 
}

接口实现类

?
1
2
3
4
5
6
7
8
9
public class UserDaoImplimplements UserDao {
 
  public String getUser(Stringusername)throws Exception {
 
    return"test:"+username;
 
  }
 
}

(1)配置RMI服务:

?
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)启动RMI服务:

?
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服务

?
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调用quartz
1.quartz是一个作业调度框架,spring集成的quartz,使用非常方便。

2.编写执行类

?
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设置为false 则不用实例化
    //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
<!-- 要调用的工作类 -->
<bean id="quartzJob" class="com.quartz.QuartzJob"/>
 
  <!-- 定义调用对象和调用对象的方法 -->
<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
 <property name="targetObject" ref="quartzJob" />
 <property name="targetMethod" value="work" />
</bean>
 
<!-- 定义触发时间 -->
  <bean id="doTime" class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail">
      <ref bean="jobDetail"/>
    </property>
    <!-- cron表达式 -->
    <property name="cronExpression">
     <value>2/5 44-46 22,23 9 9 ? 2012</value>
     <!-- 
      从左到右分别是:秒、分、时、日、月、年、星期
      ? 号只能用在日和周域上,但是不能在这两个域上同时使用。你可以认为 ? 字符是 "我并不关心在该域上是什么值。" 这不同于星号,星号是指示着该域上的每一个值。? 是说不为该域指定值。
     逗号 (,) 是用来在给某个域上指定一个值列表的。例如,使用值 0,15,30,45 在秒域上意味着每15秒触发一个 trigger。
     斜杠 (/) 是用于时间表的递增的。我们刚刚用了逗号来表示每15分钟的递增,但是我们也能写成这样 0/15
     中划线 (-) 用于指定一个范围。例如,在小时域上的 3-8 意味着 "3,4,5,6,7 和 8 点。" 域的值不允许回卷,所以像 50-10 这样的值是不允许的。
     星号(*) 指示着你想在这个域上包含所有合法的值。例如,在月份域上使用星号意味着每个月都会触发这个 trigger。
     字母L 说明了某域上允许的最后一个值。它仅被日和周域支持。
     W 字符代表着平日 (Mon-Fri),并且仅能用于日域中。它用来指定离指定日的最近的一个平日(非周六日)。
     # 字符仅能用于周域中。它用于指定月份中的第几周的哪一天。例如,如果你指定周域的值为 6#3,它意思是某月的第三个周五 (6=星期五,#3意味着月份中的第三周)。
      -->
          </property>
  </bean>
   
  <!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 -->
  <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.关于cronExpression表达式

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!-- cron表达式 --> 
<property name="cronExpression"> <value>2/5 44-46 22,23 9 9 ? 2012</value>
<!-- 
  从左到右分别是:秒、分、时、日、月、年、星期 ? 号只能用在日和周域上,但是不能在这两个域上同时使用。
  你可以认为 ? 字符是 "我并不关心在该域上是什么值。" 这不同于星号,星号是指示着该域上的每一个值。
  ? 是说不为该域指定值。 
  逗号 (,) 是用来在给某个域上指定一个值列表的。例如,使用值 0,15,30,45 在秒域上意味着每15秒触发一个 trigger。 
  斜杠 (/) 是用于时间表的递增的。我们刚刚用了逗号来表示每15分钟的递增,但是我们也能写成这样 0/15。 
  中划线 (-) 用于指定一个范围。例如,在小时域上的 3-8 意味着 "3,4,5,6,7 和 8 点。" 域的值不允许回卷,所以像 50-10 这样的值是不允许的。 
  星号(*) 指示着你想在这个域上包含所有合法的值。例如,在月份域上使用星号意味着每个月都会触发这个 trigger。 
  字母L 说明了某域上允许的最后一个值。它仅被日和周域支持。 
  W 字符代表着平日 (Mon-Fri),并且仅能用于日域中。它用来指定离指定日的最近的一个平日(非周六日)。 
  # 字符仅能用于周域中。它用于指定月份中的第几周的哪一天。例如,如果你指定周域的值为 6#3,它意思是某月的第三个周五 (6=星期五,#3意味着月份中的第三周)。 
-->