热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Spring基于JMS实现远程访问

使用JMS作为底层通信协议,Spring提供了很好的支持。我们可以基于JMS将服务暴露给外部,这一切对于外部完全透明。这里我们基于开源消息中间件ActiveMQ作为中间代理,通过在服务端将服务以消息的形式发布到代理服务器上,然后客户端通过代理服务器实现对服务

使用JMS作为底层通信协议,Spring提供了很好的支持。我们可以基于JMS将服务暴露给外部,这一切对于外部完全透明。这里我们基于开源消息中间件ActiveMQ作为中间代理,通过在服务端将服务以消息的形式发布到代理服务器上,然后客户端通过代理服务器实现对服务的远程调用。

ActiveMQ的BrokerService可以非常容易地实现服务端与客户端进行通信的中间代理,Spring配置broker.xml内容如下所示:

  1. xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"  
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">  
  5.   
  6.     <bean id="broker" class="org.apache.activemq.broker.BrokerService" />  
  7.   
  8. beans>  

通过Spring的IOC容器来管理BrokerService。实现一个基于ActiveMQ的消息代理服务,如下所示:

  1. package org.shirdrn.spring.remote.jms;  
  2.   
  3. import org.apache.activemq.broker.BrokerService;  
  4. import org.apache.log4j.Logger;  
  5. import org.springframework.context.ApplicationContext;  
  6. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  7.   
  8. public class Broker {  
  9.       
  10.     private static final Logger LOG = Logger.getLogger(Broker.class);  
  11.     private static final String CONNECTOR_ADDRESS = "tcp://192.168.1.103:61616";  
  12.       
  13.     public static void main(String[] args) {  
  14.         ApplicationContext ctx = new ClassPathXmlApplicationContext(  
  15.                 new String[] { "org/shirdrn/spring/remote/jms/broker.xml" });  
  16.         BrokerService broker = (BrokerService) ctx.getBean("broker");  
  17.         try {  
  18.             broker.setBrokerName("myBroker");  
  19.             broker.setUseJmx(true);  
  20.             broker.addConnector(CONNECTOR_ADDRESS);  
  21.             broker.start();  
  22.             LOG.info("Broker service started.");  
  23.               
  24.             Object lock = new Object();  
  25.             synchronized (lock) {  
  26.                 lock.wait();  
  27.             }  
  28.         } catch (InterruptedException e) {  
  29.             e.printStackTrace();  
  30.         } catch (Exception e) {  
  31.             e.printStackTrace();  
  32.         }  
  33.     }  
  34. }  

启动后,代理监听61616,等待服务端发布服务,以及远程客户端调用服务。

看一下,服务端如何进行实现。

定义服务接口和服务实现。服务接口,代码如下所示:

  1. package org.shirdrn.spring.remote.jms;  
  2.   
  3. public interface AccountService {  
  4.     int queryBalance(String mobileNo);  
  5.     String shoopingPayment(String mobileNo, byte protocol);  
  6. }  

实现上述接口,示例代码如下所示:

  1. package org.shirdrn.spring.remote.jms;  
  2.   
  3. import org.apache.log4j.Logger;  
  4.   
  5. public class MobileAccountServiceImpl implements AccountService {  
  6.   
  7.     private static final Logger LOG = Logger.getLogger(MobileAccountServiceImpl.class);  
  8.   
  9.     public int queryBalance(String mobileNo) {  
  10.         if (mobileNo != null)  
  11.             return 100;  
  12.         return 0;  
  13.     }  
  14.   
  15.     public String shoopingPayment(String mobileNo, byte protocol) {  
  16.         StringBuffer sb = new StringBuffer().append("Your mobile number is /"")  
  17.                 .append(mobileNo).append("/", protocol type is /"").append(  
  18.                         protocol).append("/".");  
  19.         LOG.info(sb.toString());  
  20.         return sb.toString();  
  21.     }  
  22. }  

然后,服务端的配置server.xml,内容如下所示:

  1. xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"  
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">  
  5.   
  6.     <bean class="org.springframework.jms.listener.SimpleMessageListenerContainer">  
  7.         <property name="connectionFactory" ref="connectionFactory" />  
  8.         <property name="destination" ref="myQueue" />  
  9.         <property name="concurrentConsumers" value="3" />  
  10.         <property name="messageListener" ref="myAccountService" />  
  11.         <property name="taskExecutor" ref="threadPool" />  
  12.     bean>  
  13.       
  14.     <bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">  
  15.         <property name="brokerURL" value="tcp://192.168.1.103:61616" />  
  16.     bean>  
  17.   
  18.     <bean id="myQueue" class="org.apache.activemq.command.ActiveMQQueue">  
  19.         <constructor-arg value="shirdrnQ" />  
  20.     bean>  
  21.   
  22.     <bean id="myAccountService"  
  23.         class="org.springframework.jms.remoting.JmsInvokerServiceExporter">  
  24.         <property name="serviceInterface" value="org.shirdrn.spring.remote.jms.AccountService" />  
  25.         <property name="service">  
  26.             <bean class="org.shirdrn.spring.remote.jms.MobileAccountServiceImpl" />  
  27.         property>  
  28.     bean>  
  29.       
  30.     <bean id="threadPool" class="org.springframework.core.task.SimpleAsyncTaskExecutor">  
  31.         <property name="daemon" value="true" />  
  32.         <property name="concurrencyLimit" value="300" />  
  33.         <property name="threadNamePrefix" value="SERVICE" />  
  34.     bean>  
  35.   
  36. beans>  

通过Spring的org.springframework.jms.listener.SimpleMessageListenerContainer实现服务的发布,可以配置的属性有:

connectionFactory         连接工厂

destination                    消息目的地,基于ActiveMQ则是一个消息队列

concurrentConsumers   并发消息消费者数量

messageListener           消息监听器

taskExecutor                 线程池

通过上面配置可以看到,连接工厂指定了代理监听服务的端口,我们通过服务端发布服务,作为消息生产者将服务以消息的形式发布,然后客户端作为服务的消费者,通过代理来实现对远程发布服务的调用。

服务端启动的实现,如下所示:

  1. package org.shirdrn.spring.remote.jms;  
  2.   
  3. import org.apache.log4j.Logger;  
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  5.   
  6. public class Server {  
  7.   
  8.     private static final Logger LOG = Logger.getLogger(Server.class);  
  9.       
  10.     public static void main(String[] args) throws Exception {  
  11.         new ClassPathXmlApplicationContext(  
  12.                 new String[] { "org/shirdrn/spring/remote/jms/server.xml" });  
  13.         LOG.info("Server started.");  
  14.     }  
  15. }  

推荐阅读
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 标题: ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • Java如何导入和导出Excel文件的方法和步骤详解
    本文详细介绍了在SpringBoot中使用Java导入和导出Excel文件的方法和步骤,包括添加操作Excel的依赖、自定义注解等。文章还提供了示例代码,并将代码上传至GitHub供访问。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
author-avatar
仙走壹步
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有