2015-06-16 2 views
0

Я использую TcpInboundGateway от spring-integration для клиента socket.Как уловить исключения на TcpInboundGateway?

В TcpInboundGateway.doOnMessage() поток отправляется через соединение сокета. Если возникает исключение, например, потому что сокет закрыт, существует только журнал ошибок весны "Failed to send reply".

НО Я хотел бы обработать эти ошибки сокетов явным образом. Как я могу поймать эти ошибки в желаемом классе?

+0

Используйте пользовательский 'TcpInboundGateway', расширяющий исходный и переопределяющий' doOnMessage', чтобы поставить 'try-catch' в? –

+1

К сожалению, вы не можете этого сделать, потому что это частный метод. Вам придется переопределить 'onMessage()'. Но даже это не сработает, потому что вам нужен доступ к «соединениям» для поиска соединения, поэтому вам придется переопределить методы «TcpSender». –

+0

Собственно, см. Мой (пересмотренный) ответ, нет смысла переопределять; это исключение возникает во входящем потоке, а не в ответном потоке. Поэтому вам нужно использовать механизм событий исключения, чтобы получить уведомление об ошибке. –

ответ

2

Мы должны, вероятно, изменить это для распространения исключения, но это будет изменение поведения, поэтому нам, вероятно, придется сделать это только в 4.2, если только мы не сделаем это возможным.

На самом деле, после дальнейшего рассмотрения; это не может быть выполнено - вам нужно обработать исключение через connection exception event.

Передача выполняется во входящей цепочке, а не в вашей потоке отправки.

Мы могли бы улучшить событие исключения, чтобы включить сообщение об ошибке с исходящим сообщением.

РЕДАКТИРОВАТЬ:

В качестве альтернативы, использовать пару collaborating channel adapters вместо входящего шлюза.

Таким образом, передача выполняется в потоке, который отправляет ответ, и вы можете перехватывать исключения.

+0

Я бы предположил, что вы можете сделать 'private boolean doOnMessage()' return 'true', если не было ошибки (поэтому после' connection.send (reply) '- интересно, почему это еще не так) и' false 'на исключение. В настоящее время он возвращает * always * false! Затем сделайте его «защищенным», чтобы мы могли его переопределить, вызывая 'super.DoOnMessage()' внутри и оценивая логическое значение. Если false, это означает, что какая-то ошибка возвращала ответ в сокет и могла быть обработана соответствующим образом? – membersound

+0

Было бы даже лучше, если бы вы могли вернуть 'SimpleEntry >' в качестве состояния логического результата и значения 'reply' как, так что метод overriding может получить доступ к объекту, который был отправлен при сбоях отправки 'if (! getKey())'. – membersound

+1

Как я уже сказал, это не поможет вам, потому что 'doOnMessage' вызывается во входящем потоке, который получил это сообщение, а не в вашем потоке, который отправил ответ - это фундаментальный дизайн структуры и будет трудно изменить. Решением является прослушивание события исключения. Я добавил [JIRA Issue] (https://jira.spring.io/browse/INT-3745), чтобы добавить сообщение к событию. –

Смежные вопросы