Spring 集成入站网关 当队列为空时触发事件

2024-06-26

我是新手,但我会尽量简洁。



{INPUT QUEUE}->[INBOUND-GATEWAY-1]-->[ROUTER]----------->(ACTIVATOR)<---------------
                                        \                                          /
                                         \-->{HOLD QUEUE}--->[INBOUND-GATEWAY-2]--^
  

我遇到的情况是,我必须像前者一样动态更改流程中的路由条件。来自队列的消息被发送到激活器进行处理,或者发送到另一个队列进行搁置。在某个时间,我必须关闭 INBOUND-GATEWAY-1,以便没有新消息进入流中,并打开 INBOUND-GATEWAY-2 以让来自 HOLD QUEUE 的所有消息得到处理。一旦 HOLD QUEUE 中的所有消息都被使用,两个网关都必须像以前一样关闭/打开。这里的问题是我如何知道 HOLD QUEUE 何时为空,以便我可以触发一个可以启动 gateway-1 的方法?

如果有人能帮助我,我将不胜感激。

提前致谢


经过一番调试和阅读,终于找到了解决这个问题的方法。入站网关是一个 JmsMessageDrivenEndpoint,基于两个内部组件:MessageListenerContainer 和 MessageListener。 MessageListenerContainer 是负责调度 MessageListener 行为的人,因此,重写 noMessageReceived 和 messageReceived,并添加一些属性来控制所需的行为,我可以实现“魔法”。

我的 MessageListenerContainer 实现是这样的。

public class ControlMessageListenerContainer extends DefaultMessageListenerContainer{

    private JmsMessageDrivenEndpoint mainInputGateway;

    private long timeOut;

    private long lastTimeReceived;  

    public PassControlMessageListenerContainer() {
        this.setAutoStartup(false);
    }

    @Override
    public void start() throws JmsException {
        /*When the container is started the lastTimeReceived is set to actial time*/
        lastTimeReceived = (new Date()).getTime();
        super.start();
    }

    @Override
    protected void noMessageReceived(Object invoker, Session session) {
        long actualTime = (new Date()).getTime();

        if((actualTime - lastTimeReceived) >= timeOut 
                && mainInputGateway != null && !mainInputGateway.isRunning()){
            mainInputGateway.start();
        }       
        super.noMessageReceived(invoker, session);
    }

    @Override
    protected void messageReceived(Object invoker, Session session) {
        /*lastTimeReceived is set again to actual time at new message arrive*/
        lastTimeReceived = (new Date()).getTime();
        super.messageReceived(invoker, session);
    }
}

最后,spring bean 配置如下:

<bean id="listenerContainer" 
    class="org.merol.ControlMessageListenerContainer">
    <property name="mainInputGateway" ref="mainGateway" />
    <property name="destination" ref="onHoldQueue" />
    <property name="timeOut" value="10000"/>
    <property name="connectionFactory" ref="connectionFactory"/>
</bean>

<bean id="messageListener" 
    class="org.springframework.integration.jms.ChannelPublishingJmsMessageListener">
    <property name="requestChannel" ref="outputChannel" />
</bean>

<bean id="inboundGateway" 
    class="org.springframework.integration.jms.JmsMessageDrivenEndpoint">
    <constructor-arg name="listenerContainer" ref="listenerContainer" />
    <constructor-arg name="listener" ref="messageListener" />
</bean>

希望这对其他人有帮助。

感谢@Nicholas 提供的线索。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring 集成入站网关 当队列为空时触发事件 的相关文章

  • 路由是否会影响具有绑定源地址的套接字?

    假设我有两个网络接口 eth0有地址10 0 0 1 eth1有地址192 168 0 1 Using route or ip route add我已将其设置为路由 所有地址至eth0 1 2 3 4只为了eth1 所以数据包到1 2 3
  • 使用 Typescript 实现 Express 控制器类

    我正在用打字稿做一个快速应用程序 路由器代码是 let user new User router get user test 用户类别是 export class User test req res next this undefined
  • Codeigniter - CMS 的最佳路由配置?

    我想在 Codeigniter 中创建一个自定义 CMS 并且我需要一种将常规页面路由到默认控制器的机制 例如 mydomain com about mydomain com services maintenance 这些将通过我的页面处理
  • Spring批量写入器限制

    我正在工作 Spring Batch 项目 从数据库读取记录然后写入rabbitmq 然后发送到HTTP消息网关 网关有150TPS我需要将我的应用程序限制为 150TPS 有没有办法带弹簧批的油门或者还有其他更好的方法吗 你能行的 在 S
  • JMS 和 CORBA 之间的区别?

    我刚刚读到CORBA and JMS 它们似乎都被用来实现经纪商架构 模式 我对他们有几个问题 1 我还是不太清楚它们之间的区别 请有人解释一下吗 2 当今的IT解决方案中是否使用CORBA 或者说它正在失去魅力 3 JMS可以取代CORB
  • 带有日期的铁路路线

    因此 我有一个每周日历视图 并且设置了一条路线来接受 year month day 作为开始日期 match events year month day gt events index constraints gt year gt d 4
  • 使用 JMS,是否有任何方法可以将消息存储在间歇性断开连接的客户端上,并在网络可用时将其转发给代理?

    我正在考虑一种架构 其中我的客户端间歇性地连接到网络 当网络不可用时 我希望将在这些客户端上创建的消息存储在 JMS 队列中 并在客户端位于网络上时将这些消息转发到中央消息代理 用户可以控制网络 例如拨入 因此它不像手机那样是间歇性连接 是
  • Websphere 6.1 到 7.0 JmqiObject 和 JmsQueue 丢失

    我正在尝试将应用程序从 Websphere 6 1 迁移到 7 0 我注意到许多 ibm MQ JMS 类已更改 消失 特别是 我收到错误 com ibm msg client jms JmsQueue com ibm mq jmqi Jm
  • Asp.net MVC 路由 - 防止通过约束路由到 XML 文件

    我正在尝试找到一种方法来阻止用户访问特定的 xml 文件 我尝试过做 routes MapRoute SiteMap SiteMap siteMap xml new new isLocal new LocalHostRouteConstra
  • 默认:Rails 资源路由的排除选项

    一个小问题 我正在将 Rails 用于 REST API 但由于它是 RESTful API 所以我并不真正需要 new or edit我的任何资源的路由 因为人们只会完全通过自动 JSON 请求而不是图形方式与此 API 交互 例如 不需
  • orchard cms路由问题

    我创建了一些自定义内容类型 其中包括路线部分 以便我的内容管理员可以编辑项目的别名 我没有运气配置一条路线 使我自己的控制器能够为这些项目的请求提供服务 核心 Routable 模块中到 ItemController 的路径的路由优先级为
  • URL 路由中的点与命名空间 Rails 3.1

    我有这个路线 rb root to gt posts index devise for users controllers gt omniauth callbacks gt users omniauth callbacks resource
  • MVC - 应用程序根目录在使用 Url.Content/Url.Action 的 url 中出现两次

    我在同一个域上有几个 mvc 应用程序 每个应用程序都有自己的目录 mydomain com app1mydomain com app2 etc 在根级别使用 Url Content 和 Url Action 时 app1 部分在 url
  • 我应该在 JSF ManagedBean 中的哪里打开/关闭 JMS 连接?

    在使用 JSF 2 和 Ajax 的简单演示 Web 应用程序中 ManagedBean 中有一个从 JMS 队列接收消息的方法 ManagedBean public class Bean Resource mappedName jms H
  • Jms 消息仅确认,直到消息确认为止

    如何确保消息确认仅删除在 jms 代理中调用确认的消息之前的消息 目前我有一个系统 它从 jms 队列中消费并部分处理它 稍后 一批这些消息将由不同的线程保存 我现在需要确认消息 但问题是我必须停止使用消息 否则确认先前收到的消息也将确认收
  • 使用curl测试Rails路由

    我有一个名为 users 的模型 我想使用 API 对其进行更新 我想做到这一点的方法是创建一个更新路由并插入执行更新的代码 我使用 RSpec 创建了一个测试 它似乎有效 但是 我想实际查看数据库中更改的数据 因此我尝试使用curl 来更
  • 当约束失败时从路由重定向

    我想在路由约束失败时重定向到不同的网址 路由 rb 匹配 u gt user signin constraints gt 黑名单域 黑名单域 rb class BlacklistDomain BANNED DOMAINS domain1 c
  • 如何将 Java JMS 与 MQseries 结合使用

    我正在尝试开发 JMS独立应用程序读取和写入 MQSeries 上的队列 我的老板要求我使用纯java JMS 不是 ibm mq lib 来做到这一点 以下是建立jms连接所需的信息 mq hostname 10 10 10 10 mq
  • 基于百分比的路由算法

    四处浏览基于百分比的路由 偶然发现这个线程 https stackoverflow com a 52044571 3154233 根据建议的算法如下 对于给定模型如下 public class Host private String nam
  • 从组件刷新/重新加载 ember 路由

    我有一个组件 它实际上是一个模式对话框 当我完成该对话框并按 确定 按钮时 我想留在打开该对话框的停留页面上 这并不难 但问题是该对话框更改了数据 我通过 REST 调用获取数据 因此我需要刷新已经所在的路线以反映数据更改 因为我是从组件中

随机推荐