MassTransit laboratorium 2017 T. Goluch, K.M. Ocetkiewicz
|
|
- Zdzisław Mazur
- 5 lat temu
- Przeglądów:
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 {
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ółowoService 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ółowoWprowadzenie 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ółowoxmlns: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ółowoProgramowanie 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ółowoDokumentacja 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ółowoInstrukcja 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ółowoObiekt 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) 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ółowoKLASA 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ółowoWykł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ółowoKLASA 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ółowoOpis 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ółowoAplikacje 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ółowoNarzę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ółowoProjektowanie 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ółowoPHP 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ółowoInterfejsy. 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ółowoWykł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ółowoCiekawym 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ółowoRozdział 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ółowoProgramowanie 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ółowoZadanie 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ółowoProgramowanie 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ółowoPWSG Ć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ółowoInstrukcja 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ółowoProgramowanie 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ółowoWykł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 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ółowoWykł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ółowoAplikacje 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ółowoZaawansowane 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ółowoTechniki 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ółowoMVVM 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ółowoD:\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ółowoMarcin 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ółowoMetody 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ółowoAplikacje 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ółowoJAVA 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ółowoInstrukcja 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ółowoZaawansowane 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ółowoKlasy 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ółowoKlasy 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ółowoKurs 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ółowoProgramowanie 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ółowoZaawansowane 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ółowo1. 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ółowoInformatyka 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ółowoDzisiejszy 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ółowoKomponenty 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ółowo1 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ółowoUML 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ółowoBuilder (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ółowoSingleton. 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ółowoAplikacje 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ółowoLaboratorium 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ółowoKlasy 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ółowoTworzenie 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ółowoProgramowanie 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ółowoKonstruktory. 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ółowoSpecyfikacja 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ółowoProgramowanie 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ółowoDiagram 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ółowo1 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ółowoKlasy 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ółowoKlasy. 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ółowoPolitechnika 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ółowoProgramowanie 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ółowoLINQ 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ółowoMicrosoft.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ółowoWykł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ółowoWprowadzenie 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ółowoJę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ółowoInstrukcja 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ółowoPHP: 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ółowo1. 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ółowoZaawansowane 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ółowoAplikacje 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ółowoObiektowe 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ółowoInstrukcja 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ółowoKorzystanie 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ółowoFragmenty 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ółowoWykł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ółowoJava 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ółowoInstrukcja 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ółowoakademia 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ółowoBaza 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ółowoInstrukcja 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ółowoBackend 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ółowoInstrukcja 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ółowoakademia 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ółowoPWŚ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ółowoKurs 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ółowoKolejkowanie 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ółowoTworzenie 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ółowoTEMAT : 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ółowoWykł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