我正在尝试使用op-rabbit https://github.com/SpinGo/op-rabbit将我的Scala应用程序连接到RabbitMq。示例代码https://github.com/SpinGo/op-rabbit/blob/master/demo/src/main/scala/demo/Main.scala完全正常。
我想用Intellij的想法来解决这个问题。 IDE在使用代码上产生问题:
channel(qos=3) {
consume(demoQueue) {
body(as[Data]) { data =>
println(s"received ${data}")
ack
}
}
}
我在data =>上收到错误......它说它的类型不匹配
Type mismatch, expected: ::[Data, HNil] => op_rabbit.Handler, actual: Data => op_rabbit.Handler
如果这解决了我试图将注释数据作为无形的HList注释的问题,那么手动注释数据变量绝对是绝对的。
channel(qos=3) {
consume(demoQueue) {
body(as[Data]) { data: HList =>
println(s"received ${data}")
ack
}
}
}
IDE对它很满意......不幸的是编译器不是真的:D :(。就像这样代码不再编译。
有什么想法吗?
Intellij和Scala插件已更新至最新版本。
答案 0 :(得分:3)
好吧,如果IDE抱怨而不是编译器会更好。
data
的类型为Data
而不是HList
或Data :: HNil
channel(qos=3) {
consume(demoQueue) {
body(as[Data]) { (data: Data) =>
println(s"received ${data}")
ack
}
}
}
您应该习惯IDE有时会错误地突出显示Scala中的代码。依赖于路径的类型,隐含,宏等有时太复杂,IDE无法处理。
2017.3 EAP(终极版)Build#IU-173.3302.5正确突出显示以下代码
val directive = body(as[Data])
channel(qos = 3)(
consume(demoQueue)(
directive(data => {
println(s"received ${data}")
ack
})
)
)
答案 1 :(得分:1)
作为短期解决方案,我采用了这种方式:
val handle = (data: Data) => {
println(s"received ${data}")
ack
}
val demoQueue = Queue("demo", durable = false, autoDelete = true)
val subscription = Subscription.run(rabbitControl) {
channel(qos=3) {
consume(demoQueue) /*_*/ {
body(as[Data]) {handle}
}
}
}
我禁用了有问题的块的类型检查。不过我想在我的处理代码中进行类型检查。我把那部分移到了句柄功能上。这样IDE就会检查句柄功能。使用/ * _ * /,您可以禁用对代码特定部分的类型检查。
仍然希望有更好的解决方案。