我有一个ASP.NET Core应用程序,我想使用RabbitMQ消息。
我已成功在命令行应用程序中设置发布者和使用者,但我不确定如何在Web应用程序中正确设置它。
我在考虑在Startup.cs
初始化它,但当然一旦启动完成它就会死掉。
如何以正确的方式从网络应用初始化消费者?
答案 0 :(得分:26)
使用Singleton模式为使用者/侦听器在应用程序运行时保留它。使用IApplicationLifetime
界面在应用程序启动/停止时启动/停止使用者。
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<RabbitListener>();
}
public void Configure(IApplicationBuilder app)
{
app.UseRabbitListener();
}
}
public static class ApplicationBuilderExtentions
{
//the simplest way to store a single long-living object, just for example.
private static RabbitListener _listener { get; set; }
public static IApplicationBuilder UseRabbitListener(this IApplicationBuilder app)
{
_listener = app.ApplicationServices.GetService<RabbitListener>();
var lifetime = app.ApplicationServices.GetService<IApplicationLifetime>();
lifetime.ApplicationStarted.Register(OnStarted);
//press Ctrl+C to reproduce if your app runs in Kestrel as a console app
lifetime.ApplicationStopping.Register(OnStopping);
return app;
}
private static void OnStarted()
{
_listener.Register();
}
private static void OnStopping()
{
_listener.Deregister();
}
}
答案 1 :(得分:7)
这是我的听众:
library(tidyverse)
library(shiny)
library(RColorBrewer)
library(plotly)
read_csv("https://github.com/JonMinton/housing_tenure_explorer/blob/master/data/FRS%20HBAI%20-%20tables%20v1.csv?raw=true") %>%
#read_csv("data/FRS HBAI - tables v1.csv") %>%
select(
region = regname, year = yearcode, age = age2, tenure = tenurename, n = N_ten4s, N = N_all2
) %>%
mutate(
proportion = n / N
) -> dta
regions <- unique(dta$region)
tenure_types <- unique(dta$tenure)
# Define UI for application that draws a histogram
ui <- fluidPage(
# Application title
titlePanel("Minimal example"),
# Sidebar with a slider input for number of bins
sidebarLayout(
sidebarPanel(
sliderInput("bins",
"Number of bins:",
min = 1,
max = 50,
value = 30)
),
# Show a plot of the generated distribution
mainPanel(
plotlyOutput("3d_surface_overlaid"),
verbatimTextOutput("selection")
)
),
tags$script('
document.getElementById("3d_surface_overlaid").onclick = function() {
var content = document.getElementsByClassName("nums")[0].getAttribute("data-unformatted");
Shiny.onInputChange("tooltip_content", content);
};
')
)
# Define server logic required to draw a histogram
server <- function(input, output) {
output$`3d_surface_overlaid` <- renderPlotly({
# Start with a fixed example
matrixify <- function(X, colname){
tmp <- X %>%
select(year, age, !!colname)
tmp %>% spread(age, !!colname) -> tmp
years <- pull(tmp, year)
tmp <- tmp %>% select(-year)
ages <- as.numeric(names(tmp))
mtrx <- as.matrix(tmp)
return(list(ages = ages, years = years, vals = mtrx))
}
dta_ss <- dta %>%
filter(region == "UK") %>%
select(year, age, tenure, proportion)
surface_oo <- dta_ss %>%
filter(tenure == "Owner occupier") %>%
matrixify("proportion")
surface_sr <- dta_ss %>%
filter(tenure == "Social rent") %>%
matrixify("proportion")
surface_pr <- dta_ss %>%
filter(tenure == "Private rent") %>%
matrixify("proportion")
surface_rf <- dta_ss %>%
filter(tenure == "Care of/rent free") %>%
matrixify("proportion")
tooltip_oo <- surface_oo
tooltip_sr <- surface_sr
tooltip_pr <- surface_pr
tooltip_rf <- surface_rf
custom_text <- paste0(
"Year: ", rep(tooltip_oo$years, times = length(tooltip_oo$ages)), "\t",
"Age: ", rep(tooltip_oo$ages, each = length(tooltip_oo$years)), "\n",
"Composition: ",
"OO: ", round(tooltip_oo$vals, 2), "; ",
"SR: ", round(tooltip_sr$vals, 2), "; ",
"PR: ", round(tooltip_pr$vals, 2), "; ",
"Other: ", round(tooltip_rf$vals, 2)
) %>%
matrix(length(tooltip_oo$years), length(tooltip_oo$ages))
custom_oo <- paste0(
"Owner occupation: ", 100 * round(tooltip_oo$vals, 3), " percent\n",
custom_text
) %>%
matrix(length(tooltip_oo$years), length(tooltip_oo$ages))
custom_sr <- paste0(
"Social rented: ", 100 * round(tooltip_sr$vals, 3), " percent\n",
custom_text
) %>%
matrix(length(tooltip_oo$years), length(tooltip_oo$ages))
custom_pr <- paste0(
"Private rented: ", 100 * round(tooltip_pr$vals, 3), " percent\n",
custom_text
) %>%
matrix(length(tooltip_oo$years), length(tooltip_oo$ages))
custom_rf <- paste0(
"Other: ", 100 * round(tooltip_rf$vals, 3), " percent\n",
custom_text
) %>%
matrix(length(tooltip_oo$years), length(tooltip_oo$ages))
n_years <- length(surface_oo$years)
n_ages <- length(surface_oo$ages)
plot_ly(
showscale = F
) %>%
add_surface(
x = ~surface_oo$ages, y = ~surface_oo$years, z = surface_oo$vals,
name = "Owner Occupiers",
opacity = 0.7,
colorscale = list(
c(0,1),
c('rgb(255,255,0)' , 'rgb(255,255,0)')
),
hoverinfo = "text",
text = custom_oo
) %>%
add_surface(
x = ~surface_sr$ages, y = ~surface_sr$years, z = surface_sr$vals,
name = "Social renters",
opacity = 0.7,
colorscale = list(
c(0,1),
c('rgb(255,0,0)' , 'rgb(255,0,0)')
),
hoverinfo = "text",
text = custom_sr
) %>%
add_surface(
x = ~surface_pr$ages, y = ~surface_pr$years, z = surface_pr$vals,
name = "Private renters",
opacity = 0.7,
colorscale = list(
c(0,1),
c('rgb(0,255,0)' , 'rgb(0,255,0)')
),
hoverinfo = "text",
text = custom_pr
) %>%
add_surface(
x = ~surface_rf$ages, y = ~surface_rf$years, z = surface_rf$vals,
name = "Other",
opacity = 0.7,
colorscale = list(
c(0,1),
c('rgb(0,0,255)' , 'rgb(0,0,255)')
),
hoverinfo = "text",
text = custom_rf
) %>%
layout(
scene = list(
aspectratio = list(
x = n_ages / n_years, y = 1, z = 0.5
),
xaxis = list(
title = "Age in years"
),
yaxis = list(
title = "Year"
),
zaxis = list(
title = "Proportion"
),
showlegend = FALSE
) )
})
output$selection <- renderPrint({
input$tooltip_content
})
}
# Run the application
shinyApp(ui = ui, server = server)