10:39
我想创建一个路由,通过 REST 向用户返回 JSON 响应,然后将数据发送到 BigQuery。类似的东西:
rest()
.get("/getSchedule")
.route()
.process("business logic - creates object with schedule AND big query statement")
问题是这是两种不同的东西。为了使 REST 响应正确,我必须将带有时间表的对象放入交换正文中。但是为了将 BigQuery 语句发送到 BigQuery 组件,我必须将 BQ 语句设置到交换对象中。这会弄乱 REST 响应。
我怎样才能做到这一点?
答案 0 :(得分:0)
好的,我想通了。我想要的是一个立即返回 REST 响应并将其他一些数据发送到 BigQuery 的解决方案。由于第二步可能会阻塞,我将在两者之间放置一个异步进程(可能是一个队列,但在我的情况下是 Google PubSub)。我的路线看起来像这样(为了清楚起见,省略了 .consumes、.outTypes 之类的内容):
rest()
.get("/getSchedule")
.route()
.processor(<business_logic>)
.wiretap("direct:pubsub");
from("direct:pubsub")
.process("processorA")
.to("google-pubsub topic");
from("google-pubsub subscription")
.processor("processorB")
.to("google-bigquery");
具有业务逻辑的第一个处理器计算所需的调度数据,将其放入 POJO,并将 bigquery 语句放入名为“event”的交换标头中。
@Override
public void process(Exchange exchange)
{
<business logic>
ScheduleData sData = new ScheduleData();
<insert values>
exchange.getIn().setBody(sData)
String insertStatement = "<insert_stmt>"
exchange.getIn().setHeader("event",insertStatement )
}
ScheduleData 数据成为我想要的响应。现在 ProcessorA 在我们将数据放入主题之前做了一些必要的工作:
@Override
public void process(Exchange exchange)
{
String stmt = (String)exchange.getIn().getHeader("event")
byte[] data = <convert "stmt" into UTF8 bytes>
exchange.getIn().setBody(data);
}
现在 BigQuery 数据通过 PubSub 发送,由 Camel 接收,然后发送到 ProcessorB。
public void process(Exchange exchange)
{
byte[] data = exchange.getIn().getBody(byte[].class)
String stmt = <convert UTF8 bytes to string>
exchange.getIn().setBody(stmt);
将语句放回交换正文中,现在可以将其发送到 BiqQuery 组件。我还没有解决。但至少窃听方法是我用例的答案。