@@ -2345,7 +2345,7 @@ func TestProducerSendWithContext(t *testing.T) {
23452345 // Make ctx be canceled to invalidate the context immediately
23462346 cancel ()
23472347 _ , err = producer .Send (ctx , & ProducerMessage {
2348- Payload : make ([]byte , 1024 * 1024 ),
2348+ Payload : make ([]byte , 1024 ),
23492349 })
23502350 // producer.Send should fail and return err context.Canceled
23512351 assert .True (t , errors .Is (err , context .Canceled ))
@@ -2605,3 +2605,82 @@ func TestSelectConnectionForSameProducer(t *testing.T) {
26052605
26062606 client .Close ()
26072607}
2608+
2609+ func TestProducerKeepReconnectingAndThenCallSendAsync (t * testing.T ) {
2610+ testProducerKeepReconnectingAndThenCallSendAsync (t , false )
2611+ testProducerKeepReconnectingAndThenCallSendAsync (t , true )
2612+ }
2613+
2614+ func testProducerKeepReconnectingAndThenCallSendAsync (t * testing.T , isEnabledBatching bool ) {
2615+ t .Helper ()
2616+
2617+ req := testcontainers.ContainerRequest {
2618+ Image : getPulsarTestImage (),
2619+ ExposedPorts : []string {"6650/tcp" , "8080/tcp" },
2620+ WaitingFor : wait .ForExposedPort (),
2621+ Cmd : []string {"bin/pulsar" , "standalone" , "-nfw" },
2622+ }
2623+ c , err := testcontainers .GenericContainer (context .Background (), testcontainers.GenericContainerRequest {
2624+ ContainerRequest : req ,
2625+ Started : true ,
2626+ })
2627+ require .NoError (t , err , "Failed to start the pulsar container" )
2628+ defer c .Terminate (context .Background ())
2629+
2630+ endpoint , err := c .PortEndpoint (context .Background (), "6650" , "pulsar" )
2631+ require .NoError (t , err , "Failed to get the pulsar endpoint" )
2632+
2633+ client , err := NewClient (ClientOptions {
2634+ URL : endpoint ,
2635+ ConnectionTimeout : 5 * time .Second ,
2636+ OperationTimeout : 5 * time .Second ,
2637+ })
2638+ require .NoError (t , err )
2639+ defer client .Close ()
2640+
2641+ var testProducer Producer
2642+ require .Eventually (t , func () bool {
2643+ testProducer , err = client .CreateProducer (ProducerOptions {
2644+ Topic : newTopicName (),
2645+ Schema : NewBytesSchema (nil ),
2646+ SendTimeout : 3 * time .Second ,
2647+ DisableBatching : isEnabledBatching ,
2648+ })
2649+ return err == nil
2650+ }, 30 * time .Second , 1 * time .Second )
2651+
2652+ // send a message
2653+ errChan := make (chan error )
2654+ defer close (errChan )
2655+
2656+ testProducer .SendAsync (context .Background (), & ProducerMessage {
2657+ Payload : []byte ("test" ),
2658+ }, func (_ MessageID , _ * ProducerMessage , err error ) {
2659+ errChan <- err
2660+ })
2661+ select {
2662+ case <- time .After (10 * time .Second ):
2663+ t .Fatal ("test timeout" )
2664+ case err := <- errChan :
2665+ require .NoError (t , err )
2666+ }
2667+
2668+ // stop pulsar server
2669+ timeout := 10 * time .Second
2670+ err = c .Stop (context .Background (), & timeout )
2671+ require .NoError (t , err )
2672+
2673+ // send again
2674+ testProducer .SendAsync (context .Background (), & ProducerMessage {
2675+ Payload : []byte ("test" ),
2676+ }, func (_ MessageID , _ * ProducerMessage , err error ) {
2677+ errChan <- err
2678+ })
2679+ select {
2680+ case <- time .After (10 * time .Second ):
2681+ t .Fatal ("test timeout" )
2682+ case err = <- errChan :
2683+ // should get a timeout error
2684+ require .ErrorIs (t , err , ErrSendTimeout )
2685+ }
2686+ }
0 commit comments