流量中意外的交替端点

时间:2017-03-02 05:30:25

标签: spring-integration

我有一个类似于

的流程
IntegrationFlows.from(
    Http.inboundGateway("/events")
        .requestMapping(requestMappingSpec -> {
            requestMappingSpec.methods(HttpMethod.POST);
            requestMappingSpec.consumes(MediaType.APPLICATION_JSON_VALUE);
            requestMappingSpec.produces(MediaType.APPLICATION_JSON_VALUE);
        })
        .requestPayloadType(PushEvent.class)
        .errorChannel(ERROR_CHANNEL))
    .channel(ReleaseFlow.REQUEST_CHANNEL)
    .enrichHeaders(h -> h
        .header(HttpHeaders.STATUS_CODE, HttpStatus.ACCEPTED))
    .get();

提交多个请求时,请求将由附加到REQUEST_CHANNEL的流处理,并且以下请求将仅由enrichedHeaders处理。我的理解是这个例子中的端点应该连续处理......

  1. 请求到达/ events端点
  2. 请求由侦听REQUEST_CHANNEL
  3. 的流处理
  4. 上一个流程的响应将使其标题更加丰富
  5. 流程结束,响应返回到远程请求者
  6. 感谢您帮助理解为什么请求n由通道处理(而不是enrichHeaders()),请求n + 1正在由enrichHeaders()处理(而不是正在侦听REQUEST_CHANNEL的流),请求n + 2由渠道处理(而不是enrichHeaders()),...

    更新1

    我是Spring Integration的新手,但认为从GitHub服务器收集事件然后使用外部服务创建版本是合适的。集成服务将负责根据与提交相关联的数据确定适当的工作流。有问题的端点将接收推送事件并将其转发到附加到可订阅请求信道(REQUEST_CHANNEL)的流。第二个流程将产生许多出站请求以收集适当的发布模板并构建和启动管道。

    更新2

    此时我尚未完全开发第二个流程,但这是第一个版本,它只根据与提交相关的数据执行转换。

    return f -> f
        .route(branchRouter(), mapping -> mapping
            .subFlowMapping(true, t -> t
               .transform(pushEventToEventTransformer()))
            .subFlowMapping(false, n -> n
               .transform(skip -> "")));
    

    当代码已提交给"受监控的"分支将执行第一次更新中描述的操作。鉴于我对框架的了解有限,我试图逐步建立流程。

1 个答案:

答案 0 :(得分:0)

默认情况下,可订阅频道是点对点的,这意味着如果有两个订阅者,则会以循环方式分发消息。

如果你有另一个流程" ...附在REQUEST_CHANNEL"然后你有两个订阅者 - 流量和标题扩充器。

也许如果你可以描述你想要做的事情,我们可以提供帮助。

通道后面的标题更加丰富,所有发生的事情都是标题被丰富,入站消息被返回到网关。

也许你想要这个......?

public function create_email_dispo_dre($id){

    $this->_rules();

    if ($this->form_validation->run() == FALSE) {
        $this->update($id);
    } else {
    $data = array(
            'tenant_id' => $this->input->post('tenant_id',TRUE),
            'disposition_code' => $this->input->post('disposition_code',TRUE),
            'disposition_name' => $this->input->post('disposition_name',TRUE),
            'email' => $this->input->post('email',TRUE)           
            );
     $this->calldisp_model->insert($data);
     $this->session->set_flashdata('message', 'admin_faqs_success');
     redirect('admin/call_disposition/update/'.$id);

    }

}

这意味着所有带有丰富标题的邮件都将被发送到频道。

修改

如果您希望邮件转到这两个地方,则需要使用发布 - 订阅频道。