【发布时间】:2014-08-15 21:58:20
【问题描述】:
我正在升级中:
- 春季 3.1.0.RELEASE => 4.0.6.RELEASE
- Spring 集成 2.1.0.RELEASE => 4.0.3.RELEASE
我注意到网关的 XML 配置作为内部 bean 存在一些不兼容性。
在升级之前,这样的事情很好:
<bean id="eventPublisher" class="com.blorp.EventPublisher">
<constructor-arg>
<int:gateway default-request-channel="eventPublishingChannel"
default-reply-timeout="10000"
service-interface="com.blorp.messaging.Sender">
<int:method name="send" />
</int:gateway>
</constructor-arg>
</bean>
<int:channel id="eventPublishingChannel" />
执行上述升级后,在运行时实际发送事件时,由于尚未设置请求通道而引发异常:
Caused by: java.lang.IllegalStateException: send is not supported, because no request channel has been configured
at org.springframework.util.Assert.state(Assert.java:385) ~[spring-core-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at org.springframework.integration.gateway.MessagingGatewaySupport.send(MessagingGatewaySupport.java:197) ~[spring-integration-core-4.0.3.RELEASE.jar:na]
at org.springframework.integration.gateway.GatewayProxyFactoryBean.invokeGatewayMethod(GatewayProxyFactoryBean.java:344) ~[spring-integration-core-4.0.3.RELEASE.jar:na]
at org.springframework.integration.gateway.GatewayProxyFactoryBean.doInvoke(GatewayProxyFactoryBean.java:304) ~[spring-integration-core-4.0.3.RELEASE.jar:na]
at org.springframework.integration.gateway.GatewayProxyFactoryBean.invoke(GatewayProxyFactoryBean.java:295) ~[spring-integration-core-4.0.3.RELEASE.jar:na]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) ~[spring-aop-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at com.sun.proxy.$Proxy84.send(Unknown Source) ~[na:na]
at com.blorp.DefaultEventPublisher.publish(DefaultEventPublisher.java:29) ~[blorp-0.54.0-SNAPSHOT.jar:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_45]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0_45]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_45]
at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_45]
...
当我使用调试器单步调试时,MessageGatewaySupport.requestChannel 属性确实是 null,即使配置指定了它。
解决方法是不要将网关配置为内部 bean。下面的 sn-p 运行良好:
<int:gateway id="sender" default-request-channel="eventPublishingChannel"
default-reply-timeout="10000"
service-interface="com.blorp.messaging.Sender">
<int:method name="send" />
</int:gateway>
<bean id="eventPublisher" class="com.blorp.EventPublisher">
<constructor-arg ref="sender" />
</bean>
我很好奇为什么升级后前者不起作用。创建代理有问题吗?它是一个错误吗?我还没有找到这方面的问题。
【问题讨论】:
标签: spring configuration spring-integration