Introduction

I needed a way to let my users know when something new arrived. For this I need to check an external system. The only way to do this is to pole the existing system every so often. I could easily do this on the clients, but this would create a lot of traffic if you had lots of clients. I decided have my server do the polling and then let the clients know when something new has arrived.

The best way I have found to this was to use [Quartz.Net][1] and SignalR.

The server

To start you can make an empty ASP.Net project.

Normally you would make a service to something like this. But I kinda need my webserver for the SignalR part. But Quartz.Net can deal with this.

First thing to do is to make our Quartz.Net Job.

Option Strict Off

Imports Microsoft.AspNet.SignalR
Imports Quartz
Imports Dapper

Namespace Server

    Public Class NewCases
        Implements IJob
        
        Private ReadOnly _context As Object

        Public Sub New()
            _context = GlobalHost.ConnectionManager.GetHubContext(Of Server.BeCare)()
        End Sub

        Public Sub Execute(context As IJobExecutionContext) Implements IJob.Execute
            Try
                Using con = New SqlConnection("connectionstring")
                    dim newCases = con.Query(Of String)("select * from newcases where status = 'new'").ToList
                    If newCases.Count > 0 Then
                      _context.Clients.All.newCases(newCases)
                    End If 
                End Using
            Catch ex As Exception
                _context.Clients.All.newCases(New List(Of String) From {ex.Message})
            End Try
        End Sub

    End Class
End Namespace```
I’m using dapper to get my data and I’m using the globalhost to get the context for SignalR so I can send a message to all my clients whenever there are new cases available.

Now I just have to schedule this.

I can do the configuration in code in the Global.asax

```vbnet
Private Shared _scheduler As IScheduler

    Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
        RouteTable.Routes.MapHubs()

        Dim factory = New StdSchedulerFactory()
        _scheduler = factory.GetScheduler()
        Dim startTime = DateBuilder.NextGivenSecondDate(Nothing, 10)
        Dim job = JobBuilder.Create(Of NewCases)().WithIdentity("job6", "group1").Build()

        Dim trigger As ISimpleTrigger = TriggerBuilder.Create().WithIdentity("trigger6", "group1").StartAt(startTime).WithSimpleSchedule(Function(x) x.WithIntervalInSeconds(5).RepeatForever()).Build()

        _scheduler.ScheduleJob(job, trigger)
        _scheduler.Start()
    End Sub```
SO I create a scheduler, then a job and a trigger and add those to the scheduler after which I can Start the scheduler. I made a trigger with an interval of 5 seconds here. And I made it start 10 seconds after our application starts.

I also made a Hub so that our clients have something to connect to.

```vbnet
Option Strict Off

Imports Microsoft.AspNet.SignalR.Hubs
Imports System.Data.SqlClient
Imports Dapper

Namespace Server
    Public Class BeCare
        Inherits Hub

        Public Sub Refresh()
            Try
                Using con = New SqlConnection("connectionstring")
                    Dim newCases = con.Query(Of String)("select * from newcases where status = 'new'").ToList
                    If newCases.Count > 0 Then
                        Clients.All.newCases(newCases)
                    End If
                End Using
            Catch ex As Exception
                Clients.All.newCases(New List(Of String) From {ex.Message})
            End Try
        End Sub
        
    End Class
End Namespace```


## The client

I made a basic client to test if this works.

```vbnet
Dim connection = New HubConnection("http://localhost:54155/")

        Dim becare= connection.CreateHubProxy("BeCare")

        becare.On(Of IList(Of String))("newCases", Sub(data)
                                                       If data IsNot Nothing Then
                                                           Console.WriteLine(DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss") & " - Found " & data.Count & " new cases.")
                                                           For Each s In data
                                                               Console.WriteLine(s)
                                                           Next
                                                       Else
                                                           Console.WriteLine("No records found")
                                                       End If
                                                   End Sub)

        connection.Start().Wait()

        Dim line As String = Nothing
        Console.WriteLine("type exit + enter to exit.")
        While line <> "exit"
            line = Console.ReadLine()
        End While```
And that’s it.

 [1]: http://www.quartz-scheduler.net/