【问题标题】:Spring integration and session variablesSpring集成和会话变量
【发布时间】:2015-06-11 09:40:26
【问题描述】:

大家早上好,

我有一个 spring 集成邮件模块,用于收听收到的电子邮件。

我想将此模块移动到 Web 应用程序中,以便我可以从 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;

这是在调用管理器上的方法时出现异常 Scope 'session' is not active for current thread。

是否可以让两者一起工作并让电子邮件管理线程访问会话范围的变量?

PS:我的 Web 应用程序(JSF 应用程序)中有其他 bean 访问 localManager 没有任何问题。这确实特定于集成线程

谢谢

吉尔

【问题讨论】:

  • 那永远行不通。它如何访问会话,它是一个后台轮​​询过程,它对它运行的应用程序一无所知,更不用说它在 Web 应用程序中运行了。

标签: spring spring-integration email


【解决方案1】:

尝试将两者打包在一起可能不是最简单的事情......

但是如果你想从 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。

【讨论】:

  • 非常感谢。很好。以一种接近我第一次的方式,网络应用程序只向模块发送开始/停止消息,但没有考虑发送参数......我的问题是:我可以将参数发送到端点,但是如何我可以将此参数传递给我的 mailService (ref=mailService) bean 吗?谢谢
  • 在我提供的 sn-p 中,就像我在 rmiToControlMessage 中注入 controlChannel 一样,您可以连接您的 mailService 并根据您收到的消息对其进行操作
  • 这就是我所做的。这很好用。非常感谢。
  • 这导致了另一个问题:我现在让我的 mailService 在另一个 Web 应用程序上运行,托管我的所有服务(称为远程),并且可以从监控 Web 应用程序远程访问它以停止和启动.我的问题是:当我停止远程 Web 应用程序时,所有 Spring 集成是否都已正确停止,还是应该先调用停止?
猜你喜欢
  • 2015-07-29
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
  • 2012-12-12
  • 1970-01-01
相关资源
最近更新 更多