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

标签 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 被捕获 _H结果=-2147467259 _message=错误:42P01:关系“消息1" does not exist HResult=-2147467259 IsTransient=false Message=ERROR: 42P01: relation "Message1”不存在 来源=Npgsql 错误代码=-2147467259 BaseMessage=关系“消息1" does not exist Code=42P01 ColumnName="" ConstraintName="" DataTypeName="" Detail="" ErrorSql=SELECT "Id", "CreatedDate", "Priority", "RetryAttempts", "ReplyId", "ReplyTo", "Options", "Error", "Tag", "Body" FROM "Message1”其中“Id”=(('ab297bca-5aea-4886-b09b-5a606b0764d5')::uuid) 文件=src\backend\parser\parse_relation.c 提示=“” 线路=986 位置=119 例程=parserOpenTable 模式名称=“” 严重性=错误 表名=“” 哪里=“” 堆栈跟踪: 在 Npgsql.NpgsqlState.d__0.MoveNext() 在 Npgsql.ForwardsOnlyDataReader.GetNextResponseObject( bool 清理) 在 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 过滤器) 在 ServiceStack.OrmLite.OrmLiteWriteConnectionExtensions.Save[T](IDbConnection dbConn,T obj, bool 引用) 在 e:\Leads.Processor.ServiceInterface.MessageHandlers.OnProcessLeadInformation(IMessage`1 request) 中 e:\Lead\src\LO.Leads.Processor\LO.Leads.Processor.ServiceInterface\MessageHandlers.cs:第 41 行

更新2

原来我的 Actor 阵容是错误的,现在可以了

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

谢谢你, 斯蒂芬

最佳答案

您必须将 IMessage 转换回 Message DTO 才能使其正常工作。例如

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

关于servicestack - 如何使用 OrmLite 将 ServiceStack.Messaging.Message 记录到数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26580061/

相关文章:

c# - 使用 ServiceStack.Text 将 json 字符串反序列化为对象

json - ServiceStack.Text JSON 反序列化

升级后 ServiceStack ORMLite 编码问题

servicestack - 解析 MVC Controller 中的 ServiceStack 服务

c# - 如何在 ServiceStack.OrmLite 中自定义复杂类型的序列化/反序列化

razor - 如何防止 ServiceStack Razor 对我的 HTML 进行编码?

c# - 如何将 ormlite 与 SQL Server 和 Mars 一起使用?

sql-server - ServiceStack Ormlite 服务之间的事务

c# - OrmLite.SqlServer 程序集出错

mysql - 如何在ServiceStack OrmLite中随机排序?