A-A+

ActiveMQ实现RPC

2017年04月16日 技术 暂无评论 阅读 3,139 次

本文基于ActiveMQ实现RPC,ActiveMQ可以至官网下载,地址为:http://activemq.apache.org/activemq-5144-release.html。本文基于Spring和Maven实现,所以对于此框架和工具需要有一定的了解。

1. 公共包

公共的实体类:

  1. public class User  implements Serializable {
  2.     private String id;
  3.     private String userName;
  4.     public String getUserName() {
  5.         return userName;
  6.     }
  7.     public void setUserName(String userName) {
  8.         this.userName = userName;
  9.     }
  10.     public String getId() {
  11.         return id;
  12.     }
  13.     public void setId(String id) {
  14.         this.id = id;
  15.     }
  16. }

接口服务:

  1. public interface ITestService {
  2.     public String getTestString();
  3.     public User getFirstUser();
  4.     public User getUser(String id);
  5. }

2. 服务端

Maven配置文件:

  1. <dependencies>
  2.     <!--spring start-->
  3.     <!--此处省略...-->
  4.     <!--spring end-->
  5.     <!--activemq start-->
  6.     <dependency>
  7.         <groupId>org.apache.activemq</groupId>
  8.         <artifactId>activemq-client</artifactId>
  9.         <version>5.14.3</version>
  10.     </dependency>
  11.     <!--activemq end-->
  12. </dependencies>

spring配置文件:

  1. <!-- 向 Spring 容器注册注解 -->
  2. <context:component-scan base-package="com.xnck.test.activemq.rpcserver"/>
  3. <!-- 声明AcitveMQ连接 -->
  4. <bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
  5.     <property name="brokerURL" value="tcp://127.0.0.1:61616" />
  6.     <property name="trustAllPackages" value="true" />
  7. </bean>
  8. <!-- 生成ActiveMQ消息队列 -->
  9. <bean id="myQueue" class="org.apache.activemq.command.ActiveMQQueue">
  10.     <constructor-arg value="rpcQueue" />
  11. </bean>
  12. <!-- 声明对外开放的服务 -->
  13. <bean id="testRpcService"
  14.       class="org.springframework.jms.remoting.JmsInvokerServiceExporter">
  15.     <property name="serviceInterface" value="com.xnck.test.activemq.common.rpcservice.ITestRpcService" />
  16.     <property name="service">
  17.         <bean class="com.xnck.test.activemq.rpcserver.rpcservice.impl.TestRpcService" />
  18.     </property>
  19. </bean>
  20. <bean id="threadPool" class="org.springframework.core.task.SimpleAsyncTaskExecutor">
  21.     <property name="daemon" value="true" />
  22.     <property name="concurrencyLimit" value="300" />
  23.     <property name="threadNamePrefix" value="SERVICE" />
  24. </bean>
  25. <!-- 启用JMS并注册至ActiveMQ -->
  26. <bean class="org.springframework.jms.listener.SimpleMessageListenerContainer">
  27.     <property name="connectionFactory" ref="connectionFactory" />
  28.     <property name="destination" ref="myQueue" />
  29.     <property name="concurrentConsumers" value="3" />
  30.     <property name="messageListener" ref="testRpcService" />
  31.     <property name="taskExecutor" ref="threadPool" />
  32. </bean>

实现接口服务:

  1. public class TestRpcService implements ITestRpcService{
  2.     @Autowired
  3.     public ITestService testService;
  4.     public String test() {
  5.         String msg = testService.getTestString();
  6.         return msg;
  7.     }
  8.     public User firstUser(){
  9.         User user = testService.getFirstUser();
  10.         return user;
  11.     }
  12.     public User getUser(String id){
  13.         User user = testService.getUser(id);
  14.         return user;
  15.     }
  16. }

启动服务端:

  1. public static void main(String[] args) {
  2.         ApplicationContext context = new ClassPathXmlApplicationContext("file:" + PathUtil.getRootPath() + "spring-common.xml");
  3.     }

3. 客户端

Maven配置文件:

  1. <!--activemq start-->
  2. <dependency>
  3.   <groupId>org.apache.activemq</groupId>
  4.   <artifactId>activemq-client</artifactId>
  5.   <version>5.14.3</version>
  6. </dependency>
  7. <!--activemq end-->

spring配置文件:

  1. <!--rpc start-->
  2. <bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
  3.     <property name="brokerURL" value="tcp://127.0.0.1:61616" />
  4.     <property name="trustAllPackages" value="true"/>
  5. </bean>
  6. <!-- 生成ActiveMQ消息队列(注意名称,客户端要与服务端的相同) -->
  7. <bean id="myQueue" class="org.apache.activemq.command.ActiveMQQueue">
  8.     <constructor-arg value="rpcQueue" />
  9. </bean>
  10. <bean id="testRpcService" class="org.springframework.jms.remoting.JmsInvokerProxyFactoryBean">
  11.     <property name="serviceInterface" value="com.xnck.test.activemq.common.rpcservice.ITestRpcService" />
  12.     <property name="connectionFactory" ref="connectionFactory" />
  13.     <property name="queue" ref="myQueue" />
  14. </bean>
  15. <!--rpc end-->

调用RPC服务:

  1. @Service
  2. public class TestService implements ITestService{
  3.     @Resource(name = "testRpcService")
  4.     public ITestRpcService testRpcService;
  5.     public String getTest() {
  6.         String msg = testRpcService.test();
  7.         return msg;
  8.     }
  9.     public User getUser(String id){
  10.         User user = testRpcService.getUser(id);
  11.         return user;
  12.     }
  13. }

需要注意的是:

1. 客户端和服务端使用的Model必须同属于一个包下,即包名必须相同,否则反序列化的时候会报错。

2. jar包activemq-all的新版本与SpringMVC3或以上版本的jar包有冲突,可以降低activemq-all的版本,不过我建议还是按需使用,在本Demo中就只用了activemq-client。

给我留言

Copyright © 字痕随行 保留所有权利.   Theme  Ality

用户登录

分享到: