MassTransit laboratorium 2017 T. Goluch, K.M. Ocetkiewicz

Wielkość: px
Rozpocząć pokaz od strony:

Download "MassTransit laboratorium 2017 T. Goluch, K.M. Ocetkiewicz"

Transkrypt

1 MassTransit laboratorium 2017 T. Goluch, K.M. Ocetkiewicz 1. Wstęp 1 Mass Transit jest framework iem przeznaczonym do tworzenia rozproszonych aplikacji biznesowych opartych o.net. Jest przeznaczony dla korporacji w celu ułatwienia budowy oprogramowania pracującego w jej ramach. Dostarcza mechanizmu subskrybowania wiadomości według typu. Pozwala, poprzez łączenie różnych węzłów przetwarzania przy pomocy tego mechanizmu, budować spójną sieć usług. Współpracuje z takimi systemami kolejkowania jak MSMQ, RabbitMQ i ActiveMQ, co pozwala na integrację ze środowiskiem Mono. Aplikacja oparta o MT jest zbiorem obiektów wysyłających i obsługujących różne rodzaje komunikatów za pomocą kolejki. Jest to technologia lekka, podobnie jak WCF pozwala na samohostowanie w procesach. 2. Instalacja Najprostszym sposobem zainstalowania framework a Mass Transit jest skorzystanie z systemu dystrybucji bibliotek NuGet. Wystarczy w wybranym projekcie wydać w oknie Package Manager Console 2 wydać komendę: albo: install-package MassTransit install-package MassTransit.RabbitMQ jeśli zdecydujemy się na kolejkowanie wiadomości przy użyciu RabbitMQ. Należy pamiętać o odpowiedniej wersji frameworka.net, przykładowo wersja MassTransit.RabbitMQ wymaga.net a w wersji Biblioteki zostaną zainstalowane w domyślnym projekcie jeśli chcemy dokonać instalacji w wybranym projekcie musimy explicite podać jego nazwę: install-package MassTransit.RabbitMQ -ProjectName <nazwaprojektu> Klikając PPM 3 w węźle References projektu można wybrać opcję Manage NuGet Package, pozwala ona na zarządzanie pakietami w oknie dialogowym TOOLS Library Package Manager Package Manager Console 3 PPM prawy przycisk myszy 4 T. Goluch, K.M. Ocetkiewicz C91E19C4-8B08-4D63-9B7C-0913AAB2A7CEMassTransitC91E19C4-8B08-4D63-9B7C-0913AAB2A7CE 1

2 Rysunek 1 - okno menedżera pakietów NuGet W przypadku kiedy pakiet NuGet okaże się niezainstalowany można go zainstalować przy pomocy menedżera dodatków: TOOLS Extensions and Updates. 3. Wiadomości Wiadomość w MT to obiekt klasy lub interfejsu.net. Może zawierać dowolne pola (typy proste, złożone, kolekcje.net), które powinny być właściwościami np.: public class BasicRequest public string Text get; set; Wiadomości powinny być zaimplementowane w osobnym komponencie w celu łatwego współdzielenia ich kodu. Uwaga, projekty wysyłający/publikujący wiadomość oraz odbierający/subskrybujący muszą korzystać z tego samego komponentu zawierającego klasy wiadomości. W innym przypadku komunikacja nie powiedzie się! Wiadomości mogą być wysyłane przy pomocy metod szyny (Bus).GetEndpoint(new Uri(" ")).Send( ) albo publikowane.publish( ), PublishRequest( ). W celu ich odebrania należy dokonać subskrypcji przy pomocy metody.subscribe( ) do której przekazujemy delegata, metodę anonimową bądź wyrażenie lambda obsługującą odebrany komunikat. Możemy również przesłać wiadomość zwrotną przy pomocy metody.respond( ). Dokładniej o wysyłaniu, publikowaniu, subskrybowaniu i odpowiadaniu na wiadomości opowiemy sobie w następnych punktach instrukcji. 4. Komunikacja Publish-Subscribe 5 Model komunikacji wydawca-odbiorca polega na tym, że zarówno ani wydawca ani odbiorca nic o sobie nie wiedzą. Wydawca publikuje wiadomości pewnego typu, natomiast abonent subskrybuje pewne typy. Całą wiedzę o tym do kogo ma trafić, która widomość posiada szyna (w naszym przypadku MassTransit Bus). W celu budowy aplikacji MT opartej o wzorzec publish-subscribe realizującej komunikację po RabbitMQ należy utworzyć projekt wiadomości oraz dwa projekty konsolowe nadawcy i odbiorcy z zainstalowanym MassTransit.RabbitMQ. Kod prostej aplikacji widoczny jest poniżej (proces publikujący): public class Program public static void Main() Bus.Initialize(sbc => sbc.usemsmq(configurator => 5 T. Goluch, K.M. Ocetkiewicz C91E19C4-8B08-4D63-9B7C-0913AAB2A7CEMassTransitC91E19C4-8B08-4D63-9B7C-0913AAB2A7CE 2

3 configurator.verifymsmqconfiguration(); configurator.usemulticastsubscriptionclient(); ); sbc.receivefrom("msmq://localhost/publisher"); ); System.Threading.Thread.Sleep(3.Seconds()); Bus.Instance.Publish(new BasicRequest Text = "Hi"); Bus.Initialize( ); inicjalizacja szyny, przyjmuje wyrażenie lambda w celu konfiguracji. Jeśli nie chcemy korzystać z singletona możemy stworzyć obiekt szyny: var bus = ServiceBusFactory.New( ),.UseMsmq(); informacja o jaki transport będzie oparta aplikacja MT, metody: VerifyMsmqConfiguration() i VerifyMsDtcConfiguration() mają za zadanie potwierdzić, że RabbitMQ i DTC 6 są zainstalowane poprawnie i ewentualnie dodać brakujące komponenty,.receivefrom("msmq://localhost/test_queue"); wiadomości będą odbierane z lokalnej, prywatnej kolejki o nazwie: test_queue. Dla celów developerskich można wykorzystać domyślnie dostępny protokół loopback: sbc.receivefrom("loopback://localhost/queue"), Publish( ); opublikowanie wiadomości. Należy dać wydawcy czas na zarejestrowanie się u niego subskrybenta. W tym celu po zainicjalizowaniu szyny należy odczekać pewien czas (można wykorzystać metodę.readkey(), lub.sleep(3.seconds()) 7 ). Kod odbiorcy wiadomości (subskrybenta) jest podobny, z tą różnicą że nie publikujemy żadnych wiadomości 8, a w zamian dokonujemy subskrypcji interesujących nas typów wiadomości: public class Program public static void Main() Bus.Initialize(sbc => sbc.usemsmq(configurator => configurator.verifymsmqconfiguration(); configurator.usemulticastsubscriptionclient(); ); sbc.receivefrom("msmq://localhost/subscriber"); sbc.subscribe(subs => subs.handler<basicrequest>(m => Console.WriteLine("odebrano: 0", m.text)); ); ); sbc.subscribe( ); subskrypcja uchwytu (wyrażenie lambda) do wiadomości typu Your Message, który, dla każdej z nich, będzie wypisywał w oknie konsoli zawartość właściwości Text. 5. Komunikacja Publish/Request-Subscribe/Response 9 Jeśli chcemy otrzymać odpowiedź od abonenta to musimy dodać do projektu komunikatów typ odpowiedzi, a następnie skorzystać z metody PublishRequest( ): Jeśli chcemy określić interwał czasowy przy pomocy wyrażenia XX.Seconds() musimy skorzystać z przestrzeni nazw: Magnum.Extensions. 8 Oczywiście nic nie stoi na przeszkodzie aby wydawca był równocześnie subskrybentem. 9 T. Goluch, K.M. Ocetkiewicz C91E19C4-8B08-4D63-9B7C-0913AAB2A7CEMassTransitC91E19C4-8B08-4D63-9B7C-0913AAB2A7CE 3

4 Bus.Instance.PublishRequest(new BasicRequest() Text = "asd", x => x.handle<basicresponse>(message => Console.WriteLine(message.Text)); x.settimeout(5.seconds()); ); Metoda PublishRequest( ), w porównaniu do zwykłego Publish( ) dodatkowo, jako drugi parametr przyjmuje obiekt konfigurujący wywołanie zwrotne. Jego metoda generyczna Handle< >( ) przyjmuje funkcję, która będzie wywoływana podczas przetwarzania wiadomości. Ponieważ PublishRequest( ) jest metodą synchroniczną należy ustawić timeout przy pomocymetody SetTimeout( ), która po przekroczeniu odpowiedniego czasu rzuca wyjątek: MassTransit.Exceptions.RequestTimeoutException. W procesie abonenta musimy podczas subskrypcji do metody szablonowej Handler< >( ) przekazać jako pierwszy, dodatkowy parametr reprezentujący kontekst pozwalający na wysłanie odpowiedzi przy pomocy metody Respond(): sbc.subscribe(sub => sub.handler<basicrequest>((cxt, msg) => Console.WriteLine("odebrano 0", msg.text); cxt.respond(new BasicResponse Text = "RESP" + msg.text ); ); ); 6. Konfiguarcja 10 MT podczas serializacji wspiera formaty JSON, BSON, XML, binarny oraz własny. Można dokonać zmiany: ServiceBusFactory.New(sbc => sbc.usebinaryserializer(); sbc.usebsonserializer(); sbc.usejsonserializer(); sbc.useversiononexmlserializer(); sbc.usexmlserializer(); ); //if you would like to implement your own. sbc.setdefaultserializer<tserializer>(); jednak jest to posunięcie opcjonalne, ponieważ domyślnie wykorzystywane są formaty preferowane przez daną warstwę transportową. W trybie produkcyjnym można dokonać tuningu szyny: ServiceBusFactory.New(sbc => sbc.setconcurrentconsumerlimit(2); sbc.setdefaulttransactiontimeout(5.minutes()); ); sbc.afterconsumingmessage(() => ); sbc.beforeconsumingmessage(() => );.SetConcurrentConsumerLimit( ); maksymalna liczba wątków przetwarzających wiadomości, 10 T. Goluch, K.M. Ocetkiewicz C91E19C4-8B08-4D63-9B7C-0913AAB2A7CEMassTransitC91E19C4-8B08-4D63-9B7C-0913AAB2A7CE 4

5 .SetDefaultTransactionTimeout( ); domyślny timeout dla transakcji,.after/beforeconsumingmessage( ); polecenia wykonywane przed/po przetworzeniu wiadomości, Aby sprawdzić konfiguracje szyny można wykorzystać metodę Probe() : var probe = bus.probe(); Można również wypisać konfigurację na konsoli: bus.writeintrospectiontofile("a_file.txt"); lub zapisać do pliku: bus.writeintrospectiontoconsole(); 7. Przetwarzanie wiadomości W MT można przetwarzać wiadomości na wiele możliwych sposobów 11 : Handlers dotychczas przez nas wykorzystywany, najprostszy i najmniej elastyczny sposób. Jest to dowolna metoda (również anonimowa albo wyrażenie lambda) przyjmująca pojedynczy argument typu wiadomość i zwracająca typ void: static public void Handler(BasicRequest m) Po otrzymaniu wiadomości MT wywoła powyższą metodę przekazując wiadomość jako argument. W tym przypadku nie istnieją żadne mechanizmy związane z zarządzaniem czasem życia wiadomości. Można się spotkać z sytuacją, że kilka wiadomości będzie równolegle przetwarzanych przez różne wątki. Aby temu zapobiec można jedynie skonfigurować szynę na obsługę wiadomości w pojedynczym wątku. Instances obiekt klasy implementującej jeden bądź więcej interfejsów Consumes, z których każdy przyjmuje argument generyczny (musi być typu referencyjnego) deklarujący typ wiadomości obsługiwany przez tę instancję: public class MyClass : Consumes<BasicRequest>.All, Consumes<OtherBasicRequest>.All public void Consume(BasicRequest message) Console.WriteLine("odebrano 0", message.text); public void Consume(OtherBasicRequest message) Console.WriteLine("dodatkowo odebrano 0", message.text); Subskrybcji instancji dokonujemy przy pomocy metody Instance( ): sbc.subscribe(sub => sub.instance(new MyClass()); Interfejs Consumes może być zdefiniowany na cztery sposoby: 11 T. Goluch, K.M. Ocetkiewicz C91E19C4-8B08-4D63-9B7C-0913AAB2A7CEMassTransitC91E19C4-8B08-4D63-9B7C-0913AAB2A7CE 5

6 o o o.all wymaga implementacji metody Consume( ) która jako parametr przyjmuje wiadomość. Służy do przetwarzania wszystkich wiadomości danego typu..selected dodatkowo wymaga implementacji metody Accept( ), która stwierdza, zwracając wartość logiczną true, czy dana wiadomość ma zostać przetworzona..for< > pozwala na korelacje wiadomości 12. Przyjmuje parametr generyczny będący typem identyfikatora. Zaleca się wykorzystanie typu Guid, który zapewnia globalną unikalność. Wiadomości, które podlegają korelacji muszą implementować interfejs CorrelatedBy< >: public class CorrelatedRequest : CorrelatedBy<Guid> ( ) public Guid CorrelationId get; set; Przykładowo, obiekt konsumenta posiadający właściwość: public Guid CorrelationId get return new Guid("CFA84E50-9CA A6CA-ADA17C5AEE76"); Będzie przetwarzał tylko wiadomości, opublikowane z tym samym numerem Guid: Bus.Instance.Publish(new CorrelatedRequest(), CorrelationId = new Guid("CFA84E50-9CA A6CA-ADA17C5AEE76") ); o Context w tym przypadku metoda Consume(), przyjmuje cały kontekst wiadomości, która jest jedną z jego właściwości. Podobnie jak w przypadku zwykłych uchwytów tutaj również możemy odpowiedzieć procesowi publikującemu (przy pomocy metody PublishRequest( )) wykorzystując metodę Respond( ): public void Consume(IConsumeContext<RequestResponse> message) Console.WriteLine("odebrano wiadomość wraz z kontekstem 0", message.message.text); message.respond<basicresponse>(new BasicResponse() Text = "res" ); Consumers Deklarowane są w identyczny sposób jak instancje, przy pomocy interfejsów Consumes, jednak subskrypcja wymaga podania fabryki obiektów. W momencie odbierania widomości MT tworzy obiekt konsumenta, przy pomocy wspomnianej fabryki, na którym wywołuje metodę Consume( ) do której przekazuje wiadomość jako parametr. Wykorzystanie fabryki pozwala na obsługę cyklu życia obiektu konsumenta. Może to być proste wywołanie konstruktora albo pozyskanie obiektu konsumenta wraz z jego zależnościami. Dodatkowo fabryka może opakować wołania konsumenta dodatkowym kodem wywoływanym przed i po przetworzeniu wiadomości. Saga Pozwala wysyłanie wiadomości w trybie długotrwałej transakcji, ale o tym później. 8. Wersjonowanie 13 Kiedy system się rozwija, usługi ewoluują, zmieniają się wymagania możemy być pewni, że czeka nas zmiana zawartości wiadomości. W takim przypadku może pojawić się problem, kiedy część systemu pracuje już z nową a część jeszcze ze starą wersją komunikatu. Z pomocą przychodzi mechanizm ich wersjonowania T. Goluch, K.M. Ocetkiewicz C91E19C4-8B08-4D63-9B7C-0913AAB2A7CEMassTransitC91E19C4-8B08-4D63-9B7C-0913AAB2A7CE 6

7 Wiadomości powinny implementować pewien kontrakt/interfejs, jeśli nowa wersja serwisu będzie wymagać zmian w dotychczasowym kontrakcie, możemy zaimplementować nowy interfejs i opublikować jedną wiadomość implementującą obydwa, stary i nowy. MT zadba o to aby do abonentów trafiły wiadomości implementujące interesujący je interfejs. Przykładowe kontrakty/interfejsy i wspólna wiadomość mogą mieć następującą postać: public interface IBasicRequest string Text get; public interface IBasicRequestV2 Uri Adress get; public class BasicRequest : IBasicRequest, IBasicRequestV2 public string Text get; set; public Uri Adress get; set; Wysłanie wiadomości wymaga implementacji wszystkich pół: Bus.Instance.Publish(new BasicRequest() Text = "asd", Adress = new Uri(" ); Pobranie wiadomości w starym procesie (Handler): static public void Handler(IBasicRequest m) Console.WriteLine("odebrano: 0", m.text); i w nowym (Instancja/Konsument): public class MyClass : Consumes<IBasicRequestV2>.All public void Consume(IBasicRequestV2 message) Console.WriteLine("odebrano Uri: 0", message.adress.tostring()); 9. Szyfrowanie 14 MT pozwala na łatwe szyfrowanie wiadomości, w tym celu należy wykorzystać nakładkę PreSharedKeyEncryptedMessageSerializer() na serializator, która implementuje szyfrowanie Rijndael 15 : Bus.Initialize(sbc => ( ) sbc.setdefaultserializer(new PreSharedKeyEncryptedMessageSerializer( "qwertyuiop[]asdfghjkl;'zxcvbnm,.", new XmlMessageSerializer())); ); T. Goluch, K.M. Ocetkiewicz C91E19C4-8B08-4D63-9B7C-0913AAB2A7CEMassTransitC91E19C4-8B08-4D63-9B7C-0913AAB2A7CE 7

8 Podczas inicjalizacji szyny należy do metody SetDefaultSerializer() obiektu konfiguracyjnego przekazać jako domyślny serializator obiekt PreSharedKeyEncryptedMessageSerializer z przestrzeni nazw MassTransit.Serialization, który z kolei wymaga podania klucza składającego się z 32 znaków ASCII oraz obiektu bazowego serializatora. W naszym przypadku XmlMessageSerializer(). 10. Saga 16 Saga w MT może być definiowana na dwa sposoby. Pierwsze podejście podobne jest do konsumenta, klasa sagi wykorzystuje odpowiednie interfejsy do definiowania wiadomości pozwalających na jej inicjalizację (interfejs InitiatedBy), orchestrację (interfejs Orchestrates) bądź może obserwować pewne wiadomości. Od zwykłych instancji odróżnia ją fakt, że jest zarządzana przez framework MT, który dba o to aby odpowiednie wiadomości trafiły do skorelowanej z nimi instancji sagi. Odbywa się to z wykorzystaniem interfejsu CorrelatedID naturalnie wykorzysującego do tego celu typ Guid. Sagi mogą również obserwować wiadomości, które nie są z nimi bezpośrednio skorelowane (jednak powinniśmy uważać na potencjalne niebezpieczeństwo związane z powiązaniem wiadomości z olbrzymią liczbą różnych instancji sagi). public class MySaga : ISaga, InitiatedBy<MyInitialMessage>, Orchestrates<MyFollowUpMessage> public Guid CorrelationId get; set; public void Consume(MyInitialMessage message) public void Consume(MyFollowUpMessage message) public IServiceBus Bus get; set; Drugie podejście polega na stworzeniu maszyny stanów w skład której wchodzą zdarzenia, stany i akcje. W tym celu należy stworzyć klasę dziedziczącą po interfejsie SagaStateMachine<T> typizowanym wiadomością inicjalizującą nową instancję sagi. Przykładowa pusta saga reprezentująca aukcję mogła by wyglądać następująco: public class AuctionSaga : SagaStateMachine<AuctionSaga>, ISaga public AuctionSaga(Guid guid) CorrelationId = guid; static AuctionSaga() Define(() => // the state machine behavior is defined here ); public Guid CorrelationId get; set; public IServiceBus Bus get; set; W momencie tworzenia nowego obiektu sagi do właściwości CorrelationId przypisywany jest nowy Guid. Właściwość IServiceBus będzie zainicjalizowana zanim dowolna metoda sagi zostanie wywołana, pozwala to na wykorzystanie obiektu szyny przez zdarzenia zdefiniowane w danej sadze. Istnieją również dwa predefiniowane stany: Initial i Completed, które muszą być uwzględnione podczas definicji sagi. Przy pomocy statycznych właściwości State możemy zadeklarować dodatkową liczbę stanów: 16 T. Goluch, K.M. Ocetkiewicz C91E19C4-8B08-4D63-9B7C-0913AAB2A7CEMassTransitC91E19C4-8B08-4D63-9B7C-0913AAB2A7CE 8

9 public static State Initial get; set; public static State Completed get; set; public static State Open get; set; public static State Closed get; set; Aby mieć możliwość przechodzenia pomiędzy stanami musimy zdefiniować jakieś zdarzenia: public static Event<ICreateAuction> Create get; set; public static Event<IPlaceBid> Bid get; set; public static Event<ICloseAuction> Timeout get; set; Zdarzenia, tak jak stany, definiowane są przy pomocy statycznych właściwości podatkowo parametryzowanych typem skojarzonych z nimi wiadomości. W momencie kiedy saga jest subskrybowana przez szynę, subskrybcja dotyczy to również tych wiadomości. W momencie utworzenia aukcji wysyłane jest polecenie/wiadomość CreateAuction na endpoint w którym zarejestrowana jest saga: public interface CreateAuction : CorrelatedBy<Guid> string Title get; string Owner get; decimal OpeningBid get; Dla każdej wiadomości typu Bid (Oferta) istnieje osobny unikalny identyfikator BidId typu Guid. public interface PlaceBid Guid BidId get; Guid AuctionId get; decimal MaximumBid get; string Bidder get; W celu powiązania wiadomości z odpowiadającą jej instancją sagi wykorzystano właściwość AuctionId, również typu Guid. Posiadając komunikaty powiązane z odpowiadającymi im zdarzeniami zdefiniowanymi w sadze, musimy określić jak i kiedy te zdarzenia będą obsługiwane. Opisujemy to jako akcję przekazywaną metody statycznej metody Define w statycznym konstruktorze klasy: static AuctionSaga() Define(() => Initially( When(Create)); During(Open, When(Bid)); ); Zdarzenie Create jest akceptowane wyłącznie kiedy saga jest w stanie Initial (jest ono domyślne dla nowych instancji sagi). Jeśli dla danego komunikatu nie istnieje odpowiadająca mu instancja sagi to zostaje takowa powołana. Metoda Initially() jest równoważna wołaniu During(Initial). Wyrażenie During() definiuje które zdarzenia są akceptowane w danym stanie. W naszym przypadku zdarzenie Bid jest akceptowane jeśli saga jest w stanie Open. Zdarzenie Bid jest przypadkiem specjalnym, ponieważ nie jest skorelowana poprzez Guid. Aby dostarczyć wiadomości do odpowiadających im instancji sagi należy zdefiniować odpowiednie powiązanie, które definiujemy przy pomocy metody Correlate(): static AuctionSaga() T. Goluch, K.M. Ocetkiewicz C91E19C4-8B08-4D63-9B7C-0913AAB2A7CEMassTransitC91E19C4-8B08-4D63-9B7C-0913AAB2A7CE 9

10 Define(() => Correlate(Bid).By((saga, message) => saga.correlationid == message.auctionid); ); Zauważmy, że dla wiadomości CreateAuction wykorzystana domyślna korelacja (poprzez Guid). W następnym kroku należy zdefiniować zachowanie odpowiadające danemu zdarzeniu. static AuctionSaga() Define(() => Initially( When(Create).Then((saga, message) => saga.openingbid = message.openingbid; saga.owner = message.owner ; saga.title = message.title; ).TransitionTo(Open)); ); Powyżej zdefiniowano dwa proste etapy zachowania. Pierwszy inicjalizuje kilka właściwości sagi wykorzystując otrzymaną wiadomość. Drugi powoduje zmianę stanu sagi do Open. Do poprawnego działania należy dodać do klasy sagi następujące właściwości: public decimal OpeningBid get; set; public string Owner get; set; public string Title get; set; Dla zdarzenia Bid definicja zachowania wygląda następująco: static AuctionSaga() Define(() => During(Open, When(Bid).Then((saga, message) => saga.placenewbid(message))); ); Wywoływana jest metoda Handle(). Jeśli otrzymana stawka jest wyższa niż aktualna wartość oferty. Aktualizowana jest aktualna wartość oferty, jej identyfikator oraz informacja o właścicielu. void Handle(PlaceBid bid) if (!CurrentBid.HasValue bid.maximumbid > CurrentBid) if (HighBidder!= null) Bus.Publish(new Outbid(HighBidId)); CurrentBid = bid.maximumbid; HighBidder = bid.bidder ; HighBidId = bid.bidid; else T. Goluch, K.M. Ocetkiewicz C91E19C4-8B08-4D63-9B7C-0913AAB2A7CEMassTransitC91E19C4-8B08-4D63-9B7C-0913AAB2A7CE 10

11 throw new UnderBidException(); public decimal? CurrentBid get; set; public string HighBidder get; set; public Guid HighBidId get; set; T. Goluch, K.M. Ocetkiewicz C91E19C4-8B08-4D63-9B7C-0913AAB2A7CEMassTransitC91E19C4-8B08-4D63-9B7C-0913AAB2A7CE 11

12 public static void Main() Bus.Initialize(sbc => sbc.usemsmq(cfg => cfg.verifymsmqconfiguration(); cfg.usemulticastsubscriptionclient(); ); sbc.receivefrom("msmq://localhost/my_saga_bus"); sbc.subscribe(subs => subs.saga<auctionsaga>(new InMemorySagaRepository<AuctionSaga>()).Permanent(); ); ); Console.WriteLine("naciśnij klawisz aby zakończyć"); Console.ReadKey(); Subskrypcja sagi wygląda następująco: Kod klienta jest identyczny jak w przypadku zwykłego procesu publikującego i subskrybującego komunikaty. Podsumowując, schemat sagi dla serwisu aukcyjnego powinien wyglądać następująco: Projekt auctiontimer zaczyna odliczać czas po zainicjalizowaniu komunikatem NewAuction, dla kolejnych komunikatów NewOdder jeśli wartość aukcji uległa zmianie zeruje licznik zakończenia aukcji. Lepszym rozwiązaniem jest resetowanie licznika aukcji po odebraniu komunikatu OutBid (proszę to zmienić). T. Goluch, K.M. Ocetkiewicz C91E19C4-8B08-4D63-9B7C-0913AAB2A7CEMassTransitC91E19C4-8B08-4D63-9B7C-0913AAB2A7CE 12

13 Przykładowy kod timera: static void Main(string[] args) Bus.Initialize(sbc => sbc.usemsmq(cfg => cfg.verifymsmqconfiguration(); cfg.usemulticastsubscriptionclient(); ); sbc.receivefrom("msmq://localhost/timer"); sbc.subscribe(sub => sub.handler<icreateauction>(handler); sub.handler<iplacebid>(handler); ); ); Console.WriteLine("naciśnij klawisz aby zakończyć"); Console.ReadKey(); static int timercounter; static Guid LatestCorrelationId; const int onebidtime = 10000; const int sleeptime = 1000; private static void Handler(IPlaceBid m) LatestCorrelationId = m.auctionid; timercounter =+ onebidtime; Console.WriteLine("Nowa oferta w aukcji: 0", m.maximumbid); private static void Handler(ICreateAuction m) LatestCorrelationId = m.correlationid; Console.WriteLine("Uruchomiono timer"); StartTimer(oneBidTime); private static void StartTimer(int onebidtime) timercounter = onebidtime; while (timercounter > 0) System.Threading.Thread.Sleep(sleepTime); timercounter -= sleeptime; Console.WriteLine("Do końca aukcji pozostało: 0 sek.", timercounter / 1000); Bus.Instance.Publish<ICloseAuction>(new CloseAuction() CorrelationId = LatestCorrelationId ); Wynik powinien wyglądać podobnie jak zamieszczony niżej: T. Goluch, K.M. Ocetkiewicz C91E19C4-8B08-4D63-9B7C-0913AAB2A7CEMassTransitC91E19C4-8B08-4D63-9B7C-0913AAB2A7CE 13

14 A. NuGet 17 W celu automatyzacji procesu pobierania, instalacji, konfiguracji oraz usuwania projektów NServiceBus w projektach VS można wykorzystać menedżera pakietów NuGet Package Manager. Przydatne komendy: get-package pozwala przejrzeć listę zainstalowanych pakietów w ramach projektu, get-package -remote pozwala przejrzeć listę wszystkich pakietów. Należy uważać na długi czas wykonania. Lepiej zastosować odpowiedni filtr: get-package remote filter <nazwapakietu> gdzie nazwa pakietu to np. MassTransit, install-package <nazwapakietu> pozwala zainstalować dany pakiet wraz z zależnościami (innymi wymaganymi pakietami) w domyślnym projekcie, automatycznie zostaną dodane referencje, zaktualizowane zostaną pliki konfiguracyjne oraz dodany zostanie (w katalogu głównym solucji) folder packages zawierający zainstalowane projekty, install-package <nazwapakietu> -ProjectName <nazwaprojektu> pozwala na instalację pakietu w wybranym projekcie, uninstall-package -remote pozwala odinstalować dany pakiet (po polsku) T. Goluch, K.M. Ocetkiewicz C91E19C4-8B08-4D63-9B7C-0913AAB2A7CEMassTransitC91E19C4-8B08-4D63-9B7C-0913AAB2A7CE 14

15 T. Goluch, K.M. Ocetkiewicz C91E19C4-8B08-4D63-9B7C-0913AAB2A7CEMassTransitC91E19C4-8B08-4D63-9B7C-0913AAB2A7CE 15

namespace HostedReceiver { public class Receiver: IConfigureThisEndpoint, AsA_Server {

namespace HostedReceiver { public class Receiver: IConfigureThisEndpoint, AsA_Server { Pobranie i instalacja: - http://www.nservicebus.com/ - download v3.0 now - rozpakować - MSMQ powinno być zainstalowane (Panel Sterowania -> Dodaj/Usuń programy -> Składniki systemu Windows -> Kolejkowanie

Bardziej szczegółowo

Service Bus: MassTransit laboratorium 2017 K.M. Ocetkiewicz, T. Goluch

Service Bus: MassTransit laboratorium 2017 K.M. Ocetkiewicz, T. Goluch Service Bus: MassTransit laboratorium 2017 K.M. Ocetkiewicz, T. Goluch 1. Wstęp MassTransit 1 jest jednym z narzędzi implementujących szynę komunikacyjną. Model szyny mówi, że wszystkie urządzenia/procesy

Bardziej szczegółowo

Wprowadzenie do projektu QualitySpy

Wprowadzenie do projektu QualitySpy Wprowadzenie do projektu QualitySpy Na podstawie instrukcji implementacji prostej funkcjonalności. 1. Wstęp Celem tego poradnika jest wprowadzić programistę do projektu QualitySpy. Będziemy implementować

Bardziej szczegółowo

xmlns:prism=http://www.codeplex.com/prism c. <ContentControl prism:regionmanager.regionname="mainregion" />

xmlns:prism=http://www.codeplex.com/prism c. <ContentControl prism:regionmanager.regionname=mainregion /> 1 Tworzenie Shella a. W pierwszej kolejności tworzymy nowy projekt: WPF Application. Name: Shell SolutionName: PrismApp b. Dodajemy bibliotekę PRISM za pomocą NuGet Managera (dla.net Framework 4.5 Prism

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Programowanie obiektowe IV. Interfejsy i klasy wewnętrzne Małgorzata Prolejko OBI JA16Z03 Plan Właściwości interfejsów. Interfejsy a klasy abstrakcyjne. Klonowanie obiektów. Klasy wewnętrzne. Dostęp do

Bardziej szczegółowo

Dokumentacja do API Javy.

Dokumentacja do API Javy. Dokumentacja do API Javy http://java.sun.com/j2se/1.5.0/docs/api/ Klasy i obiekty Klasa jest to struktura zawierająca dane (pola), oraz funkcje operujące na tych danych (metody). Klasa jest rodzajem szablonu

Bardziej szczegółowo

Instrukcja obsługi certyfikatów w programie pocztowym MS Outlook Express 5.x/6.x

Instrukcja obsługi certyfikatów w programie pocztowym MS Outlook Express 5.x/6.x Spis treści Wstęp... 1 Instalacja certyfikatów w programie pocztowym... 1 Instalacja certyfikatów własnych... 1 Instalacja certyfikatów innych osób... 3 Import certyfikatów innych osób przez odebranie

Bardziej szczegółowo

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu. Zrozumienie funkcji danych statycznych jest podstawą programowania obiektowego. W niniejszym artykule opiszę zasadę tworzenia klas statycznych w C#. Oprócz tego dowiesz się czym są statyczne pola i metody

Bardziej szczegółowo

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

Ćwiczenie 1. Kolejki IBM Message Queue (MQ) Ćwiczenie 1. Kolejki IBM Message Queue (MQ) 1. Przygotowanie Przed rozpoczęciem pracy, należy uruchomić "Kreator przygotowania WebSphere MQ" oraz przejść przez wszystkie kroki kreatora, na końcu zaznaczając

Bardziej szczegółowo

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany KLASA UCZEN Napisz deklarację klasy Uczen, w której przechowujemy następujące informacje o uczniu: imię, nazwisko, średnia (pola prywatne), poza tym klasa zawiera metody: konstruktor bezparametrowy (nie

Bardziej szczegółowo

Wykład 8: klasy cz. 4

Wykład 8: klasy cz. 4 Programowanie obiektowe Wykład 8: klasy cz. 4 Dynamiczne tworzenie obiektów klas Składniki statyczne klas Konstruktor i destruktory c.d. 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD

Bardziej szczegółowo

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany KLASA UCZEN Napisz deklarację klasy Uczen, w której przechowujemy następujące informacje o uczniu: imię, nazwisko, średnia (pola prywatne), poza tym klasa zawiera metody: konstruktor bezparametrowy (nie

Bardziej szczegółowo

Opis protokołu RPC. Grzegorz Maj nr indeksu:

Opis protokołu RPC. Grzegorz Maj nr indeksu: Opis protokołu RPC Grzegorz Maj nr indeksu: 236095 1 Streszczenie Niniejszy dokument opisuje specyfikację protokołu RQP (Remote Queues Protocol). W jego skład wchodzą: opis celów protokołu; opis założeń

Bardziej szczegółowo

Aplikacje RMI https://docs.oracle.com/javase/tutorial/rmi/overview.html

Aplikacje RMI https://docs.oracle.com/javase/tutorial/rmi/overview.html Aplikacje RMI https://docs.oracle.com/javase/tutorial/rmi/overview.html Dr inż. Zofia Kruczkiewicz wykład 4 Programowanie aplikacji internetowych, wykład 4 1 1. Zadania aplikacji rozproszonych obiektów

Bardziej szczegółowo

Narzędzia i aplikacje Java EE. Usługi sieciowe Paweł Czarnul pczarnul@eti.pg.gda.pl

Narzędzia i aplikacje Java EE. Usługi sieciowe Paweł Czarnul pczarnul@eti.pg.gda.pl Narzędzia i aplikacje Java EE Usługi sieciowe Paweł Czarnul pczarnul@eti.pg.gda.pl Niniejsze opracowanie wprowadza w technologię usług sieciowych i implementację usługi na platformie Java EE (JAX-WS) z

Bardziej szczegółowo

Projektowanie aplikacji internetowych laboratorium

Projektowanie aplikacji internetowych laboratorium Projektowanie aplikacji internetowych laboratorium Programowanie w języku Java Do realizacji projektu potrzebne jest zintegrowane środowisko programistyczne NetBeans 7 (zrzuty ekranów pochodzą z wersji

Bardziej szczegółowo

PHP 5 język obiektowy

PHP 5 język obiektowy PHP 5 język obiektowy Wprowadzenie Klasa w PHP jest traktowana jak zbiór, rodzaj różnych typów danych. Stanowi przepis jak stworzyć konkretne obiekty (instancje klasy), jest definicją obiektów. Klasa reprezentuje

Bardziej szczegółowo

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej Programowanie obiektowe Interfejsy Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej pawel.rogalinski pwr.wroc.pl Interfejsy Autor: Paweł Rogaliński Instytut Informatyki,

Bardziej szczegółowo

Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz

Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz Zagadnienia 1. Delegaty wiązane, właściwości indeksowane 2. Delegaty niewiązane 3. Nowa wersja kalkulatora, delegaty

Bardziej szczegółowo

Ciekawym rozwiązaniem służącym do obsługi zdarzeń dla kilku przycisków w ramach jednej aktywności może być następujący kod:

Ciekawym rozwiązaniem służącym do obsługi zdarzeń dla kilku przycisków w ramach jednej aktywności może być następujący kod: 1. Listener dla przycisku. Ciekawym rozwiązaniem służącym do obsługi zdarzeń dla kilku przycisków w ramach jednej aktywności może być następujący kod: W linii 24 tworzymy globalną metodę mglobal_onclicklistener,

Bardziej szczegółowo

Rozdział 4 KLASY, OBIEKTY, METODY

Rozdział 4 KLASY, OBIEKTY, METODY Rozdział 4 KLASY, OBIEKTY, METODY Java jest językiem w pełni zorientowanym obiektowo. Wszystkie elementy opisujące dane, za wyjątkiem zmiennych prostych są obiektami. Sam program też jest obiektem pewnej

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Programowanie obiektowe Laboratorium 3 i 4 - przypomnienie wiadomości o OOP na przykładzie Javy mgr inż. Krzysztof Szwarc krzysztof@szwarc.net.pl Sosnowiec, 8 marca 2017 1 / 20 mgr inż. Krzysztof Szwarc

Bardziej szczegółowo

Zadanie polega na stworzeniu bazy danych w pamięci zapewniającej efektywny dostęp do danych baza osób.

Zadanie polega na stworzeniu bazy danych w pamięci zapewniającej efektywny dostęp do danych baza osób. Zadanie: Zadanie polega na stworzeniu bazy danych w pamięci zapewniającej efektywny dostęp do danych baza osób. Na kolejnych zajęciach projekt będzie rozwijana i uzupełniana o kolejne elementy omawiane

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Programowanie obiektowe Laboratorium 1. Wstęp do programowania w języku Java. Narzędzia 1. Aby móc tworzyć programy w języku Java, potrzebny jest zestaw narzędzi Java Development Kit, który można ściągnąć

Bardziej szczegółowo

PWSG Ćwiczenia 12. Wszystkie ukończone zadania należy wysłać na adres: lub

PWSG Ćwiczenia 12. Wszystkie ukończone zadania należy wysłać na adres: lub PWSG Ćwiczenia 12 Wszystkie ukończone zadania należy wysłać na adres: sara.m.jurczyk@gmail.com lub sarajurczyk@kul.lublin.pl Zadanie 1: Różnica między zwykłymi polami/metodami, a polami/metodami static

Bardziej szczegółowo

Instrukcja tworzenia aplikacji EE na bazie aplikacji prezentowanej na zajęciach lab.4 z PIO umożliwiająca przez sieć dostęp wielu użytkownikom.

Instrukcja tworzenia aplikacji EE na bazie aplikacji prezentowanej na zajęciach lab.4 z PIO umożliwiająca przez sieć dostęp wielu użytkownikom. Instrukcja tworzenia aplikacji EE na bazie aplikacji prezentowanej na zajęciach lab.4 z PIO umożliwiająca przez sieć dostęp wielu użytkownikom. Projektowanie i wdrażanie systemów informatycznych Przekształcenie

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Laboratorium z przedmiotu Programowanie obiektowe - zestaw 07 Cel zajęć. Celem zajęć jest zapoznanie z praktycznymi aspektami tworzenia aplikacji okienkowych w C#. Wprowadzenie teoretyczne. Rozważana w

Bardziej szczegółowo

Wykład 5: Klasy cz. 3

Wykład 5: Klasy cz. 3 Programowanie obiektowe Wykład 5: cz. 3 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD - podstawy Konstruktor i destruktor (część I) 2 Konstruktor i destruktor KONSTRUKTOR Dla przykładu

Bardziej szczegółowo

.NET Klasy, obiekty. ciąg dalszy

.NET Klasy, obiekty. ciąg dalszy .NET Klasy, obiekty ciąg dalszy Przeciążanie operatorów 1 W języku C# istnieje możliwość zdefiniowania funkcjonalności dużej części operatorów dla typów stworzonych przez użytkownika. Dzięki takiemu zabiegowi,

Bardziej szczegółowo

Wykład 12. Programowanie serwera MS SQL 2005 w C#

Wykład 12. Programowanie serwera MS SQL 2005 w C# Wykład 12 Programowanie serwera MS SQL 2005 w C# Budowa procedur składowanych w C# Budowa funkcji składowanych w C# Wykorzystanie funkcji składowanych w C# po stronie klienta Tworzenie typów definiowanych

Bardziej szczegółowo

Aplikacje internetowe i rozproszone - laboratorium

Aplikacje internetowe i rozproszone - laboratorium Aplikacje internetowe i rozproszone - laboratorium Enterprise JavaBeans (EJB) Celem tego zestawu ćwiczeń jest zapoznanie z technologią EJB w wersji 3.0, a w szczególności: implementacja komponentów sesyjnych,

Bardziej szczegółowo

Zaawansowane aplikacje WWW - laboratorium

Zaawansowane aplikacje WWW - laboratorium Zaawansowane aplikacje WWW - laboratorium Przetwarzanie XML (część 2) Celem ćwiczenia jest przygotowanie aplikacji, która umożliwi odczyt i przetwarzanie pliku z zawartością XML. Aplikacja, napisana w

Bardziej szczegółowo

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p. Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni Wykład 3 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji Abstrakcja funkcyjna Struktury Klasy hermetyzacja

Bardziej szczegółowo

MVVM Light Toolkit. Julita Borkowska

MVVM Light Toolkit. Julita Borkowska MVVM Light Toolkit Julita Borkowska Czym jest MVVM Light Toolkit? MVVM Light Toolkit został stworzony w 2009 roku przez Laurenta Bugnion. Jest to biblioteka dostarczająca zestaw komponentów pomocnych podczas

Bardziej szczegółowo

D:\DYDAKTYKA\ZAI_BIS\_Ćwiczenia_wzorce\04\04_poprawiony.doc 2009-lis-23, 17:44

D:\DYDAKTYKA\ZAI_BIS\_Ćwiczenia_wzorce\04\04_poprawiony.doc 2009-lis-23, 17:44 Zaawansowane aplikacje internetowe EJB 1 Rozróżniamy dwa rodzaje beanów sesyjnych: Stateless Statefull Celem tego laboratorium jest zbadanie różnic funkcjonalnych tych dwóch rodzajów beanów. Poszczególne

Bardziej szczegółowo

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych mluckner@mini.pw.edu.pl http://www.mini.pw.edu.pl/~lucknerm Programy w Javie składają się z pakietów Pakiety zawierają definicje

Bardziej szczegółowo

Metody Metody, parametry, zwracanie wartości

Metody Metody, parametry, zwracanie wartości Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.com Metody Metody, parametry, zwracanie wartości Metody - co to jest i po co? Metoda to wydzielona część klasy, mająca

Bardziej szczegółowo

Aplikacje w środowisku Java

Aplikacje w środowisku Java Aplikacje w środowisku Java Materiały do zajęć laboratoryjnych Klasy i obiekty - dziedziczenie mgr inż. Kamil Zieliński Katolicki Uniwersytet Lubelski Jana Pawła II 2018/2019 W ramach poprzedniego laboratorium

Bardziej szczegółowo

JAVA W SUPER EXPRESOWEJ PIGUŁCE

JAVA W SUPER EXPRESOWEJ PIGUŁCE JAVA W SUPER EXPRESOWEJ PIGUŁCE Obiekt Obiekty programowe to zbiór własności i zachowań (zmiennych i metod). Podobnie jak w świecie rzeczywistym obiekty posiadają swój stan i zachowanie. Komunikat Wszystkie

Bardziej szczegółowo

Instrukcja laboratoryjna

Instrukcja laboratoryjna Zaawansowane techniki obiektowe 2016/17 Instrukcja laboratoryjna Testy funkcjonalne Prowadzący: Tomasz Goluch Wersja: 1.0 Testowanie aplikacji z bazą danych Większość współczesnych aplikacji korzysta z

Bardziej szczegółowo

Zaawansowane aplikacje internetowe - laboratorium

Zaawansowane aplikacje internetowe - laboratorium Zaawansowane aplikacje internetowe - laboratorium Web Services (część 3). Do wykonania ćwiczeń potrzebne jest zintegrowane środowisko programistyczne Microsoft Visual Studio 2005. Ponadto wymagany jest

Bardziej szczegółowo

Klasy i obiekty cz II

Klasy i obiekty cz II Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.com Klasy i obiekty cz II Hermetyzacja, mutatory, akcesory, ArrayList Rozwijamy aplikację Chcemy, aby obiekty klasy

Bardziej szczegółowo

Klasy cd. Struktury Interfejsy Wyjątki

Klasy cd. Struktury Interfejsy Wyjątki Klasy cd. Struktury Interfejsy Wyjątki Struktury Struktura pozwala na zdefiniowanie typu danych, który nie charakteryzuje się zbyt złożoną funkcjonalnością (np. punkt, kolor, etc). Do definiowania struktury

Bardziej szczegółowo

Kurs WWW. Paweł Rajba. pawel@ii.uni.wroc.pl http://pawel.ii.uni.wroc.pl/

Kurs WWW. Paweł Rajba. pawel@ii.uni.wroc.pl http://pawel.ii.uni.wroc.pl/ Paweł Rajba pawel@ii.uni.wroc.pl http://pawel.ii.uni.wroc.pl/ Spis treści Wprowadzenie Automatyczne ładowanie klas Składowe klasy, widoczność składowych Konstruktory i tworzenie obiektów Destruktory i

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Programowanie obiektowe Laboratorium 11 - przegląd wybranych wzorców mgr inż. Krzysztof Szwarc krzysztof@szwarc.net.pl Sosnowiec, 24 maja 2017 1 / 38 mgr inż. Krzysztof Szwarc Programowanie obiektowe Wzorce

Bardziej szczegółowo

Zaawansowane aplikacje internetowe

Zaawansowane aplikacje internetowe Zaawansowane aplikacje internetowe EJB 1 Rozróżniamy dwa rodzaje beanów sesyjnych: Stateless Statefull Celem tego laboratorium jest zbadanie różnic funkcjonalnych tych dwóch rodzajów beanów. Poszczególne

Bardziej szczegółowo

1. Czynności przygotowujące aplikację działającą na platformie Java SE Biblioteka5 (należy ją pobrać z załącznika z p.1)

1. Czynności przygotowujące aplikację działającą na platformie Java SE Biblioteka5 (należy ją pobrać z załącznika z p.1) Instrukcja tworzenia aplikacji EE na podstawie aplikacji z dostępem do bazy danych, prezentowanej na zajęciach lab.5 z PIO umożliwiająca przez sieć dostęp wielu użytkownikom. Projektowanie i wdrażanie

Bardziej szczegółowo

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018 Informatyka I Klasy i obiekty. Podstawy programowania obiektowego dr inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2018 Plan wykładu Pojęcie klasy Deklaracja klasy Pola i metody klasy

Bardziej szczegółowo

Dzisiejszy wykład. Wzorce projektowe. Visitor Client-Server Factory Singleton

Dzisiejszy wykład. Wzorce projektowe. Visitor Client-Server Factory Singleton Dzisiejszy wykład Wzorce projektowe Visitor Client-Server Factory Singleton 1 Wzorzec projektowy Wzorzec nazwana generalizacja opisująca elementy i relacje rozwiązania powszechnie występującego problemu

Bardziej szczegółowo

Komponenty sterowane komunikatami

Komponenty sterowane komunikatami Komponenty sterowane komunikatami 1. Usługa JMS asynchroniczność, model przesyłania komunikatów, 2. Przykład wysyłanie wiadomości, odbieranie wiadomości, komponent sterowany komunikatami 3. Komponenty

Bardziej szczegółowo

1 Atrybuty i metody klasowe

1 Atrybuty i metody klasowe 1 Atrybuty i metody klasowe Składowe klasowe (statyczne) Każdy obiekt klasy posiada własny zestaw atrybutów. Metody używają atrybutów odpowiedniego obiektu. Czasem potrzeba atrybutów wspólnych dla wszystkich

Bardziej szczegółowo

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami. UML a kod w C++ i Javie Projektowanie oprogramowania Dokumentowanie oprogramowania Diagramy przypadków użycia Przewoznik Zarzadzanie pojazdami Optymalizacja Uzytkownik Wydawanie opinii Zarzadzanie uzytkownikami

Bardziej szczegółowo

Builder (budowniczy) Cel: Przykład:

Builder (budowniczy) Cel: Przykład: 1/8 Builder (budowniczy) Cel: Oddzielenie konstruowania złożonego obiektu od jego reprezentacji, tak aby ten sam proces konstrukcji mógł tworzyć różne reprezentacje. Przykład: 2/8 abstract class TableBuilder

Bardziej szczegółowo

Singleton. Cel: Przykład: Zastosowanie: Zapewnienie, że klasa ma tylko jedną instancję i dostarczenie globalnego dostępu do niej.

Singleton. Cel: Przykład: Zastosowanie: Zapewnienie, że klasa ma tylko jedną instancję i dostarczenie globalnego dostępu do niej. 1/8 Singleton Cel: Zapewnienie, że klasa ma tylko jedną instancję i dostarczenie globalnego dostępu do niej. Przykład: Niekiedy ważne jest, aby tworzyć tylko jedną instancję jakiejś klasy. Globalne zmienne

Bardziej szczegółowo

Aplikacje w Javie- wykład 11 Wątki-podstawy

Aplikacje w Javie- wykład 11 Wątki-podstawy 1 Aplikacje w Javie- wykład 11 Wątki-podstawy Treści prezentowane w wykładzie zostały oparte o: Barteczko, JAVA Programowanie praktyczne od podstaw, PWN, 2014 http://docs.oracle.com/javase/8/docs/ http://docs.oracle.com/javase/9/docs/

Bardziej szczegółowo

Laboratorium 6 DIAGRAM KLAS (Class Diagram)

Laboratorium 6 DIAGRAM KLAS (Class Diagram) Laboratorium 6 DIAGRAM KLAS (Class Diagram) Opisuje strukturę programu (a także zależności między nimi), co znajduje odzwierciedlenie w kodzie. Charakteryzuje zależności pomiędzy składnikami systemu: klasami,

Bardziej szczegółowo

Klasy abstrakcyjne i interfejsy

Klasy abstrakcyjne i interfejsy Klasy abstrakcyjne i interfejsy Streszczenie Celem wykładu jest omówienie klas abstrakcyjnych i interfejsów w Javie. Czas wykładu 45 minut. Rozwiązanie w miarę standardowego zadania matematycznego (i nie

Bardziej szczegółowo

Tworzenie i wykorzystanie usług sieciowych

Tworzenie i wykorzystanie usług sieciowych Ćwiczenie 14 Temat: Tworzenie i wykorzystanie usług sieciowych Cel ćwiczenia: W trakcie ćwiczenia student zapozna się z procedurą tworzenia usługi sieciowej w technologii ASP.NET oraz nauczy się tworzyć

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Laboratorium z przedmiotu Programowanie obiektowe - zestaw 02 Cel zajęć. Celem zajęć jest zapoznanie z praktycznymi aspektami projektowania oraz implementacji klas i obiektów z wykorzystaniem dziedziczenia.

Bardziej szczegółowo

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut. Konstruktory Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut. Rozpatrzmy przykład przedstawiający klasę Prostokat: class

Bardziej szczegółowo

Specyfikacja techniczna. mprofi Interfejs API

Specyfikacja techniczna. mprofi Interfejs API Warszawa 09.04.2015. Specyfikacja techniczna mprofi Interfejs API wersja 1.0.2 1 Specyfikacja techniczna mprofi Interfejs API wersja 1.0.2 WERSJA DATA STATUTS AUTOR 1.0.0 10.03.2015 UTWORZENIE DOKUMENTU

Bardziej szczegółowo

Programowanie zaawansowane

Programowanie zaawansowane Programowanie zaawansowane Ćwiczenie 6 Komunikacja silnie typowana I. Utwórz aplikację okienkową realizującą proste obliczenia arytmetyczne. Obsługa zdarzeń w aplikacji typu Windows Form Application odbywa

Bardziej szczegółowo

Diagram klas UML jest statycznym diagramem, przedstawiającym strukturę aplikacji bądź systemu w paradygmacie programowania obiektowego.

Diagram klas UML jest statycznym diagramem, przedstawiającym strukturę aplikacji bądź systemu w paradygmacie programowania obiektowego. Umiejętność czytania oraz tworzenia diagramów klas UML jest podstawą w przypadku zawodu programisty. Z takimi diagramami będziesz spotykał się w przeciągu całej swojej kariery. Diagramy klas UML są zawsze

Bardziej szczegółowo

1 LINQ. Zaawansowane programowanie internetowe Instrukcja nr 1

1 LINQ. Zaawansowane programowanie internetowe Instrukcja nr 1 1 LINQ 1 1. Cel zajęć Celem zajęć jest zapoznanie się z technologią LINQ oraz tworzeniem trójwarstwowej aplikacji internetowej. 2. Zadanie Proszę przygotować aplikację WWW, która: będzie pozwalała na generowanie

Bardziej szczegółowo

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C #import "Fraction.h" #import @implementation Fraction -(Fraction*) initwithnumerator: (int) n denominator: (int) d { self = [super init]; } if ( self ) { [self setnumerator: n anddenominator:

Bardziej szczegółowo

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java   1 / 13 Klasy Klasa to grupa obiektów, które mają wspólne właściwości, a obiekt jest instancją klasy. Klasa w języku Java może zawierać: pola - reprezentują stan obiektu (odniesienie do pola z kropką), methods

Bardziej szczegółowo

Politechnika Gdańska Katedra Optoelektroniki i Systemów Elektronicznych

Politechnika Gdańska Katedra Optoelektroniki i Systemów Elektronicznych Laboratorium OiOSE. Programowanie w środowisku MS Visual C++ 1 Politechnika Gdańska Katedra Optoelektroniki i Systemów Elektronicznych Organizacja i Oprogramowanie Systemów Elektronicznych Michał Kowalewski

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Programowanie obiektowe Wykład 2 Marcin Młotkowski 4 marca 2015 Plan wykładu 1 2 3 4 5 Marcin Młotkowski Programowanie obiektowe 2 / 47 Krótki opis C Obiektowy, z kontrolą typów; automatyczne odśmiecanie;

Bardziej szczegółowo

LINQ TO XML. Autor ćwiczenia: Marcin Wolicki

LINQ TO XML. Autor ćwiczenia: Marcin Wolicki LINQ TO XML Celem ćwiczenia jest zapoznanie się z możliwościami przetwarzania dokumentów XML na platformie.net. W toku zadania zostaną przedstawione dwie technologie: LINQ TO XML i XPath. Autor ćwiczenia:

Bardziej szczegółowo

Microsoft.NET: ASP.NET MVC + Entity Framework (Code First)

Microsoft.NET: ASP.NET MVC + Entity Framework (Code First) Microsoft.NET: ASP.NET MVC + Entity Framework (Code First) Do realizacji projektu potrzebne jest zintegrowane środowisko programistyczne Microsoft Visual Studio 2012. W ramach projektu budowana jest prosta

Bardziej szczegółowo

Wykład 4: Klasy i Metody

Wykład 4: Klasy i Metody Wykład 4: Klasy i Metody Klasa Podstawa języka. Każde pojęcie które chcemy opisać w języku musi być zawarte w definicji klasy. Klasa definiuje nowy typ danych, których wartościami są obiekty: klasa to

Bardziej szczegółowo

Wprowadzenie do Doctrine ORM

Wprowadzenie do Doctrine ORM Wprowadzenie do Doctrine ORM Przygotowanie środowiska Do wykonania ćwiczenia konieczne będzie zainstalowanie narzędzia Composer i odpowiednie skonfigurowanie Netbeans (Tools->Options->Framework & Tools->Composer,

Bardziej szczegółowo

Języki i techniki programowania Ćwiczenia 2

Języki i techniki programowania Ćwiczenia 2 Języki i techniki programowania Ćwiczenia 2 Autor: Marcin Orchel Spis treści: Język C++... 5 Przekazywanie parametrów do funkcji... 5 Przekazywanie parametrów w Javie.... 5 Przekazywanie parametrów w c++...

Bardziej szczegółowo

Instrukcja laboratoryjna nr.2

Instrukcja laboratoryjna nr.2 Języki programowania na platformie.net 2017/18 Instrukcja laboratoryjna nr.2 Kontener Unity Prowadzący: Tomasz Goluch Wersja: 2.0 I. Kontener Unity. Cel: Instalacja i konfiguracja kontenera Unity. Rejestracja

Bardziej szczegółowo

PHP: bloki kodu, tablice, obiekty i formularze

PHP: bloki kodu, tablice, obiekty i formularze 1 PHP: bloki kodu, tablice, obiekty i formularze SYSTEMY SIECIOWE Michał Simiński 2 Bloki kodu Blok if-else Switch Pętle Funkcje Blok if-else 3 W PHP blok if i blok if-else wyglądają tak samo i funkcjonują

Bardziej szczegółowo

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie? 1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie? a) konstruktor b) referencje c) destruktor d) typy 2. Które z poniższych wyrażeń są poprawne dla klasy o nazwie

Bardziej szczegółowo

Zaawansowane aplikacje internetowe laboratorium REST

Zaawansowane aplikacje internetowe laboratorium REST Zaawansowane aplikacje internetowe laboratorium REST Pytka Bartosz, Drożdż Mateusz, Ejkszto Mateusz, Łozowski Marcin, Tański Mariusz Do wykonania ćwiczeń potrzebne jest zintegrowane środowisko programistyczne

Bardziej szczegółowo

Aplikacje w środowisku Java

Aplikacje w środowisku Java Aplikacje w środowisku Java Materiały do zajęć laboratoryjnych Klasy i obiekty - wprowadzenie mgr inż. Kamil Zieliński Katolicki Uniwersytet Lubelski Jana Pawła II 2018/2019 Klasa zbiór pól i metod Obiekt

Bardziej szczegółowo

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1 Obiektowe programowanie rozproszone Java RMI Krzysztof Banaś Systemy rozproszone 1 Java RMI Mechanizm zdalnego wywołania metod Javy (RMI Remote Method Invocation) posiada kilka charakterystycznych cech,

Bardziej szczegółowo

Instrukcja 10 Laboratorium 13 Testy akceptacyjne z wykorzystaniem narzędzia FitNesse

Instrukcja 10 Laboratorium 13 Testy akceptacyjne z wykorzystaniem narzędzia FitNesse Instrukcja 10 Laboratorium 13 Testy akceptacyjne z wykorzystaniem narzędzia FitNesse 1 Cel laboratorium: Nabycie umiejętności przygotowywania testów akceptacyjnych za pomocą narzędzia FitNesse 1. Wg wskazówek

Bardziej szczegółowo

Korzystanie z Certyfikatów CC Signet w programie MS Outlook 98

Korzystanie z Certyfikatów CC Signet w programie MS Outlook 98 Korzystanie z Certyfikatów CC Signet w programie MS Outlook 98 1. Wprowadzenie... 2 2. Podpisywanie i szyfrowanie wiadomości pocztowych... 2 2.1. Wysyłanie wiadomości z podpisem cyfrowym... 3 2.2. Odbieranie

Bardziej szczegółowo

Fragmenty są wspierane od Androida 1.6

Fragmenty są wspierane od Androida 1.6 W androidzie można tworzyć dynamiczne interfejsy poprzez łączenie w moduły komponentów UI z aktywnościami. Moduły takie tworzy się za pomocą klasy Fragment, która zachowuje się jak zagnieżdżone aktywności

Bardziej szczegółowo

Wykład 7: Pakiety i Interfejsy

Wykład 7: Pakiety i Interfejsy Wykład 7: Pakiety i Interfejsy Plik Źródłowy w Javie Składa się z: instrukcji pakietu (pojedyncza, opcjonalna) instrukcji importujących (wielokrotne, opcjonalne) deklaracji klasy publicznej (pojedyncza,

Bardziej szczegółowo

Java Zadanie 1. Aby poprawnie uruchomić aplikację desktopową, należy zaimplementować główną metodę zapewniającą punkt wejścia do programu.

Java Zadanie 1. Aby poprawnie uruchomić aplikację desktopową, należy zaimplementować główną metodę zapewniającą punkt wejścia do programu. Wstęp Java Zadanie Celem laboratorium jest zapoznanie się z podstawami platformy oraz języka Java. W ramach zadania należy przygotować aplikację zarządzania notatkami użytkownika obsługiwaną z konsoli.

Bardziej szczegółowo

Instrukcja implementacji sterownika wirtualnego portu szeregowego dla systemu Android. Opracowanie: Elzab Soft sp. z o.o.

Instrukcja implementacji sterownika wirtualnego portu szeregowego dla systemu Android. Opracowanie: Elzab Soft sp. z o.o. Instrukcja implementacji sterownika wirtualnego portu szeregowego dla systemu Android. Opracowanie: Elzab Soft sp. z o.o. 29.06.2015 2 Spis treści 1. Wymagania...4 2. Uprawnienia systemowe...4 3. Uprawnienie

Bardziej szczegółowo

akademia androida Składowanie danych część VI

akademia androida Składowanie danych część VI akademia androida Składowanie danych część VI agenda 1. SharedPreferences. 2. Pamięć wewnętrzna i karta SD. 3. Pliki w katalogach /res/raw i /res/xml. 4. Baza danych SQLite. 5. Zadanie. 1. SharedPreferences.

Bardziej szczegółowo

Baza danych sql. 1. Wprowadzenie. 2. Repozytaria generyczne

Baza danych sql. 1. Wprowadzenie. 2. Repozytaria generyczne Baza danych sql 1. Wprowadzenie Do tej pory operowaliście na listach. W tej instrukcji pokazane zostanie jak stworzyć bazę danych. W zadaniu skorzystamy z możliwości utworzenia struktury bazy danych z

Bardziej szczegółowo

Instrukcja laboratoryjna nr.4

Instrukcja laboratoryjna nr.4 Języki programowania na platformie.net cz.2 2016/17 Instrukcja laboratoryjna nr.4 Język Visual Basic for.net Prowadzący: Tomasz Goluch Wersja: 3.1 I. Współpraca Visual Basic z C# Cel: Wykorzystanie w kodzie

Bardziej szczegółowo

Backend Administratora

Backend Administratora Backend Administratora mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011 W tym celu korzystając z konsoli wydajemy polecenie: symfony generate:app backend Wówczas zostanie stworzona

Bardziej szczegółowo

Instrukcja laboratoryjna cz.3

Instrukcja laboratoryjna cz.3 Języki programowania na platformie.net cz.2 2015/16 Instrukcja laboratoryjna cz.3 Język C++/CLI Prowadzący: Tomasz Goluch Wersja: 2.0 I. Utworzenie projektu C++/CLI z interfejsem graficznym WPF 1 Cel:

Bardziej szczegółowo

akademia androida Intencje oraz URI część III

akademia androida Intencje oraz URI część III akademia androida Intencje oraz URI część III agenda 1. Czym są intencje i po co się ich używa? 2. Czym jest URI? 3. Zadanie 1. 4. Zadanie 2 (domowe). 1. Czym są intencje i po co się ich używa? Intencje

Bardziej szczegółowo

PWŚG Ćwiczenia 13. Ukończoną pracę należy przesłać na adres lub

PWŚG Ćwiczenia 13. Ukończoną pracę należy przesłać na adres   lub PWŚG Ćwiczenia 13 Ukończoną pracę należy przesłać na adres email: sara.m.jurczyk@gmail.com lub sarajurczyk@kul.lublin.pl Zadanie. Stwórz aplikację stawiającą stemple w postaci figur geometrycznych: koło,

Bardziej szczegółowo

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016 Wykład 2 17 marca 2016 Dziedziczenie Klasy bazowe i potomne Dziedziczenie jest łatwym sposobem rozwijania oprogramowania. Majac klasę bazowa możemy ja uszczegółowić (dodać nowe pola i metody) nie przepisujac

Bardziej szczegółowo

Kolejkowanie wiadomości Standard MQ (JMS)

Kolejkowanie wiadomości Standard MQ (JMS) Kolejkowanie wiadomości Standard MQ (JMS) Kolejkowanie wiadomości Standard wymiany informacji wiadomości (ang. message) między procesami (mogą być rozproszone) Przykładowe rozwiązania: - RabbitMQ - ActiveMQ

Bardziej szczegółowo

Tworzenie i wykorzystanie usług

Tworzenie i wykorzystanie usług Strona 1 Co to jest usługa w systemie Android? Usługi HTTP Obsługa wywołania HTTP GET Obsługa wywołania HTTP POST Obsługa wieloczęściowego wywołania HTTP POST Usługi lokalne Usługi zdalne Tworzenie usługi

Bardziej szczegółowo

TEMAT : KLASY DZIEDZICZENIE

TEMAT : KLASY DZIEDZICZENIE TEMAT : KLASY DZIEDZICZENIE Wprowadzenie do dziedziczenia w języku C++ Język C++ możliwa tworzenie nowej klasy (nazywanej klasą pochodną) w oparciu o pewną wcześniej zdefiniowaną klasę (nazywaną klasą

Bardziej szczegółowo

Wykład 5 Okna MDI i SDI, dziedziczenie

Wykład 5 Okna MDI i SDI, dziedziczenie Wykład 5 Okna MDI i SDI, dziedziczenie Autor: Zofia Kruczkiewicz Zagadnienia 1. Aplikacja wielookienkowa. Zakładanie projektu typu CLR Windows Forms 1.1. Aplikacja typu MDI 1.2. Aplikacja typu SDI 2. Dziedziczenie

Bardziej szczegółowo