diff --git a/LICENSE.md b/LICENSE.md index 111b3c6..cdcb85d 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,10 +1,26 @@ -By accessing code under the [Particular Software GitHub Organization](https://github.com/Particular) (Particular Software) here, you are agreeing to the following licensing terms. -If you do not agree to these terms, do not access Particular Software code. +By accessing code under the [Particular Software GitHub Organization](https://github.com/Particular) (Particular Software) here, you are agreeing to the following licensing terms. If you do not agree to these terms, do not access Particular Software code. -Your license to Particular Software source code and/or binaries is governed by the Reciprocal Public License 1.5 (RPL1.5) license as described here: +Your license to the artifacts in this repository is governed by the [MIT License](https://opensource.org/license/MIT), as described here: -https://opensource.org/license/rpl-1-5/ +Copyright (c) Particular Software Limited + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +``` -If you do not wish to release the source of software you build using Particular Software source code and/or binaries under the terms above, you may use Particular Software source code and/or binaries under the License Agreement described here: -https://particular.net/LicenseAgreement diff --git a/README.md b/README.md index f8169d3..4bef1f2 100644 --- a/README.md +++ b/README.md @@ -6,10 +6,11 @@ This showcase consists of 4 processes hosting MassTransit message producers and ## Launching the Showcase in Docker -The showcase requires a connection to a broker (by default RabbitMQ), [ServiceControl](https://hub.docker.com/r/particular/servicecontrol) container, [ServicePulse](https://hub.docker.com/r/particular/servicepulse) container and the [MassTransit Connector for ServiceControl](https://hub.docker.com/r/particular/servicecontrol-masstransit-connector) container. To help getting started we have created a few docker compose files that orchestrate all this setup for you. -Run the docker command below from the `src` folder in a terminal. +* First, make sure you've pulled down the repository to your machine. +* Second, open a terminal and navigate to the `src` folder in your local copy of the repository. +* Third, run the following command: ```cmd docker compose -p particular-platform-showcase -f docker-compose-base.yml -f compose-rabbitmq.yml --env-file rabbit.env up -d @@ -68,21 +69,21 @@ Run the solution to start the demo. ## Opening the showcase UI -Navigate to http://localhost:61335/ to see the UI. Click `Run Scenario` to start the showcase scenario and generate some simulated message handling failures. +Navigate to http://localhost:61335/ to see the UI. -## Handling failures with the Particular Platform +Click `Run Scenario` to send some messages and generate some simulated failures. -### Inspecting failures +## Managing errors -Navigate to [http://localhost:9090](http://localhost:9090) in a new tab, or click the `View in ServicePulse` button, to see the details on failures ingested by the platform. +Navigate to [http://localhost:9090](http://localhost:9090) in a new tab, or click the `View Failures` button, to see the details on failures ingested by the platform. -![Service Pulse Dashboard](docs/service-pulse-dashboard-failed-messages.png "Message processing errors summary view") +![Dashboard](docs/service-pulse-dashboard-failed-messages.png "Message processing errors summary view") ### Scheduling message reprocessing Click on the "Failed Messages" button at the top of the page to see all failed messages ingested by the platform, grouped by the exception type and stack trace. -![Service Pulse Failed Messages](docs/service-pulse-dashboard-failed-messages-groups.png "Failed messages grouping") +![Failed Messages](docs/service-pulse-dashboard-failed-messages-groups.png "Failed messages grouping") Drill into an existing group to see the list of individual processing failures. Clicking on any of the rows in the list shows detailed information of a given failed message in the headers and message body tabs. @@ -91,7 +92,7 @@ A failed message can be scheduled for reprocessing by clicking the `Retry messag > [!NOTE] > It may take several seconds after retrying a message for it to appear again in the consumer's input queue -![Service Pulse Failed Message View](docs/service-pulse-failed-message-view.png "Failed message details view") +![Failed Message View](docs/service-pulse-failed-message-view.png "Failed message details view") ### Editing messages before reprocessing @@ -106,11 +107,17 @@ Navigate to the `Message Body` tab and change some of the contents of the messag ### Viewing retries -Return to the showcase UI to see that the retries have now been successfully handled. +Return to the Showcase UI to see that the retries have now been successfully handled. ### Troubleshooting Having issues? +- Check that all containers are running: + - RabbitMQ + - [ServicePulse](https://hub.docker.com/r/particular/servicepulse) + - [ServiceControl](https://hub.docker.com/r/particular/servicecontrol) + - [MassTransit Connector for ServiceControl](https://hub.docker.com/r/particular/servicecontrol-masstransit-connector) - Check logs in docker. Ensure that there are no port clashes with existing containers or services on your machine. -- Ask any questions on [our forum](https://discuss.particular.net/tag/masstransit) + +And, if you need help, you can always head over to [our forum](https://discuss.particular.net/tag/masstransit). diff --git a/docs/docs.md b/docs/docs.md deleted file mode 100644 index 720a83a..0000000 --- a/docs/docs.md +++ /dev/null @@ -1,90 +0,0 @@ -This showcase shows how the errors in an existing MassTransit system can be managed using the Particular Service Platform. - -> [!NOTE] -> This showcase uses RabbitMQ as the messaging infrastructure. Refer to [the setup documentation](https://docs.particular.net/servicecontrol/masstransit/#settings) for Azure Service Bus setup instructions. - -## Walkthrough - -The showcase consists of 4 processes hosting MassTransit message producers and consumers that implement a simplified order processing logic from an e-commerce system. - -![System Overview](diagram.svg "width=680") - -`ClientUI` application generates `PlaceOrder` messages that trigger follow-up message flows in the other parts of the system. - -### Experiencing failures - -In the UI, press the `Run scenario` button. This will generate a set of `PlaceOrder` messages, configured to fail at different consumers through the showcase. -For example, whenever the `Billing` consumer fails to process a message, the message is moved to the `bill-order_error` queue. - -```code -fail: MassTransit.ReceiveTransport[0] - R-FAULT rabbitmq://localhost/bill-order b4950300-b188-ac74-36f6-08dcf7ec3b26 Messages.OrderPlaced Billing.BillOrderConsumer(00:00:00.2819272) - System.Exception: BOOM. A failure occurred - at Billing.SimulationEffects.SimulatedMessageProcessing(CancellationToken cancellationToken) in C:\git\p\docs-mt-fork\strategy-527.docs.particular.net\samples\servicecontrol\masstransit-recoverability\ServiceControl_5\Billing\SimulationEffects.cs:line 17 - at Billing.BillOrderConsumer.Consume(ConsumeContext`1 context) in C:\git\p\docs-mt-fork\strategy-527.docs.particular.net\samples\servicecontrol\masstransit-recoverability\ServiceControl_5\Billing\Consumers\BillOrderConsumer.cs:line 12 - at MassTransit.DependencyInjection.ScopeConsumerFactory`1.Send[TMessage](ConsumeContext`1 context, IPipe`1 next) in /_/src/MassTransit/DependencyInjection/DependencyInjection/ScopeConsumerFactory.cs:line 22 - at MassTransit.DependencyInjection.ScopeConsumerFactory`1.Send[TMessage](ConsumeContext`1 context, IPipe`1 next) in /_/src/MassTransit/DependencyInjection/DependencyInjection/ScopeConsumerFactory.cs:line 22 - at MassTransit.Middleware.ConsumerMessageFilter`2.MassTransit.IFilter>.Send(ConsumeContext`1 context, IPipe`1 next) in /_/src/MassTransit/Middleware/ConsumerMessageFilter.cs:line 48 -``` - -### Handling failures with the Particular Platform - -#### Running the showcase - -To see how the Particular Platform improves failed message management, start the containers responsible for running the platform: - -### **RabbitMQ** - -> [!NOTE] -> The RabbitMQ Broker is started as part of the docker compose process - -Run docker command below from the `src` folder in a CLI - -```cmd -docker compose -f docker-compose-base.yml -f compose-rabbitmq.yml --env-file rabbit.env up -d -``` - -## **Azure ServiceBus** - -Configure the access to your Azure Service Bus namespace by editing the variables in `src/asb.env` - -```env -CONNECTIONSTRING="Endpoint=sb://[NAMESPACE].servicebus.windows.net/;SharedAccessKeyName=[KEYNAME];SharedAccessKey=[KEY]" -``` - -Run docker command below from the `src` folder in a CLI - -```cmd -docker compose -f docker-compose-base.yml -f compose-azure.yml --env-file asb.env up -d -``` - -This will make the platform monitor error messages for all the consumers in the sample system. Upon failure, any message moved by a MassTransit consumer to an error queue will be ingested by the platform. - -#### Inspecting failures - -Navigate to [http://localhost:9090](http://localhost:9090), or click the `View in ServicePulse` button to see the details on failures ingested by the platform. - -![Service Pulse Dashboard](service-pulse-dashboard-failed-messages.png "Message processing errors summary view") - -#### Scheduling message reprocessing - -Click on the "Failed Messages" button at the top of the page to see all failed messages ingested by the platform, grouped by the exception type and stack trace. - -![Service Pulse Failed Messages](service-pulse-dashboard-failed-messages-groups.png "Failed messages grouping") - -Drill into an existing group to see the list of individual processing failures. Clicking on any of the rows in the list shows detailed information of a given failed message in the headers and message body tabs. - -A failed message can be scheduled for reprocessing by clicking the `Retry message` button. - -![Service Pulse Failed Message View](service-pulse-failed-message-view.png "Failed message details view") - -#### Editing messages before reprocessing - -Go to the details page for one of the failed messages and click the `Edit & retry` button. The pop-up window shows the headers collection and the message body in two separate tabs. - -Navigate to the `Message Body` tab, change the last digit of the `orderId` value, and click "Retry" to schedule the message for reprocessing. - -> [!WARNING] -> Changing or deleting header values may change or cause issues with the subsequent re-processing. It is recommended that these values are not changed if you are unsure of their purpose. - -![Edit Message View](service-pulse-edit-before-retry.png "Edit & Retry view showing the message body") diff --git a/src/Billing/Billing.csproj b/src/Billing/Billing.csproj index 776a796..8d2228a 100644 --- a/src/Billing/Billing.csproj +++ b/src/Billing/Billing.csproj @@ -18,9 +18,9 @@ - - - + + + \ No newline at end of file diff --git a/src/ClientUI/ClientUI.csproj b/src/ClientUI/ClientUI.csproj index 6af2ebd..da970c9 100644 --- a/src/ClientUI/ClientUI.csproj +++ b/src/ClientUI/ClientUI.csproj @@ -9,9 +9,9 @@ - - - + + + diff --git a/src/ClientUI/SimulatedCustomers.cs b/src/ClientUI/SimulatedCustomers.cs index ac16e74..ddaf9bd 100644 --- a/src/ClientUI/SimulatedCustomers.cs +++ b/src/ClientUI/SimulatedCustomers.cs @@ -15,13 +15,9 @@ public async Task PlaceSingleOrder(string failOn, CancellationToken { await using var scope = factory.CreateAsyncScope(); - var placeOrderCommand = new PlaceOrder - { - OrderId = Guid.NewGuid().ToString(), - Contents = orderGenerator.Generate() - }; + var placeOrderCommand = new PlaceOrder { OrderId = Guid.NewGuid().ToString(), Contents = orderGenerator.Generate() }; - var failureEndpointConsumer = Enum.TryParse(typeof(Consumers), failOn, out var _failureEndpoint) ? (Consumers)_failureEndpoint : Consumers.None; + var failureEndpointConsumer = Enum.TryParse(typeof(Consumers), failOn, out var failureEndpoint) ? (Consumers)failureEndpoint : Consumers.None; await scope.ServiceProvider.GetRequiredService().Publish( placeOrderCommand, @@ -48,714 +44,717 @@ public string[] Generate() .ToArray(); } - readonly string[] fruits = ["Abiu", -"Açaí", -"Acerola", -"Ackee", -"African Breadfruit", -"African Cherry Orange", -"African Cucumber", -"African Mango", -"Akebi", -"Alexandria Strawberry", -"Alpine Strawberry", -"Amanatsu Orange", -"Amaou Strawberry", -"Amara", -"Ambarella", -"Ambrosia Apple", -"Ambrosia Melon", -"American Mayapple", -"Amla", -"Annatto", -"Annona", -"Apple", -"Appleberry", -"Apricot", -"Aprium", -"Araca-Boi", -"Arava Melon", -"Araza", -"Aronia", -"Asam Kumbang", -"Asian Pear", -"Atemoya", -"Avocado", -"Babaco", -"Bacuri Fruit", -"Bael", -"Banana", -"Barbadine", -"Barbados Cherry", -"Barberry", -"Batuan", -"Beach Plum", -"Bearberry", -"Bignay", -"Bilberry", -"Bilimbi", -"Biriba", -"Bitter Gourd", -"Bitter Melon", -"Black Apple", -"Black Cherry", -"Black Currant", -"Black Mulberry", -"Black Raspberry", -"Black Sapote", -"Blackberry", -"Blackcurrant", -"Blood Lime", -"Blood Orange", -"Blue Passionfruit", -"Blueberry", -"Bolivian Mountain Coconut", -"Bottle Gourd", -"Boysenberry", -"Bramble", -"Brazilian Guava", -"Bread Fruit", -"Breadfruit", -"Brush Cherry", -"Buddha Apple", -"Buddha’s Hand", -"Burdekin Plum", -"Bushel and Berry ‘Jelly Bean’ Blueberry", -"Butter Fruit", -"Cacao", -"Cactus Pear", -"Calabash", -"Calamansi", -"Calamondin", -"Camu Camu", -"Canistel", -"Cantaloupe", -"Cape Gooseberry", -"Cara Cara", -"Carambola", -"Carissa", -"Cascara", -"Cashew Apple", -"Catmon", -"Caviar Lime", -"Cawesh", -"Cedar Bay Cherry", -"Cempedak", -"Ceylon Gooseberry", -"Changunga", -"Charichuelo", -"Chayote", -"Cherimoya", -"Cherry", -"Cherry Plum", -"Chico Fruit", -"Chocolate-Fruit", -"Chokeberry", -"Chokecherry", -"Citrofortunella", -"Citron", -"Clementine", -"Cloudberry", -"Cluster Fig", -"Cocky Apple", -"Coco De Mer", -"Coco Plum ", -"Coconut", -"Coffee Cherry", -"Coffee Fruit", -"Colonnade ‘Maypole’ Apple", -"Common Apple Berry", -"Conkerberry", -"Cornelian Cherry", -"Crab Apple", -"Craisin", -"Cranberry", -"Crowberry", -"Cucumber", -"Cumquat", -"Cupuacu", -"Currant", -"Custard Apple", -"Dabai Fruit", -"Damson", -"Damson Plum", -"Dangle Berry", -"Darling Plum", -"Date", -"Date Plum", -"Davidson’s Plum", -"Dead Man’s Fingers", -"Decaisnea", -"Dekopon", -"Desert Banana", -"Desert Fig", -"Desert King Fig", -"Desert Lime", -"Desert Quandong", -"Dewberry", -"Discovery Apple", -"Dodder-Laurel", -"Double Coconut", -"Dracontomelon", -"Dragon Fruit", -"Duku Fruit", -"Durian", -"Early Girl Tomato", -"Early Gold Mango", -"Eastern Hawthorn", -"Egg Fruit", -"Eggplant", -"Elands Sour Fig", -"Elderberry", -"Elephant Apple", -"Emblica", -"Emu Apple", -"Emu Berry", -"Entawak", -"Enterprise Apple", -"Etrog", -"European Pear", -"Evergreen Huckleberry", -"Fairchild Tangerine", -"Falkland Island Cranberry", -"Falmouth Gooseberry", -"False Mastic", -"Farkleberry", -"Fascell Mango", -"Fazli Mango", -"Fe’i Banana", -"Feijoa", -"Fibrous Satinash", -"Fig", -"Filbert", -"Finger Lime", -"Fingered Citron", -"Five Flavor Berry", -"Flatwoods Plum", -"Flavorfest Strawberry", -"Florentine Citron", -"Florida Cherry", -"Florida Strangler Fig", -"Forest Strawberry", -"Fox Grape", -"Fuji Apple", -"Fukushu Kumquat", -"Fuyu Persimmon", -"Fuzzy Pear", -"Gac Fruit", -"Gala Apple", -"Galia Melon", -"Gamboge", -"Genip", -"Giant Granadilla", -"Goji Berry", -"Golden Apple", -"Golden Kiwi", -"Golden Raisins", -"Gooseberry", -"Gorham Pear", -"Goumi", -"Governor’s Plum", -"Granadilla", -"Grand Nain Banana", -"Grape", -"Grapefruit", -"Grecian Fig", -"Greek Fig", -"Green Anjou Pear", -"Green Apple", -"Greengage", -"Grenadier", -"Grewia Asiatica", -"Ground Plum", -"Groundcherry", -"Grumichama", -"Grumolo", -"Guanábana", -"Guarana", -"Guava", -"Guavaberry", -"Hackberry", -"Hala Fruit", -"Hardy Kiwi", -"Haskap", -"Hawaiian Mountain Apple", -"Hawthorn Berry", -"Hebesu", -"Heirloom Tomato", -"Highbush Blueberry", -"Highbush Cranberry", -"Himalayan Mulberry", -"Hog Plum", -"Honey Crisp Apple", -"Honey Locust", -"Honeyberry", -"Honeydew", -"Honeydew Melon", -"Honeysuckle", -"Horned Melon", -"Huckleberry", -"Huito", -"Husk Tomato", -"Hyuganatsu", -"Iboga", -"Icacina", -"Icaco", -"Ice Apple", -"Ice Cream Bean", -"Ichigo", -"Ilama", -"Illawarra Plum", -"Imbe", -"Incaberry", -"Indian Almond", -"Indian Gooseberry", -"Indian Jujube", -"Indian Persimmon", -"Indian Plum", -"Indian Prune", -"Indian Sherbet Berry", -"Indonesian Lime", -"Ita Palm", -"Jaboticaba", -"Jackfruit", -"Jamaican Tangelo", -"Jambolan", -"Jambul", -"Japanese Plum", -"Jatoba", -"Java Apple", -"Jazz Apple", -"Jelly Palm", -"Jocote", -"Joel Bush Cherry", -"Jostaberry", -"Jujube", -"June Plum", -"Junglesop", -"Juniper Berry", -"Kabosu", -"Kaffir Lime", -"Kakadu Plum", -"Kaki", -"Kantola", -"Kanzi Apple", -"Kapok", -"Karkalla", -"Karonda", -"Kaywa", -"Kei Apple", -"Keitt Mango", -"Kepel", -"Keule", -"Key Lime", -"Kiwano", -"Kiwi", -"Knobby Russet Apple", -"Korean Pear", -"Korlan", -"Koroi", -"Kumquat", -"Kutjera", -"Kwai Muk", -"Kyoho Grape", -"Lablab Fruit", -"Lancetilla Mango", -"Langra Mango", -"Langsat", -"Le Conte Pear", -"Lebanese Wild Apple", -"Lemon", -"Lemon Aspen Fruit", -"Lemon Drop Mangosteen", -"Lemon Drop Melon", -"Lemonade Berry", -"Liberty Apple", -"Lilly Pilly", -"Lime", -"Limeberry", -"Limequat", -"Lingonberry", -"Little Gooseberry", -"Loganberry", -"Long‑peduncled Almond", -"Longan", -"Loquat", -"Lovi-Lovi", -"Low Juneberry", -"Low Serviceberry", -"Lúcuma", -"Lulo", -"Luóhàn Guǒ", -"Lychee", -"Magellan Barberry", -"Malabar Plum", -"Malay Rose Apple", -"Malus Sieversii", -"Mamey", -"Mamey Apple", -"Mamey Sapote", -"Mamin Chino", -"Manchurian Apricot", -"Manchurian Cherry", -"Manchurian Crab Apple", -"Mandarine", -"Mangifera Indica", -"Mango", -"Mangosteen", -"Manilkara Elata", -"Maqui", -"Marionberry", -"Marula", -"Mayhaw", -"Maypop", -"Medlar", -"Melon", -"Mexican Pitahaya", -"Mexican Plum", -"Midgen Berry", -"Mimusops Elengi", -"Minneola Tangelo", -"Miracle Fruit", -"Miyama Cherry", -"Mombin", -"Momordica Fruit", -"Moriche Palm Fruit", -"Moro Blood Orange", -"Morus", -"Mountain Serviceberry", -"Mouse Melon", -"Mulberry", -"Muntingia Calabura", -"Murray’s Plum", -"Murraya Fruit", -"Musa Ingens", -"Muscadine Grape", -"Muskmelon", -"Myers Plum", -"Naartjie", -"Nagami Kumquat", -"Nageia", -"Nam Dok Mai", -"Nance", -"Naples Fig", -"Naranjilla", -"Narenj", -"Nashi Pear", -"Natal Plum", -"Naval Orange", -"Nectacot", -"Nectarine", -"Neem", -"Nepali Hog Plum", -"Nere Fruit", -"Neroli", -"Newton Pippin Apple", -"Nocera Grape", -"Noni", -"Nopal Fruit", -"Northern Spy Apple", -"Nungu", -"O’Henry Peach", -"Oeillade Noire Grape", -"Ogallala Strawberry", -"Ogden Melon", -"Ogeechee Lime", -"Oil Palm", -"Okra", -"Okuzgozu Grape", -"Olallieberry", -"Olive", -"Opal Apple", -"Opal Plum", -"Opo Squash", -"Opuntia", -"Orange", -"Orangelo", -"Oregon Grape", -"Orient Melon", -"Orient Pear", -"Oriental Cherry", -"Orin Apple", -"Orlando Tangelo", -"Oroblanco", -"Ortanique", -"Osage Orange", -"Oso Grande Strawberry", -"Osteen Mango", -"Otaheite Apple", -"Otaheite Gooseberry", -"Oullins Gage Plum", -"Oval Kumquat", -"Ozark Beauty Strawberry", -"Ozark Gold Apple", -"Pacific Rose Apple", -"Palestinian Sweet Lime", -"Papaya", -"Parsonage Pear", -"Passionfruit", -"Pawpaw", -"Peach", -"Peach Palm Fruit", -"Peanut Butter Fruit", -"Pear", -"Pepino Melon", -"Pequi", -"Persian Lime", -"Persimmon", -"Peruvian Groundcherry", -"Petit Manseng Grape", -"Petit Rouge Grape", -"Peumo", -"PF Lucky 13 Flamin’ Fury Peach", -"Physalis", -"Pickering Mango", -"Picual Olive", -"Pigeon Pea", -"Pigeon Plum", -"Pigface Fruit", -"Pineapple", -"Pineberry", -"Pink Banana", -"Pink Lady Apple", -"Pink Lemonade Blueberry", -"Pink Pearl Apple", -"Pinot Noir Grape", -"Pinova Apple", -"Pitaya", -"Plantain", -"Plum", -"Plumcot", -"Pluot", -"Pomato Fruit", -"Pomegranate", -"Pomelo", -"Ponderosa Lemon", -"Ponkan Fruit", -"Poorman Orange", -"Prickly Pear", -"Prime Ark Freedom Blackberry", -"Prune", -"Pulasan", -"Pummelo", -"Purple Mangosteen", -"Quandong", -"Quararibea Cordata", -"Queen Anne’s Cherry", -"Queen Tahiti Pineapple", -"Queen’s Forelle Pear", -"Quenepa", -"Querina Apple", -"Quinault Strawberry", -"Quince", -"Raisin", -"Rajka Apple", -"Rambai", -"Rambutan", -"Ramontchi", -"Rangpur Lime", -"Raspberry", -"Raspuri Mango", -"Rata", -"Red Banana", -"Red Bayberry", -"Red Delicious Apple", -"Red Grape", -"Red Huckleberry", -"Red Mombin", -"Red Mulberry", -"Redcurrant", -"Rhobs El Arsa", -"Rhubarb", -"Riberry", -"Rocha Pear", -"Rockmelon", -"Rollinia", -"Rombo", -"Rose Apple", -"Rose Hip", -"Roselle", -"Rosigold Mango", -"Rough Lemon", -"Rubus Parviflorus", -"Rumdul", -"Safou", -"Saigon Mango", -"Salak", -"Salak ", -"Salal", -"Salal Berry", -"Salmonberry", -"Sand Cherry", -"Santol", -"Sapodilla", -"Sapote", -"Sarvisberry", -"Sassafras", -"Satsuma", -"Sea Buckthorn", -"Seagrape", -"Serviceberry", -"Seville Orange", -"Sharon ", -"Shine Muscat", -"Shonan Gold", -"Silky Oak Apple", -"Sloe", -"Snake Fruit", -"Soncoya ", -"Sour Cherry", -"Soursop", -"Spanish Lime", -"Spanish Tamarind", -"Splendor Apple", -"Star Apple", -"Starfruit", -"Strawberry Guava", -"Stinking Bishop Pear", -"Strawberry", -"Strawberry Guava", -"Sugar Apple", -"Sugar Baby Watermelon ", -"Sugar Palm", -"Sultana", -"Sumo Orange", -"Sunda Plum", -"Surinam Cherry", -"Sweet Dakota Rose Watermelon", -"Sweet Lime", -"Sweet Pepper", -"Tachibana Orange", -"Tamarillo", -"Tamarind", -"Tangelo", -"Tangerillo", -"Tangerine", -"Tangerinequat", -"Tangor", -"Tarap", -"Tarpan Strawberry", -"Tart Cherry", -"Tawa-Tawa", -"Tayberry", -"Tepin Pepper", -"Terap", -"Texas Persimmon", -"Thimbleberry", -"Thorn Apple", -"Thornberry", -"Thornless Blackberry", -"Thornless Loganberry", -"Thumbelina Apple", -"Tieguanyin", -"Tindora", -"Tomato", -"Tomato Berry", -"Tomato Cherry", -"Tomato Plum", -"Tompkins King Apple", -"Topaz Apple", -"Toronja", -"Torpedo Melon", -"Totapuri Mango", -"Tree Tomato", -"Tropical Apricot", -"Tucuma", -"Tuna Fruit", -"Tung Berry", -"Tungfruit", -"Ububese", -"Udara", -"Ugli Fruit", -"Ugni", -"Ugni Blanc Grape", -"Ugni Molinae", -"Ukranian Heart Tomato", -"Ula", -"Umari", -"Umbrafruit", -"Umbrella Squash", -"Umbu", -"Ume", -"Ume Plums", -"Urava", -"Usakhelauri", -"Usama", -"Utu", -"Uva Rara Grape", -"Uva Tosca Grape", -"Uvalino Grape", -"Uvaria", -"Uvilla", -"Vaccarese Grape", -"Valencia Orange Fruit", -"Valencia Pride Mango", -"Van Dyke Mango", -"Vanilla Fruit", -"Velvet Apple", -"Velvet Tamarind", -"Vernaccia Grape", -"Vespolina Grape", -"Vicar Of Winkfield Pear", -"Victoria Plum", -"Vitis Vinifera", -"Voavanga", -"Volkamer Lemon", -"Water Apple", -"Watermelon", -"Wax Gourd", -"White Aspen Fruit", -"White Currant", -"White Mulberry", -"White Sapote", -"Wintermelon", -"Wolf Berry", -"Wood Apple", -"Xanthium", -"Xaoy", -"Xarel·lo", -"Xiangjiao", -"Xigua", -"Xilacayota Squash", -"Ximenia", -"Xing Zi", -"Xinomavro", -"Xoài", -"Xoconostle", -"Xylocarpus Granatum", -"Yaca", -"Yali Pear", -"Yangmei Fruit", -"Yellow Dragon Fruit", -"Yellow Grape", -"Yellow Guava", -"Yellow Himalayan Raspberry", -"Yellow Passion Fruit", -"Yellow Pear Tomato", -"Yellow Plum", -"Yellow Sapote", -"Yellow Squash", -"Yellow Watermelon", -"Yemenite Citron", -"York Imperial Apple", -"Young Mango", -"Youngberry", -"Yumberry", -"Yunnan Hackberry Fruit", -"Yuzu", -"Zabergay Reinette Apple", -"Zalzalak", -"Zante Currant", -"Zarzamora", -"Zawngtah", -"Zebra Melon", -"Zhe Fruit", -"Ziga Zag Tree Vine", -"Zinfandel Grape", -"Ziziphus Jujube Fruit", -"Zucchini", -"Zwetschge"]; + readonly string[] fruits = + [ + "Abiu", + "Açaí", + "Acerola", + "Ackee", + "African Breadfruit", + "African Cherry Orange", + "African Cucumber", + "African Mango", + "Akebi", + "Alexandria Strawberry", + "Alpine Strawberry", + "Amanatsu Orange", + "Amaou Strawberry", + "Amara", + "Ambarella", + "Ambrosia Apple", + "Ambrosia Melon", + "American Mayapple", + "Amla", + "Annatto", + "Annona", + "Apple", + "Appleberry", + "Apricot", + "Aprium", + "Araca-Boi", + "Arava Melon", + "Araza", + "Aronia", + "Asam Kumbang", + "Asian Pear", + "Atemoya", + "Avocado", + "Babaco", + "Bacuri Fruit", + "Bael", + "Banana", + "Barbadine", + "Barbados Cherry", + "Barberry", + "Batuan", + "Beach Plum", + "Bearberry", + "Bignay", + "Bilberry", + "Bilimbi", + "Biriba", + "Bitter Gourd", + "Bitter Melon", + "Black Apple", + "Black Cherry", + "Black Currant", + "Black Mulberry", + "Black Raspberry", + "Black Sapote", + "Blackberry", + "Blackcurrant", + "Blood Lime", + "Blood Orange", + "Blue Passionfruit", + "Blueberry", + "Bolivian Mountain Coconut", + "Bottle Gourd", + "Boysenberry", + "Bramble", + "Brazilian Guava", + "Bread Fruit", + "Breadfruit", + "Brush Cherry", + "Buddha Apple", + "Buddha’s Hand", + "Burdekin Plum", + "Bushel and Berry ‘Jelly Bean’ Blueberry", + "Butter Fruit", + "Cacao", + "Cactus Pear", + "Calabash", + "Calamansi", + "Calamondin", + "Camu Camu", + "Canistel", + "Cantaloupe", + "Cape Gooseberry", + "Cara Cara", + "Carambola", + "Carissa", + "Cascara", + "Cashew Apple", + "Catmon", + "Caviar Lime", + "Cawesh", + "Cedar Bay Cherry", + "Cempedak", + "Ceylon Gooseberry", + "Changunga", + "Charichuelo", + "Chayote", + "Cherimoya", + "Cherry", + "Cherry Plum", + "Chico Fruit", + "Chocolate-Fruit", + "Chokeberry", + "Chokecherry", + "Citrofortunella", + "Citron", + "Clementine", + "Cloudberry", + "Cluster Fig", + "Cocky Apple", + "Coco De Mer", + "Coco Plum ", + "Coconut", + "Coffee Cherry", + "Coffee Fruit", + "Colonnade ‘Maypole’ Apple", + "Common Apple Berry", + "Conkerberry", + "Cornelian Cherry", + "Crab Apple", + "Craisin", + "Cranberry", + "Crowberry", + "Cucumber", + "Cumquat", + "Cupuacu", + "Currant", + "Custard Apple", + "Dabai Fruit", + "Damson", + "Damson Plum", + "Dangle Berry", + "Darling Plum", + "Date", + "Date Plum", + "Davidson’s Plum", + "Dead Man’s Fingers", + "Decaisnea", + "Dekopon", + "Desert Banana", + "Desert Fig", + "Desert King Fig", + "Desert Lime", + "Desert Quandong", + "Dewberry", + "Discovery Apple", + "Dodder-Laurel", + "Double Coconut", + "Dracontomelon", + "Dragon Fruit", + "Duku Fruit", + "Durian", + "Early Girl Tomato", + "Early Gold Mango", + "Eastern Hawthorn", + "Egg Fruit", + "Eggplant", + "Elands Sour Fig", + "Elderberry", + "Elephant Apple", + "Emblica", + "Emu Apple", + "Emu Berry", + "Entawak", + "Enterprise Apple", + "Etrog", + "European Pear", + "Evergreen Huckleberry", + "Fairchild Tangerine", + "Falkland Island Cranberry", + "Falmouth Gooseberry", + "False Mastic", + "Farkleberry", + "Fascell Mango", + "Fazli Mango", + "Fe’i Banana", + "Feijoa", + "Fibrous Satinash", + "Fig", + "Filbert", + "Finger Lime", + "Fingered Citron", + "Five Flavor Berry", + "Flatwoods Plum", + "Flavorfest Strawberry", + "Florentine Citron", + "Florida Cherry", + "Florida Strangler Fig", + "Forest Strawberry", + "Fox Grape", + "Fuji Apple", + "Fukushu Kumquat", + "Fuyu Persimmon", + "Fuzzy Pear", + "Gac Fruit", + "Gala Apple", + "Galia Melon", + "Gamboge", + "Genip", + "Giant Granadilla", + "Goji Berry", + "Golden Apple", + "Golden Kiwi", + "Golden Raisins", + "Gooseberry", + "Gorham Pear", + "Goumi", + "Governor’s Plum", + "Granadilla", + "Grand Nain Banana", + "Grape", + "Grapefruit", + "Grecian Fig", + "Greek Fig", + "Green Anjou Pear", + "Green Apple", + "Greengage", + "Grenadier", + "Grewia Asiatica", + "Ground Plum", + "Groundcherry", + "Grumichama", + "Grumolo", + "Guanábana", + "Guarana", + "Guava", + "Guavaberry", + "Hackberry", + "Hala Fruit", + "Hardy Kiwi", + "Haskap", + "Hawaiian Mountain Apple", + "Hawthorn Berry", + "Hebesu", + "Heirloom Tomato", + "Highbush Blueberry", + "Highbush Cranberry", + "Himalayan Mulberry", + "Hog Plum", + "Honey Crisp Apple", + "Honey Locust", + "Honeyberry", + "Honeydew", + "Honeydew Melon", + "Honeysuckle", + "Horned Melon", + "Huckleberry", + "Huito", + "Husk Tomato", + "Hyuganatsu", + "Iboga", + "Icacina", + "Icaco", + "Ice Apple", + "Ice Cream Bean", + "Ichigo", + "Ilama", + "Illawarra Plum", + "Imbe", + "Incaberry", + "Indian Almond", + "Indian Gooseberry", + "Indian Jujube", + "Indian Persimmon", + "Indian Plum", + "Indian Prune", + "Indian Sherbet Berry", + "Indonesian Lime", + "Ita Palm", + "Jaboticaba", + "Jackfruit", + "Jamaican Tangelo", + "Jambolan", + "Jambul", + "Japanese Plum", + "Jatoba", + "Java Apple", + "Jazz Apple", + "Jelly Palm", + "Jocote", + "Joel Bush Cherry", + "Jostaberry", + "Jujube", + "June Plum", + "Junglesop", + "Juniper Berry", + "Kabosu", + "Kaffir Lime", + "Kakadu Plum", + "Kaki", + "Kantola", + "Kanzi Apple", + "Kapok", + "Karkalla", + "Karonda", + "Kaywa", + "Kei Apple", + "Keitt Mango", + "Kepel", + "Keule", + "Key Lime", + "Kiwano", + "Kiwi", + "Knobby Russet Apple", + "Korean Pear", + "Korlan", + "Koroi", + "Kumquat", + "Kutjera", + "Kwai Muk", + "Kyoho Grape", + "Lablab Fruit", + "Lancetilla Mango", + "Langra Mango", + "Langsat", + "Le Conte Pear", + "Lebanese Wild Apple", + "Lemon", + "Lemon Aspen Fruit", + "Lemon Drop Mangosteen", + "Lemon Drop Melon", + "Lemonade Berry", + "Liberty Apple", + "Lilly Pilly", + "Lime", + "Limeberry", + "Limequat", + "Lingonberry", + "Little Gooseberry", + "Loganberry", + "Long‑peduncled Almond", + "Longan", + "Loquat", + "Lovi-Lovi", + "Low Juneberry", + "Low Serviceberry", + "Lúcuma", + "Lulo", + "Luóhàn Guǒ", + "Lychee", + "Magellan Barberry", + "Malabar Plum", + "Malay Rose Apple", + "Malus Sieversii", + "Mamey", + "Mamey Apple", + "Mamey Sapote", + "Mamin Chino", + "Manchurian Apricot", + "Manchurian Cherry", + "Manchurian Crab Apple", + "Mandarine", + "Mangifera Indica", + "Mango", + "Mangosteen", + "Manilkara Elata", + "Maqui", + "Marionberry", + "Marula", + "Mayhaw", + "Maypop", + "Medlar", + "Melon", + "Mexican Pitahaya", + "Mexican Plum", + "Midgen Berry", + "Mimusops Elengi", + "Minneola Tangelo", + "Miracle Fruit", + "Miyama Cherry", + "Mombin", + "Momordica Fruit", + "Moriche Palm Fruit", + "Moro Blood Orange", + "Morus", + "Mountain Serviceberry", + "Mouse Melon", + "Mulberry", + "Muntingia Calabura", + "Murray’s Plum", + "Murraya Fruit", + "Musa Ingens", + "Muscadine Grape", + "Muskmelon", + "Myers Plum", + "Naartjie", + "Nagami Kumquat", + "Nageia", + "Nam Dok Mai", + "Nance", + "Naples Fig", + "Naranjilla", + "Narenj", + "Nashi Pear", + "Natal Plum", + "Naval Orange", + "Nectacot", + "Nectarine", + "Neem", + "Nepali Hog Plum", + "Nere Fruit", + "Neroli", + "Newton Pippin Apple", + "Nocera Grape", + "Noni", + "Nopal Fruit", + "Northern Spy Apple", + "Nungu", + "O’Henry Peach", + "Oeillade Noire Grape", + "Ogallala Strawberry", + "Ogden Melon", + "Ogeechee Lime", + "Oil Palm", + "Okra", + "Okuzgozu Grape", + "Olallieberry", + "Olive", + "Opal Apple", + "Opal Plum", + "Opo Squash", + "Opuntia", + "Orange", + "Orangelo", + "Oregon Grape", + "Orient Melon", + "Orient Pear", + "Oriental Cherry", + "Orin Apple", + "Orlando Tangelo", + "Oroblanco", + "Ortanique", + "Osage Orange", + "Oso Grande Strawberry", + "Osteen Mango", + "Otaheite Apple", + "Otaheite Gooseberry", + "Oullins Gage Plum", + "Oval Kumquat", + "Ozark Beauty Strawberry", + "Ozark Gold Apple", + "Pacific Rose Apple", + "Palestinian Sweet Lime", + "Papaya", + "Parsonage Pear", + "Passionfruit", + "Pawpaw", + "Peach", + "Peach Palm Fruit", + "Peanut Butter Fruit", + "Pear", + "Pepino Melon", + "Pequi", + "Persian Lime", + "Persimmon", + "Peruvian Groundcherry", + "Petit Manseng Grape", + "Petit Rouge Grape", + "Peumo", + "PF Lucky 13 Flamin’ Fury Peach", + "Physalis", + "Pickering Mango", + "Picual Olive", + "Pigeon Pea", + "Pigeon Plum", + "Pigface Fruit", + "Pineapple", + "Pineberry", + "Pink Banana", + "Pink Lady Apple", + "Pink Lemonade Blueberry", + "Pink Pearl Apple", + "Pinot Noir Grape", + "Pinova Apple", + "Pitaya", + "Plantain", + "Plum", + "Plumcot", + "Pluot", + "Pomato Fruit", + "Pomegranate", + "Pomelo", + "Ponderosa Lemon", + "Ponkan Fruit", + "Poorman Orange", + "Prickly Pear", + "Prime Ark Freedom Blackberry", + "Prune", + "Pulasan", + "Pummelo", + "Purple Mangosteen", + "Quandong", + "Quararibea Cordata", + "Queen Anne’s Cherry", + "Queen Tahiti Pineapple", + "Queen’s Forelle Pear", + "Quenepa", + "Querina Apple", + "Quinault Strawberry", + "Quince", + "Raisin", + "Rajka Apple", + "Rambai", + "Rambutan", + "Ramontchi", + "Rangpur Lime", + "Raspberry", + "Raspuri Mango", + "Rata", + "Red Banana", + "Red Bayberry", + "Red Delicious Apple", + "Red Grape", + "Red Huckleberry", + "Red Mombin", + "Red Mulberry", + "Redcurrant", + "Rhobs El Arsa", + "Rhubarb", + "Riberry", + "Rocha Pear", + "Rockmelon", + "Rollinia", + "Rombo", + "Rose Apple", + "Rose Hip", + "Roselle", + "Rosigold Mango", + "Rough Lemon", + "Rubus Parviflorus", + "Rumdul", + "Safou", + "Saigon Mango", + "Salak", + "Salak ", + "Salal", + "Salal Berry", + "Salmonberry", + "Sand Cherry", + "Santol", + "Sapodilla", + "Sapote", + "Sarvisberry", + "Sassafras", + "Satsuma", + "Sea Buckthorn", + "Seagrape", + "Serviceberry", + "Seville Orange", + "Sharon ", + "Shine Muscat", + "Shonan Gold", + "Silky Oak Apple", + "Sloe", + "Snake Fruit", + "Soncoya ", + "Sour Cherry", + "Soursop", + "Spanish Lime", + "Spanish Tamarind", + "Splendor Apple", + "Star Apple", + "Starfruit", + "Strawberry Guava", + "Stinking Bishop Pear", + "Strawberry", + "Strawberry Guava", + "Sugar Apple", + "Sugar Baby Watermelon ", + "Sugar Palm", + "Sultana", + "Sumo Orange", + "Sunda Plum", + "Surinam Cherry", + "Sweet Dakota Rose Watermelon", + "Sweet Lime", + "Sweet Pepper", + "Tachibana Orange", + "Tamarillo", + "Tamarind", + "Tangelo", + "Tangerillo", + "Tangerine", + "Tangerinequat", + "Tangor", + "Tarap", + "Tarpan Strawberry", + "Tart Cherry", + "Tawa-Tawa", + "Tayberry", + "Tepin Pepper", + "Terap", + "Texas Persimmon", + "Thimbleberry", + "Thorn Apple", + "Thornberry", + "Thornless Blackberry", + "Thornless Loganberry", + "Thumbelina Apple", + "Tieguanyin", + "Tindora", + "Tomato", + "Tomato Berry", + "Tomato Cherry", + "Tomato Plum", + "Tompkins King Apple", + "Topaz Apple", + "Toronja", + "Torpedo Melon", + "Totapuri Mango", + "Tree Tomato", + "Tropical Apricot", + "Tucuma", + "Tuna Fruit", + "Tung Berry", + "Tungfruit", + "Ububese", + "Udara", + "Ugli Fruit", + "Ugni", + "Ugni Blanc Grape", + "Ugni Molinae", + "Ukranian Heart Tomato", + "Ula", + "Umari", + "Umbrafruit", + "Umbrella Squash", + "Umbu", + "Ume", + "Ume Plums", + "Urava", + "Usakhelauri", + "Usama", + "Utu", + "Uva Rara Grape", + "Uva Tosca Grape", + "Uvalino Grape", + "Uvaria", + "Uvilla", + "Vaccarese Grape", + "Valencia Orange Fruit", + "Valencia Pride Mango", + "Van Dyke Mango", + "Vanilla Fruit", + "Velvet Apple", + "Velvet Tamarind", + "Vernaccia Grape", + "Vespolina Grape", + "Vicar Of Winkfield Pear", + "Victoria Plum", + "Vitis Vinifera", + "Voavanga", + "Volkamer Lemon", + "Water Apple", + "Watermelon", + "Wax Gourd", + "White Aspen Fruit", + "White Currant", + "White Mulberry", + "White Sapote", + "Wintermelon", + "Wolf Berry", + "Wood Apple", + "Xanthium", + "Xaoy", + "Xarel·lo", + "Xiangjiao", + "Xigua", + "Xilacayota Squash", + "Ximenia", + "Xing Zi", + "Xinomavro", + "Xoài", + "Xoconostle", + "Xylocarpus Granatum", + "Yaca", + "Yali Pear", + "Yangmei Fruit", + "Yellow Dragon Fruit", + "Yellow Grape", + "Yellow Guava", + "Yellow Himalayan Raspberry", + "Yellow Passion Fruit", + "Yellow Pear Tomato", + "Yellow Plum", + "Yellow Sapote", + "Yellow Squash", + "Yellow Watermelon", + "Yemenite Citron", + "York Imperial Apple", + "Young Mango", + "Youngberry", + "Yumberry", + "Yunnan Hackberry Fruit", + "Yuzu", + "Zabergay Reinette Apple", + "Zalzalak", + "Zante Currant", + "Zarzamora", + "Zawngtah", + "Zebra Melon", + "Zhe Fruit", + "Ziga Zag Tree Vine", + "Zinfandel Grape", + "Ziziphus Jujube Fruit", + "Zucchini", + "Zwetschge" + ]; Random fruitChooser; Random sizeChooser; -} +} \ No newline at end of file diff --git a/src/Helper/Helper.csproj b/src/Helper/Helper.csproj index ab39c46..ef20e9b 100644 --- a/src/Helper/Helper.csproj +++ b/src/Helper/Helper.csproj @@ -7,9 +7,9 @@ - - - + + + \ No newline at end of file diff --git a/src/Sales/Sales.csproj b/src/Sales/Sales.csproj index 0f55fd3..855ec52 100644 --- a/src/Sales/Sales.csproj +++ b/src/Sales/Sales.csproj @@ -9,9 +9,9 @@ - - - + + + diff --git a/src/Shipping/Shipping.csproj b/src/Shipping/Shipping.csproj index 75ada8a..098372f 100644 --- a/src/Shipping/Shipping.csproj +++ b/src/Shipping/Shipping.csproj @@ -18,9 +18,9 @@ - - - + + + diff --git a/src/docker-compose-base.yml b/src/docker-compose-base.yml index 811bbe7..130dc75 100644 --- a/src/docker-compose-base.yml +++ b/src/docker-compose-base.yml @@ -3,6 +3,7 @@ services: profiles: ['', infrastructure] container_name: servicecontrol-db image: particular/servicecontrol-ravendb:latest + pull_policy: always volumes: - sc-data:/var/lib/ravendb/data service-control: @@ -12,6 +13,7 @@ services: condition: service_healthy container_name: servicecontrol image: particular/servicecontrol:latest + pull_policy: always command: "--setup-and-run" ports: - 33333:33333 @@ -28,6 +30,7 @@ services: condition: service_healthy container_name: masstransit-connector image: particular/servicecontrol-masstransit-connector:latest + pull_policy: always volumes: - ./queues.txt:/app/queues.txt:ro environment: @@ -40,6 +43,7 @@ services: condition: service_healthy container_name: servicepulse image: particular/servicepulse:latest + pull_policy: always ports: - 9090:9090 environment: diff --git a/src/frontend/src/App.vue b/src/frontend/src/App.vue index df1da21..68fb6c1 100644 --- a/src/frontend/src/App.vue +++ b/src/frontend/src/App.vue @@ -5,6 +5,7 @@ import SalesEndpoint from "./components/SalesEndpoint.vue"; import ShippingEndpoint from "./components/ShippingEndpoint.vue"; import TryItOut from "./components/guideline/TryItOut.vue"; import FloatingButton from "./components/FloatingButton.vue"; +import FloatingContainer from "./components/FloatingContainer.vue"; import { ref } from "vue"; import { store } from "./components/shared"; @@ -33,12 +34,6 @@ const tab = ref("showcase");

Simulating customers placing orders on a website

-
- Thanks for trying our showcase. - - Get your free eBook now! - -
@@ -48,10 +43,18 @@ const tab = ref("showcase");
- + + + +
diff --git a/src/frontend/src/components/BillingEndpoint.vue b/src/frontend/src/components/BillingEndpoint.vue index ff08e99..7705b5e 100644 --- a/src/frontend/src/components/BillingEndpoint.vue +++ b/src/frontend/src/components/BillingEndpoint.vue @@ -128,7 +128,7 @@ function toggleFailOnRetries() { target="_blank" :href="`http://localhost:9090/#/failed-messages/message/${message.messageViewId}`" > - View failure in ServicePulse + View failure details