A-A+
ActiveMQ实现RPC
本文基于ActiveMQ实现RPC,ActiveMQ可以至官网下载,地址为:http://activemq.apache.org/activemq-5144-release.html。本文基于Spring和Maven实现,所以对于此框架和工具需要有一定的了解。
1. 公共包
公共的实体类:
- public class User implements Serializable {
- private String id;
- private String userName;
- public String getUserName() {
- return userName;
- }
- public void setUserName(String userName) {
- this.userName = userName;
- }
- public String getId() {
- return id;
- }
- public void setId(String id) {
- this.id = id;
- }
- }
接口服务:
- public interface ITestService {
- public String getTestString();
- public User getFirstUser();
- public User getUser(String id);
- }
2. 服务端
Maven配置文件:
- <dependencies>
- <!--spring start-->
- <!--此处省略...-->
- <!--spring end-->
- <!--activemq start-->
- <dependency>
- <groupId>org.apache.activemq</groupId>
- <artifactId>activemq-client</artifactId>
- <version>5.14.3</version>
- </dependency>
- <!--activemq end-->
- </dependencies>
spring配置文件:
- <!-- 向 Spring 容器注册注解 -->
- <context:component-scan base-package="com.xnck.test.activemq.rpcserver"/>
- <!-- 声明AcitveMQ连接 -->
- <bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
- <property name="brokerURL" value="tcp://127.0.0.1:61616" />
- <property name="trustAllPackages" value="true" />
- </bean>
- <!-- 生成ActiveMQ消息队列 -->
- <bean id="myQueue" class="org.apache.activemq.command.ActiveMQQueue">
- <constructor-arg value="rpcQueue" />
- </bean>
- <!-- 声明对外开放的服务 -->
- <bean id="testRpcService"
- class="org.springframework.jms.remoting.JmsInvokerServiceExporter">
- <property name="serviceInterface" value="com.xnck.test.activemq.common.rpcservice.ITestRpcService" />
- <property name="service">
- <bean class="com.xnck.test.activemq.rpcserver.rpcservice.impl.TestRpcService" />
- </property>
- </bean>
- <bean id="threadPool" class="org.springframework.core.task.SimpleAsyncTaskExecutor">
- <property name="daemon" value="true" />
- <property name="concurrencyLimit" value="300" />
- <property name="threadNamePrefix" value="SERVICE" />
- </bean>
- <!-- 启用JMS并注册至ActiveMQ -->
- <bean class="org.springframework.jms.listener.SimpleMessageListenerContainer">
- <property name="connectionFactory" ref="connectionFactory" />
- <property name="destination" ref="myQueue" />
- <property name="concurrentConsumers" value="3" />
- <property name="messageListener" ref="testRpcService" />
- <property name="taskExecutor" ref="threadPool" />
- </bean>
实现接口服务:
- public class TestRpcService implements ITestRpcService{
- @Autowired
- public ITestService testService;
- public String test() {
- String msg = testService.getTestString();
- return msg;
- }
- public User firstUser(){
- User user = testService.getFirstUser();
- return user;
- }
- public User getUser(String id){
- User user = testService.getUser(id);
- return user;
- }
- }
启动服务端:
- public static void main(String[] args) {
- ApplicationContext context = new ClassPathXmlApplicationContext("file:" + PathUtil.getRootPath() + "spring-common.xml");
- }
3. 客户端
Maven配置文件:
- <!--activemq start-->
- <dependency>
- <groupId>org.apache.activemq</groupId>
- <artifactId>activemq-client</artifactId>
- <version>5.14.3</version>
- </dependency>
- <!--activemq end-->
spring配置文件:
- <!--rpc start-->
- <bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
- <property name="brokerURL" value="tcp://127.0.0.1:61616" />
- <property name="trustAllPackages" value="true"/>
- </bean>
- <!-- 生成ActiveMQ消息队列(注意名称,客户端要与服务端的相同) -->
- <bean id="myQueue" class="org.apache.activemq.command.ActiveMQQueue">
- <constructor-arg value="rpcQueue" />
- </bean>
- <bean id="testRpcService" class="org.springframework.jms.remoting.JmsInvokerProxyFactoryBean">
- <property name="serviceInterface" value="com.xnck.test.activemq.common.rpcservice.ITestRpcService" />
- <property name="connectionFactory" ref="connectionFactory" />
- <property name="queue" ref="myQueue" />
- </bean>
- <!--rpc end-->
调用RPC服务:
- @Service
- public class TestService implements ITestService{
- @Resource(name = "testRpcService")
- public ITestRpcService testRpcService;
- public String getTest() {
- String msg = testRpcService.test();
- return msg;
- }
- public User getUser(String id){
- User user = testRpcService.getUser(id);
- return user;
- }
- }
需要注意的是:
1. 客户端和服务端使用的Model必须同属于一个包下,即包名必须相同,否则反序列化的时候会报错。
2. jar包activemq-all的新版本与SpringMVC3或以上版本的jar包有冲突,可以降低activemq-all的版本,不过我建议还是按需使用,在本Demo中就只用了activemq-client。