【问题标题】:messagebased RPC with topic带有主题的基于消息的 RPC
【发布时间】:2015-07-13 23:23:31
【问题描述】:

一个简单的基于消息的 RPC 非常容易创建。服务器端导出服务,客户端使用代理。

用多个回复者制作同一件事的最佳方法是什么?

我想发送来自客户的请求。然后客户端在收到所有(可能超时)回复时等待。

【问题讨论】:

    标签: spring jms spring-integration messaging spring-jms


    【解决方案1】:

    您可以使用 aggregator 与适当的关联和释放策略(以及组超时)。

    编辑:

    这是一个使用 JMS 主题的版本...

    <bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
        <property name="targetConnectionFactory">
            <bean class="org.apache.activemq.ActiveMQConnectionFactory">
                <property name="brokerURL" value="vm://localhost"/>
            </bean>
        </property>
        <property name="sessionCacheSize" value="10"/>
    </bean>
    
    <bean id="requestTopic" class="org.apache.activemq.command.ActiveMQTopic">
        <constructor-arg value="topic.demo"/>
    </bean>
    
    <bean id="replyQueue" class="org.apache.activemq.command.ActiveMQQueue">
        <constructor-arg value="queue.reply"/>
    </bean>
    
    <int-stream:stdin-channel-adapter id="stdin" channel="stdinToJmsoutChannel"/>
    
    <int:channel id="stdinToJmsoutChannel"/>
    
    <int:chain input-channel="stdinToJmsoutChannel">
        <int:header-enricher>
            <int:header name="jms_replyTo" ref="replyQueue" />
        </int:header-enricher>
        <int-jms:outbound-channel-adapter destination="requestTopic" />
    </int:chain>
    
    <int-jms:message-driven-channel-adapter channel="jmsReplyChannel" 
        destination="replyQueue"/>
    
    <int:channel id="jmsReplyChannel" />
    
    <int:chain input-channel="jmsReplyChannel">
        <int:aggregator group-timeout="5000" expire-groups-upon-timeout="false"
            send-partial-result-on-expiry="true"
            discard-channel="logLateArrivers"
            correlation-strategy-expression="headers['jms_correlationId']"
            release-strategy-expression="size() == 2"/>
        <int-stream:stdout-channel-adapter append-newline="true"/>
    </int:chain>
    
    <int:logging-channel-adapter id="logLateArrivers" />
    
    <!-- Subscribers -->
    
    <int-jms:inbound-gateway request-channel="upcase" request-destination="requestTopic" />
    
    <int-jms:inbound-gateway request-channel="upcase" request-destination="requestTopic" />
    
    <int:transformer input-channel="upcase" expression="payload.toUpperCase()" />
    

    在控制台中输入请求:

    Please type something and hit <enter>
    
    foo
    [FOO, FOO]
    bar
    [BAR, BAR]
    baz
    [BAZ, BAZ]
    

    【讨论】:

    • 嗨,加里,谢谢您的回答。我会尝试,但你能举个小例子吗?我以前从未与聚合器合作过:)
    • 非常感谢。下周我会试试,让你知道这个解决方案是否能解决我的问题。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多