@@ -2,11 +2,22 @@ | |||||
namespace Sample.RabbitMQ.MySql | namespace Sample.RabbitMQ.MySql | ||||
{ | { | ||||
public class Person | |||||
{ | |||||
public int Id { get; set; } | |||||
public string Name { get; set; } | |||||
} | |||||
public class AppDbContext : DbContext | public class AppDbContext : DbContext | ||||
{ | { | ||||
public const string ConnectionString = "Server=192.168.10.110;Database=testcap;UserId=root;Password=123123;IgnoreCommandTransaction=true;"; | |||||
public DbSet<Person> Persons { get; set; } | |||||
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) | protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) | ||||
{ | { | ||||
optionsBuilder.UseMySql("Server=192.168.10.110;Database=testcap;UserId=root;Password=123123;"); | |||||
optionsBuilder.UseMySql(ConnectionString); | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -1,5 +1,6 @@ | |||||
using System; | using System; | ||||
using System.Threading.Tasks; | using System.Threading.Tasks; | ||||
using Dapper; | |||||
using DotNetCore.CAP; | using DotNetCore.CAP; | ||||
using Microsoft.AspNetCore.Mvc; | using Microsoft.AspNetCore.Mvc; | ||||
using MySql.Data.MySqlClient; | using MySql.Data.MySqlClient; | ||||
@@ -9,64 +10,68 @@ namespace Sample.RabbitMQ.MySql.Controllers | |||||
[Route("api/[controller]")] | [Route("api/[controller]")] | ||||
public class ValuesController : Controller | public class ValuesController : Controller | ||||
{ | { | ||||
private readonly AppDbContext _dbContext; | |||||
private readonly ICapPublisher _capBus; | private readonly ICapPublisher _capBus; | ||||
public ValuesController(AppDbContext dbContext, ICapPublisher capPublisher) | |||||
public ValuesController(ICapPublisher capPublisher) | |||||
{ | { | ||||
_dbContext = dbContext; | |||||
_capBus = capPublisher; | _capBus = capPublisher; | ||||
} | } | ||||
[Route("~/publish")] | |||||
public IActionResult PublishMessage() | |||||
[Route("~/without/transaction")] | |||||
public IActionResult WithoutTransaction() | |||||
{ | { | ||||
_capBus.Publish("sample.rabbitmq.mysql", DateTime.Now); | _capBus.Publish("sample.rabbitmq.mysql", DateTime.Now); | ||||
return Ok(); | return Ok(); | ||||
} | } | ||||
[Route("~/publish2")] | |||||
public IActionResult PublishMessage2() | |||||
[Route("~/adonet/transaction")] | |||||
public IActionResult AdonetWithTransaction() | |||||
{ | { | ||||
using (var connection = new MySqlConnection("Server=192.168.10.110;Database=testcap;UserId=root;Password=123123;")) | |||||
//NOTE: Add `IgnoreCommandTransaction=true;` to your connection string, see https://github.com/mysql-net/MySqlConnector/issues/474 | |||||
using (var connection = new MySqlConnection(AppDbContext.ConnectionString)) | |||||
{ | { | ||||
using (var transaction = connection.BeginAndJoinToTransaction(_capBus)) | |||||
using (var transaction = connection.BeginAndJoinToTransaction(_capBus, autoCommit: false)) | |||||
{ | { | ||||
//your business code | //your business code | ||||
connection.Execute("insert into test(name) values('test')", transaction); | |||||
_capBus.Publish("sample.rabbitmq.mysql", DateTime.Now); | |||||
for (int i = 0; i < 5; i++) | |||||
{ | |||||
_capBus.Publish("sample.rabbitmq.mysql", DateTime.Now); | |||||
} | |||||
transaction.Commit(); | transaction.Commit(); | ||||
} | } | ||||
} | |||||
} | |||||
return Ok(); | return Ok(); | ||||
} | } | ||||
[Route("~/publishWithTrans")] | |||||
public async Task<IActionResult> PublishMessageWithTransaction() | |||||
[Route("~/ef/transaction")] | |||||
public async Task<IActionResult> EntityFrameworkWithTransaction([FromServices]AppDbContext dbContext) | |||||
{ | { | ||||
using (var trans = await _dbContext.Database.BeginTransactionAsync()) | |||||
using (var capTrans = _capBus.Transaction.Begin(trans)) | |||||
using (var trans = dbContext.Database.BeginAndJoinToTransaction(_capBus, autoCommit: false)) | |||||
{ | { | ||||
for (int i = 0; i < 10; i++) | |||||
dbContext.Persons.Add(new Person() { Name = "ef.transaction" }); | |||||
for (int i = 0; i < 5; i++) | |||||
{ | { | ||||
await _capBus.PublishAsync("sample.rabbitmq.mysql", DateTime.Now); | await _capBus.PublishAsync("sample.rabbitmq.mysql", DateTime.Now); | ||||
} | } | ||||
capTrans.Commit(); | |||||
dbContext.SaveChanges(); | |||||
trans.Commit(); | |||||
} | } | ||||
return Ok(); | return Ok(); | ||||
} | } | ||||
[NonAction] | [NonAction] | ||||
[CapSubscribe("#.rabbitmq.mysql")] | [CapSubscribe("#.rabbitmq.mysql")] | ||||
public void ReceiveMessage(DateTime time) | |||||
public void Subscriber(DateTime time) | |||||
{ | { | ||||
Console.WriteLine("[sample.rabbitmq.mysql] message received: " + DateTime.Now + ",sent time: " + time); | |||||
Console.WriteLine($@"{DateTime.Now}, Subscriber invoked, Sent time:{time}"); | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -0,0 +1,35 @@ | |||||
// <auto-generated /> | |||||
using Microsoft.EntityFrameworkCore; | |||||
using Microsoft.EntityFrameworkCore.Infrastructure; | |||||
using Microsoft.EntityFrameworkCore.Migrations; | |||||
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; | |||||
using Sample.RabbitMQ.MySql; | |||||
namespace Sample.RabbitMQ.MySql.Migrations | |||||
{ | |||||
[DbContext(typeof(AppDbContext))] | |||||
[Migration("20180821021736_init")] | |||||
partial class init | |||||
{ | |||||
protected override void BuildTargetModel(ModelBuilder modelBuilder) | |||||
{ | |||||
#pragma warning disable 612, 618 | |||||
modelBuilder | |||||
.HasAnnotation("ProductVersion", "2.1.1-rtm-30846") | |||||
.HasAnnotation("Relational:MaxIdentifierLength", 64); | |||||
modelBuilder.Entity("Sample.RabbitMQ.MySql.Person", b => | |||||
{ | |||||
b.Property<int>("Id") | |||||
.ValueGeneratedOnAdd(); | |||||
b.Property<string>("Name"); | |||||
b.HasKey("Id"); | |||||
b.ToTable("Persons"); | |||||
}); | |||||
#pragma warning restore 612, 618 | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,30 @@ | |||||
using Microsoft.EntityFrameworkCore.Metadata; | |||||
using Microsoft.EntityFrameworkCore.Migrations; | |||||
namespace Sample.RabbitMQ.MySql.Migrations | |||||
{ | |||||
public partial class init : Migration | |||||
{ | |||||
protected override void Up(MigrationBuilder migrationBuilder) | |||||
{ | |||||
migrationBuilder.CreateTable( | |||||
name: "Persons", | |||||
columns: table => new | |||||
{ | |||||
Id = table.Column<int>(nullable: false) | |||||
.Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), | |||||
Name = table.Column<string>(nullable: true) | |||||
}, | |||||
constraints: table => | |||||
{ | |||||
table.PrimaryKey("PK_Persons", x => x.Id); | |||||
}); | |||||
} | |||||
protected override void Down(MigrationBuilder migrationBuilder) | |||||
{ | |||||
migrationBuilder.DropTable( | |||||
name: "Persons"); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,33 @@ | |||||
// <auto-generated /> | |||||
using Microsoft.EntityFrameworkCore; | |||||
using Microsoft.EntityFrameworkCore.Infrastructure; | |||||
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; | |||||
using Sample.RabbitMQ.MySql; | |||||
namespace Sample.RabbitMQ.MySql.Migrations | |||||
{ | |||||
[DbContext(typeof(AppDbContext))] | |||||
partial class AppDbContextModelSnapshot : ModelSnapshot | |||||
{ | |||||
protected override void BuildModel(ModelBuilder modelBuilder) | |||||
{ | |||||
#pragma warning disable 612, 618 | |||||
modelBuilder | |||||
.HasAnnotation("ProductVersion", "2.1.1-rtm-30846") | |||||
.HasAnnotation("Relational:MaxIdentifierLength", 64); | |||||
modelBuilder.Entity("Sample.RabbitMQ.MySql.Person", b => | |||||
{ | |||||
b.Property<int>("Id") | |||||
.ValueGeneratedOnAdd(); | |||||
b.Property<string>("Name"); | |||||
b.HasKey("Id"); | |||||
b.ToTable("Persons"); | |||||
}); | |||||
#pragma warning restore 612, 618 | |||||
} | |||||
} | |||||
} |