public static void Main() { Console.WriteLine("Subscribing to " + Channel + " on stream Id " + StreamID); var ctx = new Aeron.Context() .AvailableImageHandler(SamplesUtil.PrintUnavailableImage) .UnavailableImageHandler(SamplesUtil.PrintUnavailableImage); var reporter = new RateReporter(1000, SamplesUtil.PrintRate); var fragmentAssembler = new FragmentAssembler(SamplesUtil.RateReporterHandler(reporter)); var running = new AtomicBoolean(true); var t = new Thread(subscription => SamplesUtil.SubscriberLoop(fragmentAssembler.OnFragment, FragmentCountLimit, running)((Subscription)subscription)); var report = new Thread(reporter.Run); using (var aeron = Aeron.Connect(ctx)) using (var subscription = aeron.AddSubscription(Channel, StreamID)) { t.Start(subscription); report.Start(); Console.ReadLine(); Console.WriteLine("Shutting down..."); running.Set(false); reporter.Halt(); t.Join(); report.Join(); } }
public static void Main() { Console.WriteLine("Subscribing to " + Channel + " on stream Id " + StreamID); var ctx = new Aeron.Context() .AvailableImageHandler(SamplesUtil.PrintUnavailableImage) .UnavailableImageHandler(SamplesUtil.PrintUnavailableImage); var reporter = new RateReporter(1000, SamplesUtil.PrintRate); var fragmentAssembler = new FragmentAssembler(SamplesUtil.RateReporterHandler(reporter)); var running = new AtomicBoolean(true); var t = new Thread(subscription => SamplesUtil.SubscriberLoop(fragmentAssembler.OnFragment, FragmentCountLimit, running)((Subscription) subscription)); var report = new Thread(reporter.Run); using (var aeron = Aeron.Connect(ctx)) using (var subscription = aeron.AddSubscription(Channel, StreamID)) { t.Start(subscription); report.Start(); Console.ReadLine(); Console.WriteLine("Shutting down..."); running.Set(false); reporter.Halt(); t.Join(); report.Join(); } }
public void Start(DataHandler dataHandler) { if (Interlocked.CompareExchange(ref _isRunning, 1, 0) == 0) { _log.InfoFormat("Starting transport for channel [{0}] and stream [{1}]", _channel, _stream); var fragmentAssembler = new FragmentAssembler( (buffer, offset, length, _) => { var data = new byte[length]; buffer.GetBytes(offset, data); dataHandler(data, length); } ); //will block until stopped while (_isRunning == 1) { var fragmentsRead = _subscription.Poll(fragmentAssembler.OnFragment, _fragmentLimit); _idleStrategy.Idle(fragmentsRead); } _log.InfoFormat("Stopped transport for channel [{0}] and stream [{1}]", _channel, _stream); } else { var message = string.Format( "Cannot start transport for channel [{0}] and stream [{1}]; transport is already active", _channel, _stream ); _log.Warn(message); throw new InvalidOperationException(message); } }
public EgressAdapter(IEgressListener listener, Subscription subscription, int fragmentLimit) { _fragmentAssembler = new FragmentAssembler(this); _listener = listener; _subscription = subscription; _fragmentLimit = fragmentLimit; }
private void RunLoop(Subscription sub, Publication pub) { var buffer = new UnsafeBuffer(BufferUtil.AllocateDirectAligned(2048, 16)); var random = new Random(); while (true) { if (pub.IsConnected) { if (SendMessage(pub, buffer, "HELLO " + this.local_address.Port)) { break; } } } var assembler = new FragmentAssembler(OnParseMessage); while (true) { if (pub.IsConnected) { SendMessage(pub, buffer, random.Next(0, int.MaxValue).ToString()); } if (sub.IsConnected) { sub.Poll(assembler, 10); } Thread.Sleep(1000); } }
public AeronSubscription(Subscription subscription) { _subscription = subscription; // dataHandler method is called for every new datagram received _fragmentReassembler = new FragmentAssembler(HandlerHelper.ToFragmentHandler(CompleteMessageReceived)); }
private void PollThread() { var idleStrategy = _config.ClientIdleStrategy.GetClientIdleStrategy(); var fragmentHandler = new FragmentAssembler(HandlerHelper.ToFragmentHandler(SubscriptionHandler)); while (_isRunning && !_isTerminating) { idleStrategy.Idle(_subscription.Poll(fragmentHandler, _frameCountLimit)); } }
public void SetUp() { delegateFragmentHandler = A.Fake <FragmentHandler>(); termBuffer = A.Fake <IDirectBuffer>(); adapter = new FragmentAssembler(delegateFragmentHandler); header = A.Fake <Header>(x => x.Wrapping(new Header(INITIAL_TERM_ID, LogBufferDescriptor.TERM_MIN_LENGTH))); header.SetBuffer(termBuffer, 0); A.CallTo(() => termBuffer.GetInt(A <int> ._)).Returns(SESSION_ID); }
public void SetUp() { delegateFragmentHandler = A.Fake<FragmentHandler>(); termBuffer = A.Fake<IDirectBuffer>(); adapter = new FragmentAssembler(delegateFragmentHandler); header = A.Fake<Header>(x => x.Wrapping(new Header(INITIAL_TERM_ID, LogBufferDescriptor.TERM_MIN_LENGTH))); header.SetBuffer(termBuffer, 0); A.CallTo(() => termBuffer.GetInt(A<int>._)).Returns(SESSION_ID); }
private void RunLoop(Subscription sub) { var assembler = new FragmentAssembler(OnParseMessage); while (true) { if (sub.IsConnected) { sub.Poll(assembler, 10); } Thread.Sleep(100); } }
private AeronCluster(Context ctx) { _ctx = ctx; Subscription subscription = null; try { ctx.Conclude(); _aeron = ctx.Aeron(); _idleStrategy = ctx.IdleStrategy(); _nanoClock = _aeron.Ctx().NanoClock(); _isUnicast = ctx.ClusterMemberEndpoints() != null; UpdateMemberEndpoints(ctx.ClusterMemberEndpoints()); subscription = _aeron.AddSubscription(ctx.EgressChannel(), ctx.EgressStreamId()); _subscription = subscription; _publication = ConnectToCluster(); _clusterSessionId = OpenSession(); UnsafeBuffer headerBuffer = new UnsafeBuffer(new byte[SessionDecorator.SESSION_HEADER_LENGTH]); _sessionHeaderEncoder .WrapAndApplyHeader(headerBuffer, 0, _messageHeaderEncoder) .ClusterSessionId(_clusterSessionId) .Timestamp(Aeron.Aeron.NULL_VALUE); _vectors[0] = new DirectBufferVector(headerBuffer, 0, SessionDecorator.SESSION_HEADER_LENGTH); _vectors[1] = _messageBuffer; _poller = new Poller(ctx.SessionMessageListener(), _clusterSessionId, this); _fragmentAssembler = new FragmentAssembler(_poller); } catch (Exception) { if (!ctx.OwnsAeronClient()) { CloseHelper.QuietDispose(_publication); CloseHelper.QuietDispose(subscription); } CloseHelper.QuietDispose(ctx); throw; } }
public AeronClientSession(AeronClient client, string serverChannel, Publication publication, Subscription subscription, Action onConnected, Action onDisconnected, AeronClientMessageReceivedHandler onMessageReceived) { _client = client; _serverChannel = serverChannel; _publication = publication; _buffer = new UnsafeBuffer(); Subscription = subscription; OnDisconnected = onDisconnected; _onMessageReceived = onMessageReceived; _onConnected = onConnected; _isConnected = false; _fragmentAssembler = new FragmentAssembler(HandlerHelper.ToFragmentHandler(SubscriptionHandler)); }
public static void Main() { var ctx = new Aeron.Context() .AvailableImageHandler(AvailablePongImageHandler); var fragmentAssembler = new FragmentAssembler(HandlerHelper.ToFragmentHandler(PongHandler)); Console.WriteLine("Publishing Ping at " + PingChannel + " on stream Id " + PingStreamID); Console.WriteLine("Subscribing Pong at " + PongChannel + " on stream Id " + PongStreamID); Console.WriteLine("Message length of " + MessageLength + " bytes"); using (var aeron = Aeron.Connect(ctx)) { Console.WriteLine("Warming up... " + WarmupNumberOfIterations + " iterations of " + WarmupNumberOfMessages + " messages"); using (var publication = aeron.AddPublication(PingChannel, PingStreamID)) using (var subscription = aeron.AddSubscription(PongChannel, PongStreamID)) using (var byteBuffer = BufferUtil.AllocateDirectAligned(MessageLength, BitUtil.CACHE_LINE_LENGTH)) using (var atomicBuffer = new UnsafeBuffer(byteBuffer)) { Latch.Wait(); for (var i = 0; i < WarmupNumberOfIterations; i++) { RoundTripMessages(atomicBuffer, fragmentAssembler, publication, subscription, WarmupNumberOfMessages); } Thread.Sleep(100); do { Histogram.Reset(); Console.WriteLine("Pinging " + NumberOfMessages + " messages"); RoundTripMessages(atomicBuffer, fragmentAssembler, publication, subscription, NumberOfMessages); Console.WriteLine("Histogram of RTT latencies in microseconds."); Histogram.OutputPercentileDistribution(Console.Out, outputValueUnitScalingRatio: 1000); } while (Console.Read() == 'y'); } } }
public static void Main() { var ctx = new Aeron.Context() .AvailableImageHandler(AvailablePongImageHandler); var fragmentAssembler = new FragmentAssembler(PongHandler); Console.WriteLine("Publishing Ping at " + PingChannel + " on stream Id " + PingStreamID); Console.WriteLine("Subscribing Pong at " + PongChannel + " on stream Id " + PongStreamID); Console.WriteLine("Message length of " + MessageLength + " bytes"); using (var aeron = Aeron.Connect(ctx)) { Console.WriteLine("Warming up... " + WarmupNumberOfIterations + " iterations of " + WarmupNumberOfMessages + " messages"); using (var publication = aeron.AddPublication(PingChannel, PingStreamID)) using (var subscription = aeron.AddSubscription(PongChannel, PongStreamID)) using (var byteBuffer = BufferUtil.AllocateDirectAligned(MessageLength, BitUtil.CACHE_LINE_LENGTH)) using (var atomicBuffer = new UnsafeBuffer(byteBuffer)) { Latch.Wait(); for (var i = 0; i < WarmupNumberOfIterations; i++) { RoundTripMessages(atomicBuffer, fragmentAssembler.OnFragment, publication, subscription, WarmupNumberOfMessages); } Thread.Sleep(100); do { Histogram.Reset(); Console.WriteLine("Pinging " + NumberOfMessages + " messages"); RoundTripMessages(atomicBuffer, fragmentAssembler.OnFragment, publication, subscription, NumberOfMessages); Console.WriteLine("Histogram of RTT latencies in microseconds."); Histogram.OutputPercentileDistribution(Console.Out, outputValueUnitScalingRatio: 1000); } while (Console.Read() == 'y'); } } }
private void InitializeInstanceFields() { fragmentAssembler = new FragmentAssembler(this); }
public ServiceAdapter(Subscription subscription, ClusteredServiceAgent clusteredServiceAgent) { this.subscription = subscription; this.clusteredServiceAgent = clusteredServiceAgent; this.fragmentAssembler = new FragmentAssembler(OnFragment); }