如何使用OrmLite将ServiceStack.Messaging.Message记录到数据库?

时间:2014-10-27 01:47:27

标签: servicestack ormlite-servicestack

给出以下代码:

public class AppHost : BasicAppHost
{
    public AppHost()
        : base(typeof(LeadService).Assembly){}

    public override void Configure(Container container)
    {
        SetConfig(new HostConfig
        {
            DebugMode = ConfigUtils.GetAppSetting<bool>("DebugMode:Enabled", false)
        });

        //DataAccess
        //Set ORMLite to work with columns like ColumnLikeThis
        PostgreSqlDialect.Provider.NamingStrategy = new OrmLiteNamingStrategyBase();
        //Set ORMLite to use ServiceStack.Text for JSON serialization 
        PostgreSqlDialect.Provider.StringSerializer = new JsonStringSerializer();
        var dbFactory = new OrmLiteConnectionFactory(ConfigUtils.GetConnectionString("Lead:Default"), PostgreSQLDialectProvider.Instance);
        container.Register<IDbConnectionFactory>(dbFactory);

        //RabbitMQ
        container.Register<IMessageService>(c => new RabbitMqServer() 
        {
            AutoReconnect = true,
            DisablePriorityQueues = true,

        });
        var mqServer = container.Resolve<IMessageService>();

        //Handlers
        container.Register<IMessageHandlers>(c => new MessageHandlers(c.Resolve<IDbConnectionFactory>()));
        var handlers = container.Resolve<IMessageHandlers>();

        mqServer.RegisterHandler<LeadInformation>(handlers.OnProcessLeadInformation, handlers.OnExceptionLeadInformation);

        mqServer.Start();       
    }
}


public class MessageHandlers : IMessageHandlers
{
    private readonly ILog _log = LogManager.GetLogger(typeof(MessageHandlers));

    private readonly IDbConnectionFactory _connectionFactory; 

    public MessageHandlers(IDbConnectionFactory connectionFactory)
    {
        _connectionFactory = connectionFactory;
    }

    public object OnProcessLeadInformation(IMessage<LeadInformation> request)
    {
        var sw = Stopwatch.StartNew();
        try
        {
            // Log to the database
            using (var db = _connectionFactory.OpenDbConnection())
            {
                db.CreateTableIfNotExists<Message>();
                var msg = request as Message<LeadInformation>; // Anyway not to have to cast it?
                db.Save(msg); // Does not work
            }
            // Run rules against lead

            // Log response to database

            // return response
        }
        catch (Exception exception)
        {
            _log.Error(request, exception);
        }
        return new LeadInformationResponse
        {
            TimeTakenMs = sw.ElapsedMilliseconds,
            Result = "Processed lead {0}".Fmt(request.GetBody().LeadApplication.LastName)
        };
    }

    public void OnExceptionLeadInformation(IMessage<LeadInformation> request, Exception exception)
    {
        _log.Error(request, exception);
    }

}

是否有可能坚持整个信息?该表已创建,我可以保存一条消息,而且不再使用不同的消息进行保存。

更新

原来我在保存操作期间遇到异常

发现了Npgsql.NpgsqlException   _HResult = -2147467259   _message =错误:42P01:关系“消息1" does not exist HResult=-2147467259 IsTransient=false Message=ERROR: 42P01: relation "Message 1”不存在   来源Npgsql的=   错误码= -2147467259   BaseMessage = relation“Message 1" does not exist Code=42P01 ColumnName="" ConstraintName="" DataTypeName="" Detail="" ErrorSql=SELECT "Id", "CreatedDate", "Priority", "RetryAttempts", "ReplyId", "ReplyTo", "Options", "Error", "Tag", "Body" FROM "Message 1”WHERE“Id”=(('ab297bca-5aea-4886-b09b-5a606b0764d5'):: uuid)   文件= SRC \后端\解析器\ parse_relation.c   提示=“”   行= 986   位置= 119   常规= parserOpenTable   的SchemaName = “”   严重性=错误   表名=“”   凡=“”   堆栈跟踪:        在Npgsql.NpgsqlState.d__0.MoveNext()        在Npgsql.ForwardsOnlyDataReader.GetNextResponseObject(布尔清理)        在Npgsql.ForwardsOnlyDataReader.GetNextRowDescription()        在Npgsql.ForwardsOnlyDataReader.NextResultInternal()        在Npgsql.ForwardsOnlyDataReader..ctor(IEnumerable 1 dataEnumeration, CommandBehavior behavior, NpgsqlCommand command, NotificationThreadBlock threadBlock, Boolean preparedStatement, NpgsqlRowDescription rowDescription) at Npgsql.NpgsqlCommand.GetReader(CommandBehavior cb) at Npgsql.NpgsqlCommand.ExecuteReader(CommandBehavior cb) at Npgsql.NpgsqlCommand.ExecuteDbDataReader(CommandBehavior behavior) at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader() at ServiceStack.OrmLite.OrmLiteReadExtensions.ExecReader(IDbCommand dbCmd, String sql) at ServiceStack.OrmLite.OrmLiteResultsFilterExtensions.ConvertTo[T](IDbCommand dbCmd, String sql) at ServiceStack.OrmLite.OrmLiteReadExtensions.SingleById[T](IDbCommand dbCmd, Object value) at ServiceStack.OrmLite.OrmLiteWriteExtensions.Save[T](IDbCommand dbCmd, T obj) at ServiceStack.OrmLite.OrmLiteWriteConnectionExtensions.<>c__DisplayClass5a 1.b__58(IDbCommand dbCmd)        在ServiceStack.OrmLite.OrmLiteExecFilter.Exec [T](IDbConnection dbConn,Func 2 filter) at ServiceStack.OrmLite.ReadConnectionExtensions.Exec[T](IDbConnection dbConn, Func 2过滤器)        at ServiceStack.OrmLite.OrmLiteWriteConnectionExtensions.Save [T](IDbConnection dbConn,T obj,Boolean references)        位于e:\ Lead \ src \ LO.Leads.Processor \ LO.Leads.Processor.ServiceInterface \ MessageHandlers.cs:第41行的LO.Leads.Processor.ServiceInterface.MessageHandlers.OnProcessLeadInformation(IMessage`1请求)

更新2

原来我的演员是错的,这现在有效了

using (var db = _connectionFactory.OpenDbConnection())
{
    db.CreateTableIfNotExists<Message>();
    db.Save(request as Message);
}

谢谢你, 斯蒂芬

1 个答案:

答案 0 :(得分:2)

您必须将IMessage强制转换回Message DTO才能使其正常工作。 e.g。

using (var db = _connectionFactory.OpenDbConnection())
{
    db.CreateTableIfNotExists<Message>();
    db.Save(request as Message);
}