예제 #1
0
        private static async Task <IProducer <OrderKey, OrderEventRecord> > CreateProducer(
            ISchemaRegistryClient registryClient,
            AutomaticRegistrationBehavior automaticRegistrationBehavior)
        {
            var schemaBuilder = new SchemaBuilder(
                SchemaBuilder.CreateDefaultCaseBuilders()
                .Prepend(builder => new OrderEventUnionSchemaBuilderCase(builder)));

            using var serializerBuilder = new SchemaRegistrySerializerBuilder(
                      registryClient,
                      schemaBuilder,
                      serializerBuilder: new BinarySerializerBuilder(
                          BinarySerializerBuilder.CreateDefaultCaseBuilders()
                          .Prepend(builder => new OrderEventUnionSerializerBuilderCase(builder))));

            var producerBuilder = new ProducerBuilder <OrderKey, OrderEventRecord>(
                new ProducerConfig
            {
                BootstrapServers = BootstrapServers,
            });

            await producerBuilder.SetAvroKeySerializer(
                registryClient,
                SubjectNameStrategy.Topic.ConstructKeySubjectName(Topic),
                automaticRegistrationBehavior);

            await producerBuilder.SetAvroValueSerializer(
                serializerBuilder,
                SubjectNameStrategy.Topic.ConstructKeySubjectName(Topic),
                automaticRegistrationBehavior);

            return(producerBuilder.Build());
        }
예제 #2
0
        public async Task BuildsSerializerWithAutoRegisteredSchema()
        {
            var subject = "new_subject";
            var id      = 40;

            RegistryMock.Setup(r => r.GetLatestSchemaAsync(subject))
            .ThrowsAsync(new SchemaRegistryException(
                             "Subject not found.",
                             HttpStatusCode.NotFound,
                             40401
                             ))
            .Verifiable();

            RegistryMock.Setup(r => r.RegisterSchemaAsync(subject, It.IsAny <string>()))
            .ReturnsAsync(id)
            .Verifiable();

            using (var builder = new SchemaRegistrySerializerBuilder(RegistryMock.Object))
            {
                await Assert.ThrowsAsync <SchemaRegistryException>(() => builder.Build <string>(subject));

                await builder.Build <string>(subject, registerAutomatically : true);

                RegistryMock.Verify(r => r.GetLatestSchemaAsync(subject), Times.Exactly(2));
                RegistryMock.Verify(r => r.RegisterSchemaAsync(subject, It.IsAny <string>()), Times.Once());
                RegistryMock.VerifyNoOtherCalls();
            }
        }
예제 #3
0
        public async Task BuildsSerializerWithSchemaSubject()
        {
            using (var builder = new SchemaRegistrySerializerBuilder(RegistryMock.Object))
            {
                await builder.Build <string>(TestSubject);

                RegistryMock.Verify(r => r.GetLatestSchemaAsync(TestSubject), Times.Once());
                RegistryMock.VerifyNoOtherCalls();
            }
        }
예제 #4
0
        public async Task SerializesUsingConfluentWireFormat(byte[] encoding, string data)
        {
            var context = new SerializationContext(MessageComponentType.Value, "test_topic");

            using (var builder = new SchemaRegistrySerializerBuilder(RegistryMock.Object))
            {
                var serializer = await builder.Build <string>(TestSubjectLatestId);

                Assert.Equal(encoding, serializer.Serialize(data, context));
            }
        }
예제 #5
0
 private void Start()
 {
     using (var registry = new CachedSchemaRegistryClient(registryConfig))
     {
         var typeResolver  = new ReflectionResolver(resolveReferenceTypesAsNullable: true);
         var schemaBuilder = new SchemaBuilder(typeResolver: typeResolver);
         using (var serializerBuilder = new SchemaRegistrySerializerBuilder(registry, schemaBuilder: schemaBuilder))
         {
             var  builder = new ProducerBuilder <TKey, TValue>(producerConfig);
             Task t       = builder.SetAvroValueSerializer(serializerBuilder, this.topic, registerAutomatically: AutomaticRegistrationBehavior.Always);
             while (!t.IsCompletedSuccessfully)
             {
                 ;
             }
             using (var producer = builder.Build())
             {
                 while (true)
                 {
                     if (KVPS.Count == 0)
                     {
                         Thread.Sleep(1);
                     }
                     else
                     {
                         lock (KVPS)
                         {
                             foreach (KeyValuePair <TKey, TValue> KVP in KVPS)
                             {
                                 try
                                 {
                                     Task p = producer.ProduceAsync(topic, new Message <TKey, TValue>
                                     {
                                         Key   = KVP.Key,
                                         Value = KVP.Value
                                     });
                                     while (!t.IsCompleted)
                                     {
                                         Console.WriteLine(p.Status);
                                     }
                                     Console.WriteLine(p.Status);
                                 }
                                 catch (Exception e)
                                 {
                                     System.Console.WriteLine(e);
                                 }
                             }
                             KVPS.Clear();
                         }
                     }
                 }
             }
         }
     }
 }
        public async Task ThrowsOnNullableTombstoneSchema()
        {
            var id   = 6;
            var json = @"[""null"",""int""]";

            registryMock.Setup(r => r.GetSchemaAsync(id, null))
            .ReturnsAsync(new Schema(json, SchemaType.Avro))
            .Verifiable();

            using var builder = new SchemaRegistrySerializerBuilder(registryMock.Object);

            await Assert.ThrowsAsync <UnsupportedSchemaException>(
                () => builder.Build <int?>(id, TombstoneBehavior.Strict));
        }
예제 #7
0
        public async Task ThrowsOnInvalidTombstoneType()
        {
            var id   = 4;
            var json = @"""int""";

            RegistryMock.Setup(r => r.GetSchemaAsync(id, null))
            .ReturnsAsync(new Schema(json, SchemaType.Avro))
            .Verifiable();

            using (var builder = new SchemaRegistrySerializerBuilder(RegistryMock.Object))
            {
                await Assert.ThrowsAsync <UnsupportedTypeException>(
                    () => builder.Build <int>(id, TombstoneBehavior.Strict));
            }
        }
        public async Task SerializesWithAutoRegistrationNever()
        {
            var subject = "test-subject";

            registryMock.Setup(r => r.GetLatestSchemaAsync(subject))
            .ReturnsAsync(new RegisteredSchema(subject, 1, 38, "\"int\"", SchemaType.Avro, null))
            .Verifiable();

            using var builder = new SchemaRegistrySerializerBuilder(registryMock.Object);

            await Assert.ThrowsAsync <UnsupportedTypeException>(() => builder.Build <string>(subject, registerAutomatically: AutomaticRegistrationBehavior.Never));

            registryMock.Verify();
            registryMock.VerifyNoOtherCalls();
        }
예제 #9
0
        public async Task ThrowsOnNullTombstoneSchema()
        {
            var id   = 1;
            var json = @"""null""";

            RegistryMock.Setup(r => r.GetSchemaAsync(id))
            .ReturnsAsync(json)
            .Verifiable();

            using (var builder = new SchemaRegistrySerializerBuilder(RegistryMock.Object))
            {
                await Assert.ThrowsAsync <UnsupportedSchemaException>(
                    () => builder.Build <int?>(id, TombstoneBehavior.Strict));
            }
        }
        public async Task BuildsSerializerWithSchemaId()
        {
            var id   = 6;
            var json = @"[""null"",""int""]";

            registryMock.Setup(r => r.GetSchemaAsync(id, null))
            .ReturnsAsync(new Schema(json, SchemaType.Avro))
            .Verifiable();

            using var builder = new SchemaRegistrySerializerBuilder(registryMock.Object);

            await builder.Build <int?>(id);

            registryMock.Verify();
            registryMock.VerifyNoOtherCalls();
        }
예제 #11
0
        public async Task BuildsSerializerWithSchemaId()
        {
            var id   = 6;
            var json = @"[""null"",""int""]";

            RegistryMock.Setup(r => r.GetSchemaAsync(id))
            .ReturnsAsync(json)
            .Verifiable();

            using (var builder = new SchemaRegistrySerializerBuilder(RegistryMock.Object))
            {
                await builder.Build <int?>(id);

                RegistryMock.Verify();
                RegistryMock.VerifyNoOtherCalls();
            }
        }
        public async Task SerializesWithAutoRegistrationAlways()
        {
            var id      = 40;
            var subject = "new_subject";

            registryMock.Setup(r => r.RegisterSchemaAsync(subject, It.Is <Schema>(s => s.SchemaType == SchemaType.Avro)))
            .ReturnsAsync(id)
            .Verifiable();

            using var builder = new SchemaRegistrySerializerBuilder(registryMock.Object);

            await builder.Build <string>(subject, registerAutomatically : AutomaticRegistrationBehavior.Always);

            registryMock.Verify(r => r.GetLatestSchemaAsync(subject), Times.Never());
            registryMock.Verify(r => r.RegisterSchemaAsync(subject, It.IsAny <Schema>()), Times.Once());
            registryMock.VerifyNoOtherCalls();
        }
        public async Task SerializesUsingConfluentWireFormat(byte[] encoding, string data)
        {
            var id   = 12;
            var json = @"""string""";

            registryMock.Setup(r => r.GetSchemaAsync(id, null))
            .ReturnsAsync(new Schema(json, SchemaType.Avro))
            .Verifiable();

            var context = new SerializationContext(MessageComponentType.Value, "test-topic");

            using var builder = new SchemaRegistrySerializerBuilder(registryMock.Object);

            var serializer = await builder.Build <string>(id);

            Assert.Equal(encoding, serializer.Serialize(data, context));
        }
        public async Task BuildsSerializerWithSchemaSubject()
        {
            var id      = 12;
            var json    = @"""string""";
            var subject = "test-subject";
            var version = 4;

            registryMock.Setup(r => r.GetLatestSchemaAsync(subject))
            .ReturnsAsync(new RegisteredSchema(subject, version, id, json, SchemaType.Avro, null))
            .Verifiable();

            using var builder = new SchemaRegistrySerializerBuilder(registryMock.Object);

            await builder.Build <string>(subject);

            registryMock.Verify();
            registryMock.VerifyNoOtherCalls();
        }
        public async Task HandlesConfluentWireFormatBytesCase()
        {
            var id   = 0;
            var json = @"""bytes""";

            registryMock.Setup(r => r.GetSchemaAsync(id, null))
            .ReturnsAsync(new Schema(json, SchemaType.Avro))
            .Verifiable();

            var data     = new byte[] { 0x02 };
            var encoding = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 };
            var context  = new SerializationContext(MessageComponentType.Value, "test-topic");

            using var builder = new SchemaRegistrySerializerBuilder(registryMock.Object);

            var serializer = await builder.Build <byte[]>(id);

            Assert.Equal(encoding, serializer.Serialize(data, context));
        }
예제 #16
0
        public async Task BuildsSerializerWithSchemaSubjectAndVersion()
        {
            var id      = 12;
            var json    = @"""string""";
            var subject = "test-subject";
            var version = 4;

            RegistryMock.Setup(r => r.GetRegisteredSchemaAsync(subject, version))
            .ReturnsAsync(new RegisteredSchema(subject, version, id, json, SchemaType.Avro, null))
            .Verifiable();

            RegistryMock.Setup(r => r.GetSchemaIdAsync(subject, It.Is <Schema>(s => s.SchemaString == json)))
            .ReturnsAsync(id)
            .Verifiable();

            using (var builder = new SchemaRegistrySerializerBuilder(RegistryMock.Object))
            {
                await builder.Build <string>(subject, version);

                RegistryMock.Verify();
                RegistryMock.VerifyNoOtherCalls();
            }
        }
예제 #17
0
        public async Task BuildsSerializerWithSchemaSubjectAndVersion()
        {
            var id      = 12;
            var json    = @"""string""";
            var subject = "test-subject";
            var version = 4;

            RegistryMock.Setup(r => r.GetSchemaAsync(subject, version))
            .ReturnsAsync(json)
            .Verifiable();

            RegistryMock.Setup(r => r.GetSchemaIdAsync(subject, json))
            .ReturnsAsync(id)
            .Verifiable();

            using (var builder = new SchemaRegistrySerializerBuilder(RegistryMock.Object))
            {
                await builder.Build <string>(subject, version);

                RegistryMock.Verify();
                RegistryMock.VerifyNoOtherCalls();
            }
        }