用SERVICE LOCATOR 模式实现访问命名服务

Java 接口 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。 接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。 除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。 接口无法被实例化,但是可以被实现。一个实现接口... 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> 在B/S开发中, 我们经常要用到名称服务,如JNDI,XMLNS等。名称服务随不同厂家而不同。每次需要获得名称服务时,需要适当的名称环境信息,然后查找服务,重复查找的成本很高。 此外,在持久性框架中,要求将所有的服务访问都包装到对象中,开发人员不需要知道名称服务后面的平台(数据库)类型,及任何安全信息或地址。在一个大型软件产品间存在多个EJB和多个数据源连接时(我们目前只有一个写死的数据源WEBGL)需要一个类来实现统一的访问管理。 因此,这就要求我们对这些访问进行封装隔离。这时我们就可以利用SERVICE LOCATOR模式。 我们将利用一个文件service.properties来管理所有的命名服务。例子代码实现了EJB本地,数据源的访问。 格式如下: DEFAULTDS=webgl NTCLASSREF=NTHome.class 把它保存在CLASSPATH引用的路径里。 源代码: Package com.learn; import java.util.Hashtable; import java.util.Properties; import java.io.*; import javax.ejb.EJBHome; import javax.naming.InitialContext; import javax.naming.Context; import javax.naming.NamingException; import javax.rmi.PortableRemoteObject; import java.sql.Connection; import java.sql.SQLException; import javax.sql.DataSource; public class ServiceLocator { private static ServiceLocator serviceLocatorRef = null; private static Hashtable ejbHomeCache = null; private static Hashtable dataSourceCache = null; private static Properties serviceCache = null; static { serviceLocatorRef = new ServiceLocator(); } private ServiceLocator() { ejbHomeCache = new Hashtable(); dataSourceCache = new Hashtable(); try { String serviceFileName = "service.properties"; serviceCache.load(new FileInputStream(serviceFileName)); } catch (IOException e) { System.out.println(e.toString()); } } /** * 使用singleton.模式静态对象多次调用节省资源 */ public static ServiceLocator getInstance() { return serviceLocatorRef; } /* * 由键获得键值,一般在数据源,XMLNS访问用到这个方法 */ static private String getServiceName(String serviceId) throws ServiceLocatorException{ String serviceName=null; if (serviceCache.containsKey(serviceId)) { serviceName = (String) serviceCache.get(serviceId); } else { throw new ServiceLocatorException( "Unable to locate the service statement requested"); } return serviceName; } /************************************************* * EJB本地类引用 *************************************************/ static private Class getEJBHomeRef(String serviceId) throws ServiceLocatorException { Class homeRef = null; if (serviceCache.containsKey(serviceId)) { homeRef = (Class) serviceCache.get(serviceId); } else { throw new ServiceLocatorException( "Unable to locate the service statement requested"); } return homeRef; } /************************************************************************ * 获得EJBHome对象 ***********************************************************************/ public EJBHome getEJBHome(String serviceId) throws ServiceLocatorException { EJBHome ejbHome = null; try { //先检查缓存是否存在EJBHome接口 if (ejbHomeCache.containsKey(serviceId)) { ejbHome = (EJBHome) ejbHomeCache.get(serviceId); return ejbHome; } else { //如果没有存在,则解析并存到缓存中 Context ctx = new InitialContext(); Object jndiRef = ctx.lookup(serviceId); Object portableObj = PortableRemoteObject.narrow(jndiRef, getEJBHomeRef(serviceId)); ejbHome = (EJBHome) portableObj; ejbHomeCache.put(serviceId, ejbHome); return ejbHome; } } catch (NamingException e) { throw new ServiceLocatorException( "Naming exception error in ServiceLocator.getEJBHome()", e); } } /* * 获得JNDI数据源 */ public Connection getDBConn(String serviceId) throws ServiceLocatorException { Connection conn = null; String serviceName=getServiceName(serviceId); try { /*Checking to see if the requested DataSource is in the Cache*/ if (dataSourceCache.containsKey(serviceId)) { DataSource ds = (DataSource) dataSourceCache.get(serviceId); conn = ( (DataSource) ds).getConnection(); return conn; } else { /* * The DataSource was not in the cache. Retrieve it from JNDI * and put it in the cache. */ Context ctx = new InitialContext(); DataSource newDataSource = (DataSource) ctx.lookup(serviceName); dataSourceCache.put(serviceId, newDataSource); conn = newDataSource.getConnection(); return conn; } } catch (SQLException e) { throw new ServiceLocatorException("A SQL error has occurred in " "ServiceLocator.getDBConn()", e); } catch (NamingException e) { throw new ServiceLocatorException("A JNDI Naming exception has occurred " " in ServiceLocator.getDBConn()", e); } catch (Exception e) { throw new ServiceLocatorException("An exception has occurred " " in ServiceLocator.getDBConn()", e); } } } 异常处理类: package com.learn; public class ServiceLocatorException extends DataAccessException{ public ServiceLocatorException(String pExceptionMsg){ super(pExceptionMsg); } public ServiceLocatorException(String pExceptionMsg, Throwable pException){ super(pExceptionMsg, pException); } } 参考书籍: 《实用J2EE设计模式编程指南》 《WEB服务精髓》 《J2EE 与 BEA WEBLOGIC SERVER》
货币转换服务:此项目是测试微服务项目。 它用于测试对该项目内部另一个名为currency-exchange-service的微服务的调用。 该项目包括测试RestTemplate,Feign,用于负载平衡的功能区,eureka命名服务器,zuul api网关,通过zipkin和RabbitMQ进行的请求跟踪 货币兑换服务 该项目是一个测试微服务项目,用于测试对另一个名为currency-exchange-service的微服务的调用。在此项目中,这是对调用微服务的不同方式的测试 1- RestTemplate。 调用其他服务的旧方法。 2-假装。 简化了对其他服务的调用,使其结构更好 为了从另一个微服务调用多个实例,我正在使用Ribbon进行负载平衡。 我们不是从配置文件application.properties中获取其他微服务的URL,而是使用命名服务器获取它。 该项目使用zuul api网关来处理微服务之间的通信,而不是直接调用其他微服务。此服务注册zipkin和RabbitMQ的请求跟踪 在该项目中使用 1-RestTemplate 2-Feign 3-Ribbon 4-命名服务器客户端5-Zuul api网关6-使用Spring Cloud sleuth将唯一的ID添加到日志7- 立即下载

相关推荐

网络抓包工具(可指定任意进程进行跟踪抓包)

网络抓包工具 跟踪调式抓包工具 软件抓包工具(可指定任意进程进行跟踪抓包)

当前上下文中不存在名称怎么解决_Spring中的一些常见操作

在spring中,我们经常会用到事务,也经常会跟数据库打交道,今天我就来说一下自己在开发碰到的一些问题以及解决方法。1.spring中的事务传播属性sping中默认的事务传播属性是Propagation.REQUIRED:支持当前事务,如果当前有事务, 那么加入事务, 如果当前没有事务则新建一个。我们写代码的时候,基本上没有考虑事务传播属性,默认也是这个。最多会在事务注解中加上事务管理器的名称,回...

weixin_39822493的博客 1287

Unity中的坐标系及其转换方法

Unity中的坐标系及其转换方法 Unity中有四种坐标系: 1.全局坐标系 World Coordinate System 全局坐标系是用于描述场景内所有物体位置的方向的基准,也称为世界坐标系,Unity中创建的物体都是以全局坐标系中的坐标原点(0,0,0),来确定各自的位置的,可以使用transform.position来获取游戏对象的世界坐标。 2.局部坐标系 Local Coordinate System 局部坐标系也称为模型坐标系或物体坐标系,每个物体都有自身独立的物体坐标系。当物体移动或改变方向

Z_hongli的博客 8179

WebService服务端和客户端的几种常见创建方式

一、WebService发布方式: 1.利用JDK中JAX-WS规范发布WebService服务(jdk1.6.0_21以后版本) 步骤: a.新建web项目(Dynamic Web project) b.新建一个用于发布的服务类Hello.java代码如下,项目结构如下: 代码Hello.java: package com.sherlon.ws; import javax.jw...

wangxiaolong的博客 7475

【UE5】【蓝图】 LevelSequence 动画播放与暂停

最近有些工作,在研究UE5 蓝图的LevelSequence,来制作一些简单动画。做个笔记,记录一下动画更换绑定actor的操作,以及动画播放后如何暂停和继续。

UE5开发备忘录 1万+

使用gsplat进行3D高斯泼溅的方案

gsplat 不是一个软件,而是一个深度优化CUDA的开源Python库。它的作者是 Nerfstudio 团队,这个团队最出名的项目是 Nerfstudio,是对 NeRFs 方法支持最好的一套框架。据其所述,出于对新一代技术的好奇,他们构建了 gsplat 这个库。它支持 Windows/Linux 两个系统,使用前必须准备好 Nvidia 显卡。跑这个项目真是特别费劲,官方的文档支持不够完善,以至于遇到问题,开发者们都只能在issue区里抱团取暖。

兴趣使然的创作者 2111

webservice 小例子

<br />很多内容都是从网上找的,自己做过了一些验证,写下来,当然里面还是有很多要进行修改过优化的。<br /> <br />1 环境<br />a JDK1.5,tomcat5.5.<br />b  到 http://ws.apache.org/Axis/网站下载Axis安装包的安装包。我下载的是axis-1_4 版本,解压后可以直接到webapps目录<br />下面将axis直接copy到tomcat的webapps下面。<br />这时启动tomcat,我的端口是 8899 。可以访问下测试 ht

LEE_ZCF 1113

OpenClaw实战系列01:OpenClaw接入飞书机器人全接入指南 + Ollama本地大模型

通过 OpenClaw + Ollama + 飞书的组合,我们成功搭建了一个完全私有、免费、可定制的AI助理。它不仅能在日常聊天中提供帮助,还能通过OpenClaw强大的“技能”体系,真正去操作你的电脑、管理文件、甚至执行代码。这套方案将数据留在本地,既保证了隐私安全,又锻炼了动手能力。现在,去给你的AI助理添加更多酷炫的技能吧!

PeterPan的博客 1万+

JAVA客户端调用SAP提供的接口(保姆级教程)

1.WSDL/REST接口调用就是Restful风格的HTTP请求,比较简单,只需要注意生成认证头即可;2.WSDL/SOAP接口的调用相对比较麻烦,但是可以通过使用SoapUI工具+Axis可以极大的简化开发,在使用一次后就可以很快上手。

petor_lin的博客 1万+

【图像超分】论文精读:Interpreting Super-Resolution Networks with Local Attribution Maps(LAM)

论文题目:Interpreting Super-Resolution Networks with Local Attribution Maps —— 用局部归因图解释超分辨率网络CVPR 2021!必读文章!必须会的可视化手段!很多文章中都会对比LAM!图像超分辨率 (SR) 技术发展迅速,受益于深度网络的发明及其连续突破。然而,众所周知,深度学习和深度神经网络很难解释。SR网络继承了这种神秘的性质,很少有作品试图理解它们。在本文中,我们对 SR 网络进行了归因分析。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 548

【AHE数据集】中国2019年多源热排放数据集-500m空间分辨率

【AHE数据集】中国2019年多源热排放数据集

WW、forever的博客 412

K8s集群内部各Service之间通过服务名调用(Nginx代理)-基于CoreDNS的服务发现

K8s集群内部各Service之间通过服务名调用-基于CoreDNS的服务发现 Kubernetes中Nginx代理访问服务发现

Aubrey.J的博客 2万+

高通平台蓝牙学习-- 基于WCN6750 Bluetooth 5.2的讲解

摘要:蓝牙5.2解决方案WCN6750具备多项先进特性:完全兼容5.2标准及ANT+协议,支持2Mbps高速BLE和长距离传输;采用射频集成方案,与WLAN共享天线并支持5G并发;内置功率放大器,支持Class1/2传输;提供双音频流和Slimbus接口优化。其HCI UART接口支持3.2Mbps速率,通过BlueZ协议栈实现蓝牙5.2功能,包括2Mbps模式和长距离传输,符合核心规范要求。(149字)

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 3万+

java接口_Java接口

java接口 Java接口不同于类,因此重要的是要知道如何在Java程序中使用它们的特殊属性。 本教程介绍了类和接口之间的区别,然后通过示例演示如何声明,实现和扩展Java接口。 您还将通过添加默认和静态方法,以及在Java 9中使用新的私有方法,来学习接口在Java 8中的演变。 这些新增功能使界面对经验丰富的开发人员更加有用。 不幸的是,它们也模糊了类和接口之间的界线,使接口编程对Jav...

cxu0262的博客 225

研制过程评审活动(三)工程研制阶段

工程研制阶段主要任务、及评审活动

Abel的博客 2390

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

java——接口

java——接口

m0_52196529的博客 3272

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

java中接口

 接口是实现构件可插入性的关键,可插入构件的关键在于存在一个公用的接口,以及每个构件实现了这个接口。   什么是接口?   Java中的接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。   接口的两种含义:一,Java接口,Java语言中存在的结构,有特定的

fenghu89的专栏 979

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Java接口

使用 interface 关键字定义接口定义接口时,可以包含抽象方法和常量。实现接口的类需要提供这些方法的具体实现。// 定义接口// 实现接口的类@OverrideSystem.out.println("汪汪");@OverrideSystem.out.println("喵喵");

qq_65860758的博客 1239

Java接口:小白如何初步认识Java接口?

但不提供具体实现。也就是是这。

2301_76937176的博客 715

在java中怎样实现接口_在Java中如何实现接口?接口的使用

详细内容本篇文章给大家带来的内容是介绍在Java中如何实现接口?接口的使用,让大家对接口有一个简单的了解。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。在java中,接口像类一样,可以有方法和变量,但在接口中声明的方法默认是抽象的(只有方法签名,没有主体)。接口是指定类必须执行什么操作,而不是如何操作。如果类实现了接口并且没有为接口中指定的所有函数提供方法体,则必须将类声明为抽象...

weixin_35792468的博客 1891

java 接口继承_接口是否可继承接口(java)

展开全部Java语法中,接口32313133353236313431303231363533e59b9ee7ad9431333366303839可以继承接口,抽象类可以实现接口,抽象类可以继承实体类。Java语法中,使用interface定义一个接口,使用class定义一个类,使用关键字abstract + class定义一个抽象类。以下分别对这3个知识点进行解析:1、接口可以继承接口接口可以多继...

weixin_42449422的博客 2468

【接口】Java 接口是什么以及如何使用

接口概念:在 Java 程序设计语言中, 接口不是类,而是对类的一组需求描述,这些类要遵从接口描 述的统一格式进行定义 。

刷刷的破壳日常 703

java中接口与计算机接口区别,java接口

Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。两种含义:一,Java接口,Java语言中存在的结构,有特定的语法和结构;二,一个类所具有的方法的特征集合,是一种逻辑上的抽象。前者叫做“Java接口”,后者叫做“接口”。中文名Java接口外文名java interface涵...

weixin_33741534的博客 314

JAVA接口继承接口

JAVA里面接口可以继承接口吗? 答案是可以的。但是继承的话不是使用implements关键字,而是使用extends关键字。 下面这么写代码是会报错的: //这个代码肯定是会报错的,因为子接口继承父接口应该使用extends interface Animal{ // 写一个抽象方法 void test(); } interface Cat implements Animal{ } 应该按照下面这么写: interface Animal{ // 写一个抽象方法 void test(); } i

weixin_43586713的博客 6905

java接口的回调_java接口,接口回调

0、 java 接口概念一直对 java 接口概念比较模糊,因为平时的学习相对简单,没有用上,所以就很模糊。最近想用了,却发现搞不懂。所以想练习一下,加深对 java 接口的理解。java 接口概念: java 接口是一种抽象的类型。里面定义了方法的名字,但是没有实现。interface Animal {public void eat();public void travel();}“接口感觉就是...

weixin_30480859的博客 640
上一篇: 初学j2ee的人都会遇到这样的问题,您是如何解决的呢?
下一篇: SCO CEO致开放源码组织的公开信
java169
博客等级 码龄19年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值