大家早上好,
我有一个弹簧集成邮件模块,我用它来收听传入的电子邮件。
我想将此模块移动到Web应用程序中,以便我可以从Web应用程序中干净地启动和停止适配器。
我现在面临的问题是我处理电子邮件的程序需要一个会话范围变量。 (在这个程序的非网络版本中它使用了单例。我现在需要将这些数据存储在会话中,因为应用程序的基于Web的性质(值将取决于用户))。
当我从电子邮件处理程序访问此会话变量时,我有一个例外,告诉Scope' session'当前线程无效。
我知道Spring集成可能已经创建了自己的线程,并且该线程无法访问Web会话。
我对从会话访问的对象有这个配置:
<bean id="localManager" class="com.xxx.ManagerImpl" scope="session">
<aop:scoped-proxy proxy-target-class="false" />
</bean>
bean处理电子邮件,需要localManager bean:
<int:service-activator id="serviceActivator" input-channel="receiveChannel" ref="mailService" method="handleMail"/>
在方法handleMail中,我正在访问localManager:
@Autowired
@Qualifier(value="localManager")
private Manager manager;
这是在管理员上调用一个方法时,我有例外的&#39; session&#39;当前线程无效。
是否可以使两者协同工作并让电子邮件管理线程访问会话范围变量?
PS:我的网络应用程序(JSF应用程序)中有其他bean访问localManager没有任何问题。这非常特定于集成线程
由于
吉勒
答案 0 :(得分:1)
尝试将2包装在一起可能不是最简单的事情......
但是如果你想从webapp控制你的Spring集成模块,为什么不在spring集成模块中添加入站适配器(可能是http-inbound)?然后,您需要在webapp中执行的操作是对该端点执行http调用,将用户特定参数作为HTTP请求的一部分传递给spring集成模块。
接收到传入的HTTP请求后,spring模块可以解析消息并在控制总线上发送消息以启动/停止预期的组件。
我做了一些与RMI入站网关非常相似的事情:
<int-rmi:inbound-gateway request-channel="rmiIncomingRequestChannel" />
<int:channel id="rmiIncomingRequestChannel" />
<int:service-activator method="myModuleInterfaceAction"
input-channel="rmiIncomingRequestChannel" ref="rmiToControlMessage" />
<bean id="rmiToControlMessage"
class="myModule.rmi.controller.impl.RmiInterfaceControllerImpl">
<property name="controlChannel" ref="controlChannel" />
</bean>
<int:channel id="controlChannel" />
<int:control-bus input-channel="controlChannel" />
根据文档(http://docs.spring.io/spring-integration/reference/html/http.html),您似乎必须在Tomcat中部署Spring Integration模块才能拥有http侦听器。或者这可能是Spring Boot可以为你解决的问题,你的jar中有一个嵌入式tomcat。