2016-09-27 15 views
8

Trong dòng Akka, Mat trong Nguồn [Out, Mat] hoặc Sink [In, Mat] thể hiện là gì. Khi nào nó thực sự sẽ được sử dụng?Luồng Akka: Mat thể hiện trong Nguồn [ra, Mat]

+2

Nó đại diện cho khái niệm về hiện thực hóa biểu đồ. Bạn có thể muốn đọc [tài liệu] (http://doc.akka.io/docs/akka/2.4.10/scala/stream/stream-flows-and-basics.html#Defining_and_running_streams). – hasumedic

Trả lời

15

Thông số loại Mat đại diện cho loại của giá trị vật hoá của luồng này. Hãy nhớ rằng trong Akka Source, Flow, Sink (tốt, tất cả các đồ thị) chỉ là bản thiết kế - chúng không tự làm bất kỳ việc xử lý nào, chúng chỉ mô tả cách xây dựng luồng. Quá trình biến các bản thiết kế này thành luồng làm việc có dữ liệu trực tiếp được gọi là hiện thực hóa.

Phương pháp cốt lõi để thực hiện luồng được gọi là run() và là defined trong lớp RunnableGraph. Tất cả các phương pháp khác để chạy luồng (ví dụ: runWith trên Sink hoặc Source) cuối cùng ủy quyền cho phương pháp này. Bạn có thể thấy rằng phương thức này trả về Mat. Nghĩa là, vật chất hóa một dòng mang lại giá trị vật chất hóa.

Ví dụ, có một bồn rửa kết hợp tất cả các giá trị trong một dòng vào một giá trị duy nhất, nó được xây dựng với Sink.fold. Nhưng làm thế nào để bạn có được giá trị này? Vì luồng đang chạy không đồng bộ, loại tự nhiên cho giá trị này sẽ là Future[T], trong đó T là loại trình tích lũy nếp gấp. Hóa ra, Sink.fold trả về Sink[In, Future[T]], tức là, Future[T] là giá trị vật chất của nó, do đó, khi bạn thực hiện nó, bạn sẽ có một phiên bản Future[T] mà sau đó bạn có thể sử dụng trong mã của riêng mình để xử lý thêm: luồng hoàn thành chính xác và nó sẽ hoàn thành với sự thất bại nếu luồng đã chấm dứt với một ngoại lệ.

Mỗi phần của biểu đồ bạn xây dựng bằng cách kết hợp bồn rửa, nguồn và luồng (và các loại biểu đồ khác) có thể có giá trị vật chất liên quan. Ví dụ, giá trị vật hoá của Source.queue là một hàng đợi mà bạn có thể sử dụng để đẩy các phần tử vào luồng khi nó được vật chất hóa và giá trị vật hoá của Sink.actorSubscriber là một ActorRef mà bạn có thể sử dụng để tương tác với diễn viên (được tạo bởi trình kích hoạt khi luồng được vật hoá). Mặt khác, có Flow.map là luồng không có giá trị vật liệu có ý nghĩa (không có gì bạn có thể kiểm soát bên ngoài khi bạn chỉ áp dụng hàm thuần túy cho luồng), do đó giá trị vật chất của nó là NotUsed, về cơ bản là Unit.

Đương nhiên, có thể cho các phần khác nhau của luồng chứa giá trị vật chất của riêng chúng. Ví dụ: không có gì ngăn bạn kết hợp Source.queueSink.fold. Nhưng RunnableGraph.run() chỉ có thể trả lại một giá trị vật hoá. Để khắc phục điều này, thường có hai biến thể kết hợp các phương pháp trên Sink s, Flow s và các đồ thị khác, thường được gọi là methodmethodMat, ví dụ: totoMat. Biến thể thứ hai cho phép bạn chọn cách kết hợp giá trị vật chất của các luồng bạn đang tham gia. Ví dụ, bạn có thể đặt chúng vào một tuple để có được cả hai:

val (queue, future) = Source.queue[Int](10, OverflowStrategy.fail) 
    .map(x => x + 10) 
    .toMat(Sink.fold(0)(_ + _))(Keep.both) 
    .run() 

phương pháp mặc định kết hợp (không có Mat suffix) thường chọn một trong hai bên trái hoặc bên phải cụ thể hóa giá trị, tùy thuộc vào những gì sẽ là tự nhiên nhất điều cần làm cho loại luồng cụ thể này.Đối tượng Keep chứa các phương thức tiện lợi trả về hoặc trái, phải hoặc cả hai đối số, cụ thể cho mục đích sử dụng chúng làm đối số cuối cùng cho các phương thức *Mat, nhưng không có gì ngăn bạn viết hàm kết hợp của riêng bạn.