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,一经查实,立即删除!

相关文章

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

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

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

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

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日面试时需携带哪些证件和材料?答…

阿米洛键盘取消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;西安一名初中生跑步居然跑进了…

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;这种溶液可加工性可通过在柔性基底…

c++ 显示图片_飞利浦256P1FR显示器一线直连MacBook使用体验分享

前言嗨&#xff0c;大家好&#xff0c;我是默咖&#xff0c;一个喜欢分享的数码控。最近刚忙完给媳妇升级桌面&#xff0c;自己就忍不住想要换一个Type-C直连MacBook Pro的显示器了&#xff0c;不仅仅为了可以单线直连MacBook Pro也是为了减少拓展坞再接一个转接头的麻烦&#…

ghost快速安装系统的详细步骤?

很多时候我们安装系统都是在很快的时间内给安装完毕&#xff0c;不用像原来那样安装一个系统需要一个多小时&#xff0c;有了ghost是比较方便&#xff0c;十几分钟就可以把系统安装完&#xff0c;这也是DIY爱好者的福音&#xff0c;没有事情的时候安装下自己的系统&#xff0c;…

python安装库报错Microsoft visual c++ 14.0 is required问题解决办法

下载安装包安装即可&#xff1a; https://964279924.ctfile.com/fs/1445568-239446865 or http://www.liangchan.net/liangchan/10220.html转载于:https://www.cnblogs.com/stkares/p/9384424.html

Apache PDFBox命令行工具:无需Java编码

在博客文章Apache PDFBox 2中 &#xff0c;我演示了将Apache PDFBox 2用作从Java代码中调用的库来操作PDF。 事实证明&#xff0c;Apache PDFBox 2还提供了可以直接从命令行直接使用的命令行工具 &#xff0c;而无需其他Java编码。 有几种命令行工具可用&#xff0c;我将在本文…

在分析了47,251个依赖关系之后,2016年排名前100的Java库

谁在上面&#xff0c;谁在后面&#xff1f; 我们分析了Github上的47,251个依赖关系&#xff0c;并抽取了前100个Java库 长周末我们最喜欢的消遣是浏览Github并搜索流行的Java库。 我们决定与您分享乐趣和信息。 我们分析了Github上前3,862个Java项目使用的12,059个独特Java库…

tortoise清理本地分支_本地:延庆运污水环卫抽化粪池

北京兴百荣清洁公司是清理排水管道的技术服务中心。提供下水道疏通&#xff0c;化粪池清理&#xff0c;抽污水&#xff0c;化粪池清掏&#xff0c;管道清淤&#xff0c;下水道清洗&#xff0c;化粪池清理&#xff0c;抽粪&#xff0c;管道疏通&#xff0c;雨水管道清理&#xf…

win7(windows 7)系统下安装SQL2005(SQL Server 2005)图文教程

由于工作需要&#xff0c;今天要在电脑上安装SQL Server 2005。以往的项目都是使用Oracle&#xff0c;MS的数据库还真的没怎么用过&#xff0c;安装Oracle已经轻车熟路&#xff0c;但装SQL Server好像还有点小麻烦&#xff0c;所以记录下来&#xff0c;以留备用。 ------------…

抓娃娃机爪不动怎么办_黄子韬吃娃娃菜能把临时牙咬断?种植牙到底结实不结实?...

黄子韬的临时牙上热搜了&#xff0c;最高排名热搜榜第四位。有关牙齿的事儿瞬间让我这个口腔医生来了八卦之心&#xff0c;在看了后面的各种评论之后&#xff0c;我大概梳理清楚这到底是怎么回事了&#xff1a;小时候因为调皮所以摔断了门牙&#xff0c;前些日子门牙做了种植牙…

抖音数据统计_26万条抖音数据背后的推荐逻辑以及严重失调的男女比例

本文作者&#xff1a;喜哥&#xff08;张佳&#xff09;易灵微课《数据分析-认知与实践》讲师新榜数据分析师人人都是产品经理、华尔街见闻专栏作家简书科技类优秀作者本文首发自公众号喜新&#xff08;noyanjiu&#xff09;,如需转载请注明出处这次是26W条数据&#xff0c;应该…

SQL SERVER 数据库主键和外键的思考

SQL SERVER 数据库主键和外键的思考 什么是主键&#xff1a; 主键是指表中一个列或者列的组合&#xff0c;其值能够唯一的标识表中的每一个行。这样的一列或者多列成为表的主键&#xff0c;通过它可以强制表的实体完整性。当创建或者更改表时可以通过定义PRIMARY KEY约束来创建…