当前位置: 首页 > news >正文

国内建网站知名企业wordpress转发微信缩略图

国内建网站知名企业,wordpress转发微信缩略图,策划书标准格式,网站开发数据流程图怎么画服务器发送的事件 #xff08;或简称为SSE #xff09;是非常有用的协议#xff0c;它允许服务器通过HTTP将数据推送到客户端。 这是我们的网络浏览器支持的年龄#xff0c;但令人惊讶的是#xff0c; JAX-RS规范在很长一段时间内都忽略了这一点。 尽管Jersey提供了适用于… 服务器发送的事件 或简称为SSE 是非常有用的协议它允许服务器通过HTTP将数据推送到客户端。 这是我们的网络浏览器支持的年龄但令人惊讶的是 JAX-RS规范在很长一段时间内都忽略了这一点。 尽管Jersey提供了适用于SSE媒体类型的扩展名但该API尚未正式化因此不能移植到其他JAX-RS实现中。 幸运的是 JAX-RS 2.1 也称为JSR-370通过将SSE支持客户端和服务器端作为正式规范的一部分已经改变了这一点。 在今天的帖子中我们将研究如何使用最近发布的出色的Apache CXF框架3.2.0版将SSE支持集成到现有的Java RESTful Web服务中。 实际上除了自举之外实际上没有CXF特定的东西所有示例都应在实现JAX-RS 2.1规范的任何其他框架中工作。 事不宜迟让我们开始吧。 由于这些天大量的Java项目都建立在出色的Spring Framework之上因此我们的示例应用程序将使用Spring Boot和Apache CXF Spring Boot Integration使我们Swift起步。 老好伙伴Apache Maven也可以通过管理项目依赖项来帮助我们。 org.springframework.bootspring-boot-starter1.5.8.RELEASEorg.apache.cxfcxf-rt-frontend-jaxrs3.2.0org.apache.cxfcxf-spring-boot-starter-jaxrs3.2.0org.apache.cxfcxf-rt-rs-client3.2.0org.apache.cxfcxf-rt-rs-sse3.2.0 在后台 Apache CXF正在使用Atmosphere框架来实现SSE传输因此这是我们必须包括的另一个依赖项。 org.atmosphereatmosphere-runtime2.4.14 有关依赖于Atmosphere框架的详细信息导致需要提供其他配置设置即transportId 以确保在运行时拾取支持SSE的传输。 相关详细信息可以添加到application.yml文件中 cxf:servlet:init:transportId: http://cxf.apache.org/transports/http/sse 太好了所以基础就在那里继续前进。 我们将要构建的RESTful Web服务将在SSE流中公开虚构的CPU平均负载为简单起见随机生成。 Stats类将构成我们的数据模型。 public class Stats {private long timestamp;private int load;public Stats() {}public Stats(long timestamp, int load) {this.timestamp timestamp;this.load load;}// Getters and setters are omitted... } 说到流 Reactive Streams规范已进入Java 9 希望我们能看到Java社区加速采用反应式编程模型。 此外在具有Reactive Streams支持的情况下开发支持SSE的 RESTful Web服务将变得更加容易和直接。 为此让我们将RxJava 2集成到示例应用程序中。 io.reactivex.rxjava2rxjava2.1.6 这是开始使用我们的StatsRestService类典型的JAX-RS资源实现的好时机。 JAX-RS 2.1中的关键SSE功能以Sse上下文对象为中心可以像这样注入。 Service Path(/api/stats) public class StatsRestService {Context public void setSse(Sse sse) {// Access Sse context here} 在Sse上下文之外我们可以访问两个非常有用的抽象例如SseBroadcaster和OutboundSseEvent.Builder private SseBroadcaster broadcaster; private Builder builder;Context public void setSse(Sse sse) {this.broadcaster sse.newBroadcaster();this.builder sse.newEventBuilder(); } 您可能已经猜到了 OutboundSseEvent.Builder构造了OutboundSseEvent类的实例这些实例可以通过电线发送而SseBroadcaster则向所有连接的客户端广播相同的SSE流。 话虽如此我们可以生成OutboundSseEvent的流并将其分发给感兴趣的每个人 private static void subscribe(final SseBroadcaster broadcaster, final Builder builder) {Flowable.interval(1, TimeUnit.SECONDS).zipWith(eventsStream(builder), (id, bldr) - createSseEvent(bldr, id)).subscribeOn(Schedulers.single()).subscribe(broadcaster::broadcast); }private static FlowableOutboundSseEvent.Builder eventsStream(final Builder builder) {return Flowable.generate(emitter - emitter.onNext(builder.name(stats))); } 如果您不熟悉RxJava 2 请不用担心这就是这里发生的情况。 eventsStream方法为stats类型的SSE事件返回有效无限的OutboundSseEvent.Builder实例流。 订阅方法稍微复杂一些。 我们首先创建一个流该流每秒发出序号例如fe 0,1,2,3,4,5,6… 依此类推。 稍后我们将此流与eventsStream方法返回的流合并实质上将两个流合并为一个流该流每秒发出一个元组number OutboundSseEvent.Builder 。 公平地说该元组对我们不是很有用因此我们将其转换为OutboundSseEvent类的实例将数字视为SSE事件标识符 private static final Random RANDOM new Random();private static OutboundSseEvent createSseEvent(OutboundSseEvent.Builder builder, long id) {return builder.id(Long.toString(id)).data(Stats.class, new Stats(new Date().getTime(), RANDOM.nextInt(100))).mediaType(MediaType.APPLICATION_JSON_TYPE).build(); } OutboundSseEvent可以使用常规MessageBodyWriter解析策略在data属性中携带将相对于指定的mediaType进行序列化的任何有效负载。 一旦获得OutboundSseEvent实例便使用SseBroadcaster :: broadcast方法将其发送出去。 请注意我们使用subscribeOn运算符将控制流移交给了另一个线程这通常是您一直在做的事情。 很好希望现在清除了流部分但是我们如何才能真正订阅SseBroadcaster发出的SSE事件 这比您想像的要容易 GET Path(broadcast) Produces(MediaType.SERVER_SENT_EVENTS) public void broadcast(Context SseEventSink sink) {broadcaster.register(sink); } 我们都准备好了。 这里最重要的是正在生成的内容类型应将其设置为MediaType.SERVER_SENT_EVENTS 。 在这种情况下 SseEventSink的上下文实例变得可用并且可以向SseBroadcaster实例注册。 要查看我们的JAX-RS资源我们需要使用例如JAXRSServerFactoryBean引导服务器实例并在此过程中配置所有必需的提供程序。 请注意我们也在显式指定要使用的传输在这种情况下为SseHttpTransportFactory.TRANSPORT_ID 。 Configuration EnableWebMvc public class AppConfig extends WebMvcConfigurerAdapter {Beanpublic Server rsServer(Bus bus, StatsRestService service) {JAXRSServerFactoryBean endpoint new JAXRSServerFactoryBean();endpoint.setBus(bus);endpoint.setAddress(/);endpoint.setServiceBean(service);endpoint.setTransportId(SseHttpTransportFactory.TRANSPORT_ID);endpoint.setProvider(new JacksonJsonProvider());return endpoint.create();}Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler(/static/**).addResourceLocations(classpath:/web-ui/); } } 要结束循环我们只需要为Spring Boot应用程序提供运行器即可 SpringBootApplication public class SseServerStarter { public static void main(String[] args) {SpringApplication.run(SseServerStarter.class, args);} } 现在如果我们运行该应用程序并使用多个Web浏览器或同一浏览器中的不同选项卡导航到http// localhost8080 / static / broadcast.html 我们将观察到所有事件内部绘制的相同事件流 不错广播当然是一个有效的用例但是在每次端点调用时返回一个独立的SSE流又如何呢 简单只需使用SseEventSink方法例如send和close 即可直接操作SSE流。 GET Path(sse) Produces(MediaType.SERVER_SENT_EVENTS) public void stats(Context SseEventSink sink) {Flowable.interval(1, TimeUnit.SECONDS).zipWith(eventsStream(builder), (id, bldr) - createSseEvent(bldr, id)).subscribeOn(Schedulers.single()).subscribe(sink::send, ex - {}, sink::close); } 这次如果我们运行该应用程序并使用多个Web浏览器或同一浏览器中的不同选项卡导航到http// localhost8080 / static / index.html 我们将观察到完全不同的图表 出色的服务器端API确实非常简洁且易于使用。 但是在客户端方面我们可以使用Java应用程序中的SSE流吗 答案是肯定的。 JAX-RS 2.1还概述了客户端API其核心是SseEventSource 。 final WebTarget target ClientBuilder.newClient().register(JacksonJsonProvider.class).target(http://localhost:8080/services/api/stats/sse);try (final SseEventSource eventSource SseEventSource.target(target).reconnectingEvery(5, TimeUnit.SECONDS).build()) {eventSource.register(event - {final Stats stats event.readData(Stats.class, MediaType.APPLICATION_JSON_TYPE);System.out.println(name: event.getName());System.out.println(id: event.getId());System.out.println(comment: event.getComment());System.out.println(data: stats.getLoad() , stats.getTimestamp());System.out.println(---------------);});eventSource.open();// Just consume SSE events for 10 secondsThread.sleep(10000); } 如果运行此代码段假设服务器也已启动并且正在运行我们将在控制台中看到类似的内容您可能还记得数据是随机生成的。 name: stats id: 0 comment: null data: 82, 1509376080027 --------------- name: stats id: 1 comment: null data: 68, 1509376081033 --------------- name: stats id: 2 comment: null data: 12, 1509376082028 --------------- name: stats id: 3 comment: null data: 5, 1509376083028 ---------------... 如我们所见服务器端的OutboundSseEvent变为客户端的InboundSseEvent 。 客户端可以使用通常的MessageBodyReader解析策略通过指定预期的媒体类型来消耗数据属性中可以反序列化的任何有效负载。 单篇文章中压缩了很多内容。 而且关于SSE和JAX-RS 2.1的更多信息我们在这里没有涉及例如使用HttpHeaders.LAST_EVENT_ID_HEADER或配置重新连接延迟。 如果有兴趣学习的话这些可能是即将发布的帖子的重要话题。 总而言之 JAX-RS对SSE的支持是我们许多人期待已久的事情。 最后它在那里请尝试一下 完整的项目资源可在Github上找到 。 翻译自: https://www.javacodegeeks.com/2017/10/better-late-never-sse-server-sent-events-now-jax-rs.html
http://www.zqtcl.cn/news/478634/

相关文章:

  • 网站建设开题报告ppt模板重庆建设工程信息网址
  • 做个什么类型网站百度云资源链接分享群组
  • 商务网站建设的主流程西安建设局网站
  • 邢台营销型网站建设做网站的保证承诺
  • 关于茶叶的网站模板免费下载wordpress多边形按钮
  • 贵阳市网站建设手工制作花
  • 娄底哪里做网站免费永久不限空间
  • 网站标签怎么做wordpress 后台模板
  • 内江移动网站建设网站内部链接的作用有哪些
  • 阿里云的wordpress建站wordpress 批量定时发布
  • 网站院长信箱怎么做海报设计制作网站
  • 办网站如何备案怎么制作微信链接网页
  • 聊城门户网站建设怎样能有个人网站
  • 营销网站建设资料创意网站 模板
  • 免费的短网址生成器深圳外贸网站优化
  • 网站推广哪个平台最好图库
  • 在东莞做网站vue做网站好吗
  • 手机网站的页面大小郑州恩恩网站建设
  • 视频运营管理平台长沙网站seo技术
  • 网站建设有哪些规章制度网页版面
  • 海伦网站建设做网站建设的联系电话
  • 免费做字体的网站枣强网站建设代理
  • 建设网站素材海南百度推广公司电话
  • 温州企业网站建设费用培训行业门户网站建设方案
  • 口碑好的常州网站优化深圳市光明区实验学校
  • 网站怎么做微博认证网页设计代码html作品展示
  • 在线网站建设活动初创企业的建站流程
  • 汨罗哪里有网站开发的公司电话百度首页关键词推广
  • 天津百度整站优化服务政务网站模版
  • 推荐家居企业网站建设用什么工具修改wordpress