Pub / Sub本地模拟器

发布/订阅是GCP提供的不错的工具。 它非常方便,可以帮助您解决应用程序可能面临的消息传递难题。 实际上,如果您使用GCP,则可以使用托管消息解决方案。

如预期的那样,使用实际的发布/订阅解决方案需要一定的配额,因此对于

开发中,必须使用不会花钱的东西。

在这些情况下,您可以使用Pub / Sub 仿真器 。 要开始使用模拟器,您需要先安装它

 gcloud components install pubsub-emulator 

确实很方便,但是具有docker映像,因为它更便于携带。 不幸的是,没有来自Google Cloud的官方图片,但是您可以使用Docker Hub上可用的解决方案之一。

现在运行它

 gcloud beta emulators pubsub start --project= test -project 

之后,您的应用程序可以连接到发布/订阅模拟器。 默认端口为8085

我将以Java单元测试为例。

 package org.gkatzioura.pubsub;  import java.io.IOException;  import java.nio.charset.Charset;  import org.junit.After;  import org.junit.Assert;  import org.junit.Before;  import org.junit.Test;  import com.google.api.gax.core.CredentialsProvider;  import com.google.api.gax.core.NoCredentialsProvider;  import com.google.api.gax.grpc.GrpcTransportChannel;  import com.google.api.gax.rpc.FixedTransportChannelProvider;  import com.google.api.gax.rpc.TransportChannelProvider;  import com.google.cloud.pubsub.v1.Publisher;  import com.google.cloud.pubsub.v1.SubscriptionAdminClient;  import com.google.cloud.pubsub.v1.SubscriptionAdminSettings;  import com.google.cloud.pubsub.v1.TopicAdminClient;  import com.google.cloud.pubsub.v1.TopicAdminSettings;  import com.google.cloud.pubsub.v1.stub.GrpcSubscriberStub;  import com.google.cloud.pubsub.v1.stub.SubscriberStub;  import com.google.cloud.pubsub.v1.stub.SubscriberStubSettings;  import com.google.protobuf.ByteString;  import com.google.pubsub.v1.ProjectSubscriptionName;  import com.google.pubsub.v1.ProjectTopicName;  import com.google.pubsub.v1.PubsubMessage;  import com.google.pubsub.v1.PullRequest;  import com.google.pubsub.v1.PullResponse;  import com.google.pubsub.v1.PushConfig;  import com.google.pubsub.v1.Subscription;  import io.grpc.ManagedChannel;  import io.grpc.ManagedChannelBuilder;  public class LocalPubSubTest { private static final String PROJECT = "test-project" ; private static final String SUBSCRIPTION_NAME = "SUBSCRIBER" ; private static final String TOPIC_NAME = "test-topic-id" ; private static final String hostPort = "127.0.0.1:8085" ; private ManagedChannel channel; private TransportChannelProvider channelProvider; private TopicAdminClient topicAdmin; private Publisher publisher; private SubscriberStub subscriberStub; private SubscriptionAdminClient subscriptionAdminClient; private ProjectTopicName topicName = ProjectTopicName.of(PROJECT, TOPIC_NAME); private ProjectSubscriptionName subscriptionName = ProjectSubscriptionName.of(PROJECT, SUBSCRIPTION_NAME); private Subscription subscription; @Before public void setUp() throws Exception { channel = ManagedChannelBuilder.forTarget(hostPort).usePlaintext().build(); channelProvider = FixedTransportChannelProvider.create(GrpcTransportChannel.create(channel)); CredentialsProvider credentialsProvider = NoCredentialsProvider.create(); topicAdmin = createTopicAdmin(credentialsProvider); topicAdmin.createTopic(topicName); publisher = createPublisher(credentialsProvider); subscriberStub = createSubscriberStub(credentialsProvider); subscriptionAdminClient = createSubscriptionAdmin(credentialsProvider); subscription = subscriptionAdminClient.createSubscription(subscriptionName, topicName, PushConfig.getDefaultInstance(), 0); } @After public void tearDown() throws Exception { topicAdmin.deleteTopic(topicName); subscriptionAdminClient.deleteSubscription(subscription.getName()); channel.shutdownNow(); } @Test public void testLocalPubSub() throws Exception { final String messageText = "text" ; PubsubMessage pubsubMessage = PubsubMessage.newBuilder() .setData(ByteString.copyFrom(messageText, Charset.defaultCharset())) .build(); publisher.publish(pubsubMessage).get(); PullRequest pullRequest = PullRequest.newBuilder() .setMaxMessages(1) .setReturnImmediately( true ) // if messages are not available immediately return .setSubscription(subscription.getName()) .build(); PullResponse pullResponse = subscriberStub.pullCallable().call(pullRequest); String receiveMessageText = pullResponse.getReceivedMessages(0).getMessage().getData().toStringUtf8(); Assert.assertEquals(messageText, receiveMessageText); } private TopicAdminClient createTopicAdmin(CredentialsProvider credentialsProvider) throws IOException { return TopicAdminClient.create( TopicAdminSettings.newBuilder() .setTransportChannelProvider(channelProvider) .setCredentialsProvider(credentialsProvider) .build() ); } private SubscriptionAdminClient createSubscriptionAdmin(CredentialsProvider credentialsProvider) throws IOException { SubscriptionAdminSettings subscriptionAdminSettings = SubscriptionAdminSettings.newBuilder() .setCredentialsProvider(credentialsProvider) .setTransportChannelProvider(channelProvider) .build(); return SubscriptionAdminClient.create(subscriptionAdminSettings); } private Publisher createPublisher(CredentialsProvider credentialsProvider) throws IOException { return Publisher.newBuilder(topicName) .setChannelProvider(channelProvider) .setCredentialsProvider(credentialsProvider) .build(); } private SubscriberStub createSubscriberStub(CredentialsProvider credentialsProvider) throws IOException { SubscriberStubSettings subscriberStubSettings = SubscriberStubSettings.newBuilder() .setTransportChannelProvider(channelProvider) .setCredentialsProvider(credentialsProvider) .build(); return GrpcSubscriberStub.create(subscriberStubSettings); }  } 

而已。 现在您可以进行一些具有成本效益的单元测试!

翻译自: https://www.javacodegeeks.com/2019/09/pub-sub-local-emulator.html

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

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

相关文章

mysql建表时外检怎么创建_MySQL创建表时加入的约束以及外键约束的的意义

1,创建表时加入的约束a) 非空约束,not nullb) 唯一约束,uniquec) 主键约束,primary keyd) 外键约束,foreign key1,非空约束,针对某个字段设置其值不为空,如:学生的姓名不…

minecraft_MineCraft和堆外内存

minecraft总览 MineCraft是一个很好的例子,说明何时使用堆外内存确实可以提供帮助。 关键要求是: 保留的数据大部分是一个简单的数据结构(在Minecraft的情况下,其很多字节[]) 堆外内存的使用可以隐藏在抽象中。 考试…

win2008 mysql_mysql5.7.17在win2008R2的64位系统安装与配置实例

脚本之家已经给大家讲解过MYSQL其他版本在各种环境中的安装过程,大家可以参阅正文下面的相关文章,今天一起来学习下mysql5.7.17的实例安装教学,配置上稍微不同,希望能够帮助到你。安装MySql操作系统:Windows Server 20…

结构性错误

团队成员在使用以下代码时遇到了麻烦: void extractData(String targetUri) { Path tempFile createTempFilePath(); extractDataToPathAndUpload(tempFile, targetUri); cleanUp(tempFile); } void extractDataToPathAndUpload(Path tempFile, String targetUr…

mysql小计_使用SQL实现小计,合计以及排序_MySQL

bitsCN.com--说明:个人学习笔记,实现小计合计显示,分组按BANK_IDOP_DATE升序排序--测试数据CREATE TABLE #TB(ID VARCHAR(10),BANK_ID VARCHAR(10),OP_DATE VARCHAR(10),OPERATOR_NO VARCHAR(20),AMT DECIMAL(10,2))INSERT #TB SELECT 1111,0…

mule和activemq_Mule ESB,ActiveMQ和DLQ

mule和activemq在本文中,我将展示一个简单的Mule ESB流程,以了解实际中使用的Active MQ 的DLQ功能 。 我假设您有一个正在运行的Apache ActiveMQ实例(如果没有,则可以在此处下载一个版本)。 在此示例中,我…

MySQL倒序如何避免filesort_如何避免mysql查询的filesort?

我用不同的参数使用这种查询:EXPLAIN SELECT SQL_NO_CACHE ilan_genel.id , ilan_genel.durum , ilan_genel.kategori , ilan_genel.tip , ilan_genel.ozellik , ilan_genel.m2 , ilan_genel.fiyat , ilan_genel.baslik , ilan_genel.ilce , ilan_genel.parabirimi …

在Java中键入Safe SQL

字符串,字符串,字符串 无论您使用的是JPA , MyBatis还是Spring Data JDBC之类的框架,最终都将SQL语句声明为Java String。 这种方法的问题在于,您必须为每个语句编写测试,以确保它甚至是有效的SQL。 没有编…

springmvc怎么设置更改了界面不用重启_Microsoft Visual Studio 2019 更改语言包

第一次写文章,如有格式等问题,请多多包含与指点!很多人在编程时更喜欢英文界面,认为与编程语言具有相同的语境,更顺手。但是,在更改环境显示语言时,可能会遇到一些障碍,例如我之前在…

苹果电脑怎么删除软件_误格式化,删除文件怎么恢复?3款最好用的数据恢复软件推荐...

1、EasyRecovery一款威力非常强大的硬盘数据恢复工具,能够恢复丢失的数据以及重建文件系统。主要体现在可以从被病毒破坏或是已经格式化的硬盘中恢复数据。EasyRecovery在使用过程中不会在原始的驱动器中写入任何东西,其主要是在内存中重建文件分区表使数…

设计模式 生成器_生成器设计模式的应用

设计模式 生成器嗨,您好! 今天,我将分享我制作的全新设计模式系列的第一个。 构建器设计模式是开发严肃的应用程序时非常有用且通用的模式。 在这篇文章中,我将提供一个很小的构建器模式框架,因此您随时可以回到这里并…

C++ Qt全局异常处理器_QT教程

点击上方 蓝字关注我们今日资源今天的资源是另一套QT教程,某马发的,网上搜集到的。这已经是这个公众号发放的第三套QT教程了。关于QT:Qt(官方发音 [kju:t],音同 cute)是一个跨平台的 C 开发库,主要用来开发图形用户界面…

无线设置 用户_无线WiFi远距离无线蹭网怎么中继桥接组网【详细介绍】

自从小编每天分享各种各样的无线无线WiFi蹭网、桥接、远距离组网等实例,吸引了很多朋友的兴趣,有很多网友通过关心我后,给我私信,求助我一些相关的问题,还有一些朋友建议我出一些教程。首先小编觉得有些东西只能意会不…

应用宝苹果版_点赞应用ios版下载-点赞应用苹果版下载v1.1

《点赞应用》app是一款实用的视频生成器工具,用户可以利用它为自己的视频添加各种各样的点赞效果。应用内含有多种类型的模板,都是免费使用的,想要将你的视频变得更有趣吗?快来下载体验一下这款应用吧!软件特色1、这个…

SQL即服务

自2007年以来,我一直在考虑这一点,大约在Amazon 推出 S3时。 我什至尝试实现了几次,但是在设计阶段之后就失败了。 我听说过一家初创公司,也曾尝试这样做,但也失败了 。 我仍然不确定是否可以这样做,但是它…

c++ vector 一部分_《JACS》:在富电子C-H键位点上实现光控活性聚合

可逆加成-断裂链转移(RAFT)自由基活性聚合是一种调控聚合物结构组成、分子量和分布的重要聚合方法,其中,光诱导电子/能量转移(PET)的RAFT聚合反应是一种更精确的调控手段,因而经常被用于设计具有复杂3D分子结构的聚合物。然而常规的PET-RAFT法…

phpmyadmin忘记mysql密码_忘记phpmyadmin密码怎么重置

忘记phpmyadmin密码怎么重置,新密码,教程,相关文章,重新启动,跳过忘记phpmyadmin密码怎么重置易采站长站,站长之家为您整理了忘记phpmyadmin密码怎么重置的相关内容。1、停止mysql服务:/etc/init.d/mysql stop2、跳过验证启动MySQL/usr/local/mysql/bin/…

纵横免root框架打不开应用怎么办_很好用的软件多开神奇安卓欧皇十框架!!!...

欧皇十框架这是一款兼容安卓10的应用框架,轻松实现应用多开,可以完美免ROOT运行GG修改器,专为和平精英游戏设计,软件体积小,运行稳定。修改说明:1.支持更多应用游戏的多开、双开,使用更稳定、快…

电脑无internet访问_电脑中的代理服务器怎么设置 代理服务器设置方法 - 操作系统...

如何设置电脑中的代理服务器?对于代理服务器,可能大家对其并不是非常了解,其实代理服务器作为一种特殊的网络服务,可以代理网络用户去获取网络信息,提高浏览速度与效率,而且还可以突破自身IP的访问限制,访…

mysql先进后出_栈、队列中“先进先出”,“后进先出”的含义

展开全部先进先出(62616964757a686964616fe58685e5aeb931333433653339FIFO,first-in,first-out)为处理从队列或堆栈发出的程序工作要求的一种方法,它使最早的要求被最先处理。后进先出,从栈中取出数据项的顺序与将它们插入栈的顺序…