2017-02-13 10 views
1

Приложение для интеграции Spring, основанное на TCP-шлюзе, работает хорошо. Он принимает запрос сообщения, поступающего на шлюз TCP, и пересылает сообщение serviceActivator для подготовки ответа и ответ отправляется клиенту.Отправка сообщения serviceActivator в Spring Интеграция после отправки ответа в шлюзе TCP

Я хочу сохранить сообщение в базу данных после отправки клиенту. Мне просто интересно, могу ли я переслать сообщение другому сервисному агенту после отправки ответа клиенту.

Если да, как настроить весеннюю конфигурацию? Буду признателен за любую помощь в этом отношении.

Вот пружинный контекст файла:

<beans> 
    <int-ip:tcp-connection-factory id="crLfServer" 
      type="server" 
      port="${availableServerSocket}" 
      single-use="true" 
      so-timeout="10000" 
      using-nio="false" 
      serializer="connectionSerializeDeserialize" 
      deserializer="connectionSerializeDeserialize" 
      /> 

     <bean id="connectionSerializeDeserialize" class="org.springframework.integration.ip.tcp.serializer.ByteArrayStxEtxSerializer"/> 

     <int-ip:tcp-inbound-gateway id="gatewayCrLf" 
      connection-factory="crLfServer" 
      request-channel="serverBytes2StringChannel" 
      error-channel="errorChannel" 
      reply-timeout="10000"/> <!-- reply-timeout works on inbound-gateway --> 

     <int:channel id="toSA" /> 

     <int:service-activator input-channel="toSA" 
      ref="myService" 
      method="prepare"/> 

     <int:object-to-string-transformer id="serverBytes2String" 
      input-channel="serverBytes2StringChannel" 
      output-channel="toSA"/> 

     <int:transformer id="errorHandler" 
      input-channel="errorChannel" 
      expression="payload.failedMessage.payload + ':' + payload.cause.message"/> 
</beans> 

Спасибо

ответ

1

Вы можете добавить <publish-subscribe-channel> как output-channel для этого <service-activator>. Одним из абонентов будет <int-jdbc:outbound-channel-adapter>, чтобы сохранить ответ в БД. Другой абонент должен быть <bridge> без output-channel при условии ответа на <int-ip:tcp-inbound-gateway>.

Но да, это перед тем отправки клиенту ...

Для этой цели вы можете расширить Serializer и выполнить нужную логику с byte[] уже после выполнения super.serialize().

+1

Вы можете поместить «порядок =» 1 «на мост» (вместе с «выходным каналом», который является «каналом ответа» на входящем шлюзе) и 'order =" 2 "' на адаптере jdbc и ответ будет отправлен первым. –