在春季集成中,我有一个简单的tcp客户管道:一个网关,一个tcp出站网关,一个服务激活器以及一个错误通道。在tcp-connection-
factory中有一个简单的拦截器。错误通道非常简单,我使用此过滤器实现了tcp-connection-event-inbound-channel-
adapter:
所以我的错误处理程序非常简单,看起来像这样:
public class TcpErrorHandler {
public void onException(){
System.out.println("Exception!!! ");
}
}
它之所以有效,是因为当我有一个Socket close Exception(服务器端我关闭了连接)时,应用程序会写“ Exception
!!!”。到控制台,但是另一方面,当我有连接超时异常时,它不起作用。我的问题是:如何获得所有最相关的例外:
有没有捕捉机制?
这是我的bean配置中的一个片段:
<!-- Client side -->
<int:gateway id="gw"
service-interface="hu.gmxdev.climaxreplica.service.SimpleGateway"
default-request-channel="outputchannel" />
<int-ip:tcp-connection-factory id="client"
type="client" host="localhost" port="10001" single-use="true"
so-timeout="2000" deserializer="climaxDeserializer"
interceptor-factory-chain="customInterceptorFactoryChain"/>
<int:channel id="outputchannel" />
<int-ip:tcp-outbound-gateway id="outGateway"
request-channel="outputchannel" reply-channel="replychannel"
connection-factory="client" request-timeout="2000" reply-timeout="2000" />
<int:service-activator input-channel="replychannel"
method="reply" ref="echoService" id="serviceactivator">
</int:service-activator>
<int:channel id="replychannel"></int:channel>
<bean id="customInterceptorFactoryChain"
class="org.springframework.integration.ip.tcp.connection.TcpConnectionInterceptorFactoryChain">
<property name="interceptors">
<array>
<bean class="hu.gmxdev.climaxreplica.service.CustomInterceptorFactory"/>
</array>
</property>
</bean>
<!-- Error channel -->
<int-ip:tcp-connection-event-inbound-channel-adapter id="event"
error-channel="errorChannel"
event-types="org.springframework.integration.ip.tcp.connection.TcpConnectionExceptionEvent" />
<int:channel id="errorChannel"></int:channel>
<int:service-activator ref="tcpErrorHandler" method="onException"
input-channel="errorChannel">
</int:service-activator>
这是我的错误处理程序:
public class TcpErrorHandler {
@Autowired
private ApplicationContext appContext;
public void onException(TcpConnectionExceptionEvent event){
MainService mainService = appContext.getBean(MainService.class);
mainService.setSuccess(3);
System.out.println("Exception!!! ");
System.out.println(event.getCause().getMessage());
}
}
拦截器在这里:
public class CustomInterceptor extends TcpConnectionInterceptorSupport{
public CustomInterceptor () {
System.out.println("catched_constructor1");
}
public CustomInterceptor (ApplicationEventPublisher applicationEventPublisher) {
super(applicationEventPublisher);
System.out.println("catched_constructor");
}
@Override
public boolean onMessage(Message<?> message) {
System.out.println("catched_message");
return super.onMessage(message);
}
@Override
public void send(Message<?> message){
System.out.println("catched_send");
MessageHeaders mh = message.getHeaders();
try {
super.send(message);
}
catch (Exception e) {
System.out.println("catched_send_exception");
}
}
@Override
public void close() {
String id = getConnectionId();
System.out.println("catched_closed" + id);
super.close();
}
}
和我的“呼叫者”:
success = gateway.send("fooooooo");
实际上<tcp-connection-event-inbound-channel- adapter>
发送给channel
一个Message
与TcpConnectionExceptionEvent
(在你的情况下)的payload
。
因此,您的订阅者(您的TcpErrorHandler
)可以接受TcpConnectionExceptionEvent
作为方法参数。
在该方法中,您可以进行进一步的逻辑处理,例如从中提取原始Exception
内容IntegrationEvent
。
使用IP
时模块中有多个位置TcpConnectionSupport.publishConnectionExceptionEvent
。
如果您说不了解time out exception
,那么如果您共享此事的日志,那就太好了。我不知道我们做哪个地方不try...catch
上SocketTimeoutException
…
更新
<int-ip:tcp-connection-event-inbound-channel-adapter channel="events"
event-types="org.springframework.integration.ip.tcp.connection.TcpConnectionExceptionEvent"/>
<service-activator input-channel="events" ref="tcpErrorHandler"/>
public class TcpErrorHandler {
public void onException(TcpConnectionExceptionEvent event) {
System.out.println("Exception!!! ");
event.getCause();
....
}
}
这应该工作。
更新2
根据您的代码:
try {
super.send(message);
}
catch (Exception e) {
System.out.println("catched_send_exception");
}
您是否认为在其中窒息异常是不好的?
从另一面看:确定要调用您的日志时,您介意DEBUG
为该org.springframework.integration
类别打开日志记录级别并在此处共享日志tcpErrorHandler
吗?
从另一侧尝试<int-ip:tcp-connection-event-inbound-channel-adapter>
完全没有event- types
。我的意思是让我们看看它是否可以处理任何内容IpIntegrationEvent
。
null null 有什么捕捉机制吗? 下面是我的bean配置中的一个片段: 下面是我的错误处理程序:
问题是在Spring boot测试中没有捕获到应用程序事件,而在应用程序项目中侦听事件的文件可以很好地工作。
问题内容: 一切都很棒,直到遇到真正需要捕捉例外的地方。当我放置 在 阻止我得到: 在这种情况下我该怎么办? 谢谢, 问题答案: 这是因为,任何一种方法(javadoc链接)都不会引发检查异常。Spring将其转换为DataAccessException之一,它是更通用的运行时异常家族,以抽象出任何特定的基础数据库实现。
问题内容: 发现在Java 1.6(以及从Eclipse)上运行时,吞没了该方法中的异常之后,我试图找到一种捕获这些异常的方法,而不会在我的所有实现中都添加throw / catch 。 该API建议覆盖应对此有所帮助: 导致此future报告一个ExecutionException,并以给定throwable作为其原因,除非已经设置或取消了此Future。计算失败时,run方法在内部调用此方法。
问题内容: 我有一个Swing应用程序,即使我在/中都包含了所有内容,也没有捕获到异常。 我得到的只是这个堆栈跟踪: 问题答案: 正如另一位发布者所提到的,您的问题是该异常正在另一个线程(事件调度线程)中引发。几个解决方案: 在发生异常的实际代码周围进行尝试/捕获:例如,如果它是对ActionListener处理的按钮单击的响应,则将try / catch放入actionPerformed()方法
问题内容: 我的JSP页面中有一个复选框,它接受整数值: 如果用户将输入的值更改为一个值,例如: 该页面将引发一个。如何在控制器中捕获并显示有意义的消息? 问题答案: 您可以使用JSTL的 c:catch 标签: