superhot预告片下载_预告片:裸指关节SOA

superhot预告片下载

我正在研究这个想法,但我不知道它是否对你们有吸引力。 我想就您是否需要进一步探讨提出您的意见。

这是一笔交易:我遇到了一些团队,这些团队在使用SOA技术时由于其工具的绝对复杂性而陷入泥潭。 我只在Java中看到过这种情况,但是我从一些C#开发人员那里听说,他们也意识到那里的现象。 我想探索一种替代方法。

与向您的项目中添加WSDL(Web服务定义语言。Hocuspocus)文件并自动生成内容相比,此方法需要更多的工作。 但是,它带有更多的了解和增强的可测试性。 最后,我体验到,尽管需要额外的体力劳动,但是这使我能够更快地完成任务。

这篇博客文章(如果您喜欢,它的扩展)的目的是探索总体上SOA特别是Web服务的更准系统的方法。 我通过一个具体的例子来说明这些原理:当用户的货币相对于美元跌至阈值以下时,通知用户。 为了使服务在技术上变得有趣,我将使用订户的IP地址来确定其币种。

步骤1:通过模拟外部交互来创建活动服务

模拟您自己的服务的活动可以帮助您构建定义与外部服务的交互的接口。

预告片:

public class CurrencyPublisherTest {private SubscriptionRepository subscriptionRepository = mock(SubscriptionRepository.class);private EmailService emailService = mock(EmailService.class);private CurrencyPublisher publisher = new CurrencyPublisher();private CurrencyService currencyService = mock(CurrencyService.class);private GeolocationService geolocationService = mock(GeolocationService.class);@Testpublic void shouldPublishCurrency() throws Exception {Subscription subscription = TestDataFactory.randomSubscription();String location = TestDataFactory.randomCountry();String currency = TestDataFactory.randomCurrency();double exchangeRate = subscription.getLowLimit() * 0.9;when(subscriptionRepository.findPendingSubscriptions()).thenReturn(Arrays.asList(subscription));when(geolocationService.getCountryByIp(subscription.getIpAddress())).thenReturn(location);when(currencyService.getCurrency(location)).thenReturn(currency);when(currencyService.getExchangeRateFromUSD(currency)).thenReturn(exchangeRate);publisher.runPeriodically();verify(emailService).publishCurrencyAlert(subscription, currency, exchangeRate);}@Beforepublic void setupPublisher() {publisher.setSubscriptionRepository(subscriptionRepository);publisher.setGeolocationService(geolocationService);publisher.setCurrencyService(currencyService);publisher.setEmailService(emailService);}
}

Spoiler:最近,我开始在测试中使用随机测试数据生成,效果很好。

发布者使用了许多服务。 现在让我们集中讨论一项服务:GeoLocationService。

步骤2:为每个服务创建测试和存根-从geolocationservice开始

最高级别的测试显示了我们对每个外部服务的需求。 得知此信息并阅读(是!)服务的WSDL后,我们可以测试驱动服务的存根。 在此示例中,我们实际上通过启动嵌入在测试中的Jetty使用HTTP运行测试。

预告片:

public class GeolocationServiceStubHttpTest {@Testpublic void shouldAnswerCountry() throws Exception {GeolocationServiceStub stub = new GeolocationServiceStub();stub.addLocation("80.203.105.247", "Norway");Server server = new Server(0);ServletContextHandler context = new ServletContextHandler();context.addServlet(new ServletHolder(stub), "/GeoService");server.setHandler(context);server.start();String url = "http://localhost:" + server.getConnectors()[0].getLocalPort();GeolocationService wsClient = new GeolocationServiceWsClient(url + "/GeoService");String location = wsClient.getCountryByIp("80.203.105.247");assertThat(location).isEqualTo("Norway");}
}

验证并创建xml有效负载

这是第一个“裸露的”位。 在这里,我无需使用框架即可创建XML有效负载(俗称的“ $”语法由JOOX库提供,JOOX库是内置JAXP类之上的瘦包装器):

我将用于实际服务的XSD(更多焦点)添加到项目中,并编写代码以验证消息。 然后,通过遵循验证错误开始构建XML有效负载。

预告片:

public class GeolocationServiceWsClient implements GeolocationService {private Validator validator;private UrlSoapEndpoint endpoint;public GeolocationServiceWsClient(String url) throws Exception {this.endpoint = new UrlSoapEndpoint(url);validator = createValidator();}@Overridepublic String getCountryByIp(String ipAddress) throws Exception {Element request = createGeoIpRequest(ipAddress);Document soapRequest = createSoapEnvelope(request);validateXml(soapRequest);Document soapResponse = endpoint.postRequest(getSOAPAction(), soapRequest);validateXml(soapResponse);return parseGeoIpResponse(soapResponse);}private void validateXml(Document soapMessage) throws Exception {validator.validate(toXmlSource(soapMessage));}protected Validator createValidator() throws SAXException {SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);Schema schema = schemaFactory.newSchema(new Source[] {new StreamSource(getClass().getResource("/geoipservice.xsd").toExternalForm()),new StreamSource(getClass().getResource("/soap.xsd").toExternalForm()),});return schema.newValidator();}private Document createSoapEnvelope(Element request) throws Exception {return $("S:Envelope",$("S:Body", request)).document();}private Element createGeoIpRequest(String ipAddress) throws Exception {return $("wsx:GetGeoIP", $("wsx:IPAddress", ipAddress)).get(0);}private String parseGeoIpResponse(Element response) {// TODOreturn null;}private Source toXmlSource(Document document) throws Exception {return new StreamSource(new StringReader($(document).toString()));}
}

在这个示例中,我从JOOX库中获得了一些帮助(也有些痛苦),用于Java中的XML操作。 由于Java的XML库非常疯狂,因此我也放弃了已检查的异常。

Spoiler:到目前为止,我对我发现的所有XML库中的名称空间,验证,XPath和检查的异常的处理通常都不满意。 所以我正在考虑创建自己的。

当然,您可以对从XSD自动生成的类使用相同的方法,但是我不相信这确实有很大帮助。

通过http流xml

Java内置的HttpURLConnection是一种笨拙但可维修的将XML传送到服务器的方法(只要您不执行高级HTTP身份验证)。

预告片:

public class UrlSoapEndpoint {private final String url;public UrlSoapEndpoint(String url) {this.url = url;}public Document postRequest(String soapAction, Document soapRequest) throws Exception {URL httpUrl = new URL(url);HttpURLConnection connection = (HttpURLConnection) httpUrl.openConnection();connection.setDoInput(true);connection.setDoOutput(true);connection.addRequestProperty("SOAPAction", soapAction);connection.addRequestProperty("Content-Type", "text/xml");$(soapRequest).write(connection.getOutputStream());int responseCode = connection.getResponseCode();if (responseCode != 200) {throw new RuntimeException("Something went terribly wrong: " + connection.getResponseMessage());}return $(connection.getInputStream()).document();}
}

破坏者:此代码应通过日志记录和错误处理进行扩展,并将验证移入装饰器中。 通过控制HTTP处理,我们可以解决人们购买ESB所要解决的大部分问题。

创建存根并解析xml

存根使用xpath在请求中查找位置。 它生成响应的方式与ws客户端生成请求的方式几乎相同(未显示)。

public class GeolocationServiceStub extends HttpServlet {private Map<String,String> locations = new HashMap<String, String>();public void addLocation(String ipAddress, String country) {locations.put(ipAddress, country);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {try {String ipAddress = $(req.getReader()).xpath("/Envelope/Body/GetGeoIP/IPAddress").text();String location = locations.get(ipAddress);createResponse(location).write(resp.getOutputStream());} catch (Exception e) {throw new RuntimeException("Exception at server " + e);}}
}

剧透:可以将存根扩展到一个网页,使我可以测试系统,而无需实际集成到任何外部服务。

验证并解析响应

ws客户端现在可以验证存根的响应是否符合XSD并解析响应。 同样,这是使用XPath完成的。 我没有显示代码,只是更多相同。

真实的东西!

现在,该代码将验证XML有效负载是否符合XSD。 这意味着ws客户端现在应该可以用于真实对象。 让我们编写一个单独的测试来检查它:

public class GeolocationServiceLiveTest {@Testpublic void shouldFindLocation() throws Exception {GeolocationService wsClient = new GeolocationServiceWsClient("http://www.webservicex.net/geoipservice.asmx");assertThat(wsClient.getCountryByIp("80.203.105.247")).isEqualTo("Norway");}}

好极了! 有用! 实际上,它在我第一次尝试时失败了,因为我没有正确的国家名称作为测试的IP地址。

这种点对点集成测试比我的其他单元测试慢,并且健壮性较低。 但是,我发现事实并非如此。 我从Infinitest配置中过滤了测试,除此之外我不在乎。

充实所有服务

需要以与GeolocationService相同的方式充实SubscriptionRepository,CurrencyService和EmailService。 但是,由于我们知道我们只需要与这些服务中的每一个进行非常特定的交互,因此我们不必担心作为SOAP服务的一部分可能发送或接收的所有内容。 只要我们能够完成业务逻辑(CurrencyPublisher)所需的工作,我们就很好!

示范和价值链测试

如果我们为存根创建Web UI,我们现在可以向客户展示该服务的整个价值链。 在我的SOA项目中,我们依赖的某些服务将仅在项目后期才能上线。 在这种情况下,我们可以使用存根显示我们的服务有效。

剧透:随着我厌倦了验证手动价值链测试的有效性,我可能最终会创建一个使用WebDriver设置存根并验证测试可以正常进行的测试,就像在手动测试中一样。

在Soa竞技场中战斗时脱下手套

在本文中,我展示并暗示了六种以上的技术,这些技术可用于不涉及框架,ESB或代码生成的测试,http,xml和验证。 该方法使程序员可以100%控制他们在SOA生态系统中的位置。 每个区域都需要深入探索。 如果您想探索它,请告诉我。

哦,我也想使用更好的Web服务的想法,因为Geolocated货币电子邮件非常实用。

参考: 预告片:来自我们JCG合作伙伴 Johannes Brodwall的“千篇一律的SOA”,来自“更大的盒子中的思考”博客。


翻译自: https://www.javacodegeeks.com/2012/07/teaser-bare-knuckle-soa.html

superhot预告片下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353215.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

J2ME开发环境配置(MyEclipse插件+WTK+jdk)

Myeclipse J2ME开发之环境配置的前言随着移动设备的普及和应用&#xff0c;在小型存储设备方面的研发进入了一个全新的时期,比如数字电视&#xff0c;PDA&#xff0c;移动存储通信设备等。而各方面的技术也进入了一个飞速发展的时期。尤其是近几年J2ME技术的发展。   而开发…

多少秒算长镜头_下中国象棋,能算多少步才算高手?

下象棋&#xff0c;你能算多少步&#xff1f;这是一个让初学者很困扰&#xff0c;也很感兴趣的话题。 很多象棋爱好者说&#xff1a;我最多看2步&#xff0c;我觉得能看5步以上的&#xff0c;就是超级高手高手高高手了。 但一代象棋宗师、14届全国冠军胡荣华的看法则颇有“玄学…

[湖南师大集训2018 7 26] hunger 解题报告 (SPFA)

饿 (hungry.pas/c/cpp) 【背景描述】 给出?个面值分别为?? 的纸币&#xff0c;每种纸币有无限张。另有?次询问&#xff0c;每次询问一个价格?&#xff0c;问用若干张纸币是否可以恰好得到?。 【输入格式】 第一行两个整数?&#xff0c;?。 接下来一行?个整数&#xff…

对基于消息队列的Activiti异步执行器进行基准测试

一点历史 永不停息​​的一件事是&#xff0c;Activiti如何以惊人的规模在一些大型组织中使用。 过去&#xff0c;这导致了各种优化和重构&#xff0c;其中包括异步执行器-替换旧的作业执行器。 对于未启动的用户&#xff1a;这些执行器在流程实例中处理计时器和异步继续。 特别…

最大公约数最小公倍数

最大公约数&#xff1a;&#xff08;用辗转相除法&#xff09;int cd(int x, int y) { int m, n, t; if(x > y) {m x; n y; } else { m y; n x; } while(m % n ! 0) { t n; n m % n; m t; } return n; }最小公倍数 x*y/最大公约数。

ACM网站

中国&#xff1a; 南阳理工http://acm.nyist.net/JudgeOnline/problemset.php 浙江大学 http://acm.zju.edu.cn 北京大学 http://acm.pku.edu.cn/JudgeOnline 天津大学 http://acm.tju.edu.cn 厦门大学 http://acm.xmu.edu.cn/JudgeOnline 福州大学 http://acm.fzu.edu.c…

2020德勤面试开始了吗_2020公务员面试公告已出,5月28日开始面试

重磅&#xff01;上海市2020年度考试录用公务员职位报名及面试工作公告出了&#xff01;报岗时间&#xff1a;2020年5月11日10:00至5月15日18:00岗位调剂&#xff1a;2020年5月18日10:00至5月20日18:00面试时间&#xff1a;2020年5月28日至6月1日面试时需携带哪些证件和材料?答…

JavaScript 常用内置对象(字符串属性、Math对象、Array数组对象)

1.字符串属性<script>var test_var "I Iove you";console.log(test_var.charAt(3)) //charAt(n) &#xff1a;返回该字符串第 n 位的单个字符。&#xff08;从 0 开始计数&#xff09; console.log(test_var.charCodeAt(2)); //charCodeAt(n) &#xff1a;返回…

阿米洛键盘取消win_阿米洛花旦娘静电容V2键盘测评:不止是一把好看的键盘

文丨me王bigfun社区原文地址&#xff1a;【开箱/测评】阿米洛花旦娘静电容V2键盘&#xff0c;不止是一把好看的键盘 - bigfun序&#xff1a;我想要换一把好的键盘&#xff0c;因为这把雷柏的V500键盘已经跟了我4年&#xff0c;现在的它又老又丑&#xff0c;抚摸起来的手感还很生…

NY : 括号匹配问题

括号配对问题 时间限制&#xff1a;3000 ms | 内存限制&#xff1a;65535 KB难度&#xff1a;3描述现在&#xff0c;有一行括号序列&#xff0c;请你检查这行括号是否配对。 输入第一行输入一个数N&#xff08;0<N<100&#xff09;,表示有N组测试数据。后面的N行输入多…

【代码笔记】Web-ionic-select

一&#xff0c;效果图。 二&#xff0c;代码。 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>Todo</title> <meta name"viewport" content"initial-scale1, maximum-scale1, user-scalableno…

adf开发_ADF:动态视图对象

adf开发今天&#xff0c;我想写有关动态视图对象的信息&#xff0c;该对象允许我在运行时更改其数据源&#xff08;SQL查询&#xff09;和属性。 我将使用oracle.jbo.ApplicationModule :: createViewObjectFromQueryStmt方法来解决此问题。 我将逐步介绍如何执行此操作 创建…

stm32f407能跑linux吗_跑步能跑进医院?那我该做跑步运动吗?想健康一点太难了...

跑步能跑进医院&#xff1f;那我该做跑步运动吗&#xff1f;想健康一点太难了&#xff0c;小编学生时期最喜欢的课程永远都是体育课&#xff0c;但最头疼的项目却是磨人的800米和1000米&#xff0c;那简直是我的的噩梦&#xff0c;近日&#xff0c;西安一名初中生跑步居然跑进了…

ACM进阶计划

ACM队不是为了一场比赛而存在的&#xff0c;为的是队员的整体提高。 大学期间&#xff0c;ACM队队员必须要学好的课程有&#xff1a; l C/C两种语言 l 高等数学 l 线性代数 l 数据结构 l 离散数学 l 数据库原理 l 操作系统原理 l 计算机组成原理 l 人工智能 l 编译原理 l 算法设…

关于真随机数生成器

有关如何产生随机数的理论有许多&#xff0c;如果要详细地讨论&#xff0c;需要厚厚的一本书的篇幅。 有限状态机不能产生真正的随机数的&#xff0c;所以在现在的计算机中并没有一个真正的随机数生成算法&#xff0c;现有的随机数生成算法生产的随机数只不过因为重复的周期比…

60秒内使用Java 9的Project Jigsaw的JavaFX HelloWorld

到目前为止&#xff0c;您可能已经听说过Java 9的新模块系统&#xff0c;即项目Jigsaw。 如果您不了解Java 9的新模块系统&#xff0c;则应访问Mark Reinhold的论文“模块系统的状态” 。 此外&#xff0c;您还应该访问nipafx Nicolai Parlog的出色博客&#xff0c; 网址为http…

互补输出级采用共集形式是为了使_天津大学胡文平《先进材料》:溶液法制备厘米级高度取向有机晶体阵列,可用于高性能有机场效应晶体管...

有机场效应晶体管(OFET)以其低成本和柔性受到了广泛关注&#xff0c;在显示驱动、射频识别标签和逻辑电路等方面具有潜在应用。包括小分子材料和共轭聚合物在内的可溶性有机半导体(OSCs)由于其可溶液加工而引起了许多研究者的兴趣&#xff0c;这种溶液可加工性可通过在柔性基底…

win7系统 普通管理员被删除,超级管理员被禁用。普通用户下。怎么激活administrator

需要启用超级管理员帐户&#xff0c;然后可以在超级管理员账户安装&#xff0c;在标准用户下正常使用。 如果你也想启用超级管理员帐户&#xff0c;可以按如下的步骤操作&#xff1a;右键单击“计算机”→“管理”&#xff0c;双击“本地用户和组”→“用户”&#xff0c;在右边…

模运算及其性质

忘了是不是原创了&#xff0c;谁发现了地址请告知。 本文以c语言为载体&#xff0c;对基本的模运算应用进行了分析和程序设计&#xff0c;以理论和实际相结合的方法向大家介绍模运算的基本应用。。 基本理论 基本概念&#xff1a; 给定一个正整数p&#xff0c;任意一个整数n&a…