Spring 集成和会话变量
Spring integration and session variables
大家早上好,
我有一个 spring 集成邮件模块,我用它来收听收到的电子邮件。
我想将此模块移动到网络应用程序中,以便我可以从网络应用程序干净地启动和停止适配器。
我现在面临的问题是我处理电子邮件的程序需要一个会话范围变量。
(在这个程序的非网络版本中,它使用了单例。我现在需要将这些数据存储在会话中,因为应用程序基于网络的性质(价值将取决于用户))。
当我从电子邮件处理程序访问这个会话变量时,我有一个异常告诉当前线程范围 'session' 不活动。
我了解到 Spring 集成可能创建了自己的线程,并且该线程无法访问 Web 会话。
我对从会话访问的对象有以下配置:
<bean id="localManager" class="com.xxx.ManagerImpl" scope="session">
<aop:scoped-proxy proxy-target-class="false" />
</bean>
处理电子邮件并需要 localManager bean 的 bean:
<int:service-activator id="serviceActivator" input-channel="receiveChannel" ref="mailService" method="handleMail"/>
在 handleMail 方法中,我正在访问 localManager:
@Autowired
@Qualifier(value="localManager")
private Manager manager;
这是在管理器上调用方法时出现异常范围 'session' 对于当前线程不活动。
是否可以让两者协同工作并让电子邮件管理线程访问会话范围的变量?
PS:我的 Web 应用程序(一个 JSF 应用程序)中有其他 bean 可以毫无问题地访问 localManager。这确实特定于集成线程
谢谢
吉尔斯
尝试将两者打包在一起可能不是最简单的事情...
但是如果您想从网络应用程序控制您的 Spring 集成模块,为什么不在您的 spring 集成模块中添加一个入站适配器(可能是一个 http-inbound)?然后您需要在您的 webapp 中做的就是对该端点执行 http 调用,将用户特定参数作为 HTTP 请求的一部分传递给您的 spring 集成模块。
收到传入的 HTTP 请求后,您的 spring 模块可以解析消息并在控制总线上向 start/stop 预期组件发送消息。
我用 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 集成模块才能拥有 http 侦听器。或者这可能是 Spring Boot 可以为您解决的问题,在您的 jar 中嵌入了 tomcat。
大家早上好,
我有一个 spring 集成邮件模块,我用它来收听收到的电子邮件。
我想将此模块移动到网络应用程序中,以便我可以从网络应用程序干净地启动和停止适配器。
我现在面临的问题是我处理电子邮件的程序需要一个会话范围变量。 (在这个程序的非网络版本中,它使用了单例。我现在需要将这些数据存储在会话中,因为应用程序基于网络的性质(价值将取决于用户))。
当我从电子邮件处理程序访问这个会话变量时,我有一个异常告诉当前线程范围 'session' 不活动。
我了解到 Spring 集成可能创建了自己的线程,并且该线程无法访问 Web 会话。
我对从会话访问的对象有以下配置:
<bean id="localManager" class="com.xxx.ManagerImpl" scope="session">
<aop:scoped-proxy proxy-target-class="false" />
</bean>
处理电子邮件并需要 localManager bean 的 bean:
<int:service-activator id="serviceActivator" input-channel="receiveChannel" ref="mailService" method="handleMail"/>
在 handleMail 方法中,我正在访问 localManager:
@Autowired
@Qualifier(value="localManager")
private Manager manager;
这是在管理器上调用方法时出现异常范围 'session' 对于当前线程不活动。
是否可以让两者协同工作并让电子邮件管理线程访问会话范围的变量?
PS:我的 Web 应用程序(一个 JSF 应用程序)中有其他 bean 可以毫无问题地访问 localManager。这确实特定于集成线程
谢谢
吉尔斯
尝试将两者打包在一起可能不是最简单的事情...
但是如果您想从网络应用程序控制您的 Spring 集成模块,为什么不在您的 spring 集成模块中添加一个入站适配器(可能是一个 http-inbound)?然后您需要在您的 webapp 中做的就是对该端点执行 http 调用,将用户特定参数作为 HTTP 请求的一部分传递给您的 spring 集成模块。
收到传入的 HTTP 请求后,您的 spring 模块可以解析消息并在控制总线上向 start/stop 预期组件发送消息。
我用 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 集成模块才能拥有 http 侦听器。或者这可能是 Spring Boot 可以为您解决的问题,在您的 jar 中嵌入了 tomcat。