Spring集成和会话变量

时间:2015-06-11 09:40:26

标签: spring spring-integration email-integration

大家早上好,

我有一个弹簧集成邮件模块,我用它来收听传入的电子邮件。

我想将此模块移动到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没有任何问题。这非常特定于集成线程

由于

吉勒

1 个答案:

答案 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。