创建一个 Camel 路由,将一个值发送到 REST,将一个不同的值发送到另一个骆驼组件?

时间:2021-02-18 15:44:18

标签: apache-camel

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 响应。

我怎样才能做到这一点?

1 个答案:

答案 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 组件。我还没有解决。但至少窃听方法是我用例的答案。