Skip to content

Commit

Permalink
Merge pull request #18 from natemcmaster/dotnet
Browse files Browse the repository at this point in the history
Implement worker as a .NET Core app
  • Loading branch information
bfirsh committed Jun 13, 2016
2 parents 6562cee + e548968 commit f029fcc
Show file tree
Hide file tree
Showing 6 changed files with 149 additions and 200 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,4 @@
*.pyc
project.lock.json
bin/
obj/
22 changes: 7 additions & 15 deletions worker/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,19 +1,11 @@
FROM java:openjdk-8-jdk-alpine
FROM microsoft/dotnet:1.0.0-preview1

RUN MAVEN_VERSION=3.3.3 \
&& cd /usr/share \
&& wget http://archive.apache.org/dist/maven/maven-3/$MAVEN_VERSION/binaries/apache-maven-$MAVEN_VERSION-bin.tar.gz -O - | tar xzf - \
&& mv /usr/share/apache-maven-$MAVEN_VERSION /usr/share/maven \
&& ln -s /usr/share/maven/bin/mvn /usr/bin/mvn
WORKDIR /app

WORKDIR /code
ADD src/ /app/src/

ADD pom.xml /code/pom.xml
RUN ["mvn", "dependency:resolve"]
RUN ["mvn", "verify"]
RUN dotnet restore -v minimal src/ \
&& dotnet publish -c Release -o ./ src/Worker/ \
&& rm -rf src/ $HOME/.nuget/

# Adding source, compile and package into a fat jar
ADD src /code/src
RUN ["mvn", "package"]

CMD ["java", "-jar", "target/worker-jar-with-dependencies.jar"]
CMD dotnet Worker.dll
84 changes: 0 additions & 84 deletions worker/pom.xml

This file was deleted.

115 changes: 115 additions & 0 deletions worker/src/Worker/Program.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
using System;
using System.Data.Common;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using Newtonsoft.Json;
using Npgsql;
using StackExchange.Redis;

namespace Worker
{
public class Program
{
public static int Main(string[] args)
{
try
{
var pgsql = OpenDbConnection("Server=db;Username=postgres;");
var redis = OpenRedisConnection("redis").GetDatabase();

var definition = new { vote = "", voter_id = "" };
while (true)
{
string json = redis.ListLeftPopAsync("votes").Result;
if (json != null)
{
var vote = JsonConvert.DeserializeAnonymousType(json, definition);
Console.WriteLine($"Processing vote for '{vote.vote}' by '{vote.voter_id}'");
UpdateVote(pgsql, vote.voter_id, vote.vote);
}
}
}
catch (Exception ex)
{
Console.Error.WriteLine(ex.ToString());
return 1;
}
}

private static NpgsqlConnection OpenDbConnection(string connectionString)
{
var connection = new NpgsqlConnection(connectionString);
while (true)
{
try
{
connection.Open();
break;
}
catch (DbException)
{
Console.Error.WriteLine("Failed to connect to db - retrying");
}
}

var command = connection.CreateCommand();
command.CommandText = @"CREATE TABLE IF NOT EXISTS votes (
id VARCHAR(255) NOT NULL UNIQUE,
vote VARCHAR(255) NOT NULL
)";
command.ExecuteNonQuery();

return connection;
}

private static ConnectionMultiplexer OpenRedisConnection(string hostname)
{
// Use IP address to workaround hhttps://github.com/StackExchange/StackExchange.Redis/issues/410
var ipAddress = GetIp(hostname);
Console.WriteLine($"Found redis at {ipAddress}");

while (true)
{
try
{
return ConnectionMultiplexer.Connect(ipAddress);
}
catch (RedisConnectionException)
{
Console.Error.WriteLine("Failed to connect to redis - retrying");
Thread.Sleep(1000);
}
}
}

private static string GetIp(string hostname)
=> Dns.GetHostEntryAsync(hostname)
.Result
.AddressList
.First(a => a.AddressFamily == AddressFamily.InterNetwork)
.ToString();

private static void UpdateVote(NpgsqlConnection connection, string voterId, string vote)
{
var command = connection.CreateCommand();
try
{
command.CommandText = "INSERT INTO votes (id, vote) VALUES (@id, @vote)";
command.Parameters.AddWithValue("@id", voterId);
command.Parameters.AddWithValue("@vote", vote);
command.ExecuteNonQuery();
}
catch (DbException)
{
command.CommandText = "UPDATE votes SET vote = @vote WHERE id = @id";
command.ExecuteNonQuery();
}
finally
{
command.Dispose();
}
}
}
}
24 changes: 24 additions & 0 deletions worker/src/Worker/project.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
{
"name": "Worker",
"buildOptions": {
"emitEntryPoint": true,
"warningsAsErrors": true
},
"dependencies": {
"StackExchange.Redis": "1.1.604-alpha",
"Npgsql": "3.1.3",
"Newtonsoft.Json": "9.0.1-beta1",
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.0.0-rc2-3002702"
}
},
"frameworks": {
"netcoreapp1.0": { }
},
"runtimeOptions": {
"configProperties": {
"System.GC.Server": true
}
}
}
101 changes: 0 additions & 101 deletions worker/src/main/java/worker/Worker.java

This file was deleted.

0 comments on commit f029fcc

Please sign in to comment.