Riak(Java Client)突然停止创建二级索引

时间:2013-04-30 00:04:39

标签: java scala jackson riak

注意我在Scala中使用Java客户端。 case class注释略有不同。我有以下POJO:

case class User(
  @(JsonProperty@field)("guid")
  @(RiakKey@field)
  val guid: String,

  @(JsonProperty@field)("email")
  @(JsonSerialize@field)(using=classOf[util.serialization.StringToUrlSerializer])
  @(JsonDeserialize@field)(using=classOf[util.serialization.StringToUrlDeserializer])
  @(RiakIndex@field)(name = "email")
  val email: String,

  @(JsonProperty@field)("passwordHash")
  val passwordHash: String
)

突然,Riak停止为我的User存储二级索引。如果我们通过REST客户端使用原始HTTP API,我们仍然可以手动创建二级索引,但在代码中我无法解释它失败的原因。

以下是我们存储Riak Objects的方法:

/**
   * Riak database operations
   */
  val bucketName = "accounts-user"
  val bucket = DB.client.createBucket(bucketName).enableForSearch().execute()
  val converter = {
    val c = new JSONConverter[User](classOf[User], bucketName)
    c.getObjectMapper().registerModule(DefaultScalaModule)
    c
  }

  def store(o: User) = bucket.store(o).withConverter(converter).withRetrier(DB.retrier).execute()

我们正在使用的杰克逊进口如下:

import com.fasterxml.jackson.annotation._
import com.fasterxml.jackson.databind.annotation._

import com.fasterxml.jackson.module.scala._

成功存储对象并且不会抛出错误。问题可能是什么原因?杰克逊的DefaultScalaModule是否可能会干扰注释?仅供参考我尝试删除自定义转换器但它没有解决问题(但是没有删除任何Scala模块导入)。感谢。

修改

可能相关:最近我们开始通过NGINX代理Riak。我是否需要同时执行HTTP和TCP proxy_pass

1 个答案:

答案 0 :(得分:0)

就像我怀疑的那样,使用NGINX进行代理是罪魁祸首。虽然我使用HTTP客户端访问存储桶,但Riak Java客户端实际上使用较低级别(可能是PBC)协议来创建二级索引。不知道为什么它会无声地失败(可能是由于设计)但是一旦我将NGINX从HTTP切换到TCP转发,问题立即得到解决。