当前位置: 首页 > 知识库问答 >
问题:

来自原始jmsReplyTo的jms动态目标

越霖
2023-03-14

有一个请求队列,回复队列由客户端服务器实例创建,并固定到每个实例,而不是使用临时队列。

用例需要获取入站jms消息,然后将该消息发送到异步进程。一旦从服务接收到异步回复消息,我需要获取这些结果并回复原始消息的jmsReplyTo。Jms网关在这种情况下不起作用AFAIK

我正在使用jms消息驱动的通道适配器来处理带有一系列通道和服务激活器的消息,以处理进程外调用和异步回复。我正在尝试使用DynamicDestinationResolver无济于事。此外,我尝试以编程方式设置出站目标地址,但无法找到一个好方法来做到这一点。

这似乎是一种常见的模式,但我找不到一个完全断开连接的异步请求响应的好例子。断开连接意味着通常的异步jms请求-应答似乎不符合需要。

上下文配置:

<!-- Input from Amq -->

<amq:queue id="requestQueue" physicalName="${request.queue}" />

<int-jms:message-driven-channel-adapter id="jmsIn"
                                    connection-factory="jmsConnectionFactory"
                                    destination="requestQueue"
                                    channel="queueRequestChannel" concurrent-consumers="5" />

<int:channel id="queueRequestChannel" />

<int:service-activator input-channel="queueRequestChannel" ref="switchMessageHandler" method="processSwitchMessage"
        output-channel="cardNetworkOutChannel"/>

<!-- Output to Card Network-->
<int:channel id="cardNetworkOutChannel" />

<!--<int:service-activator input-channel="cardNetworkOutChannel" ref="cardNetworkHandler" method="send8583Message" />-->

<!-- Simply used to mock the card network by transforming a SwithMessage to a SwitchMessageResponse * Not needed for target solution -->
<int:transformer id="requestResponseTransformer" ref="nettyCardNetworkClientMock" input-channel="cardNetworkOutChannel"
                 method="process" output-channel="cardNetworkInChannel"/>

<!-- Input from Card Network -->
<int:channel id="cardNetworkInChannel" />

<int:service-activator input-channel="cardNetworkInChannel" ref="switchMessageHandler" method="sendSwitchMessage"
                       output-channel="queueReplyChannel"/>


<int:channel id="queueReplyChannel"/>

<int-jms:outbound-channel-adapter
        destination-resolver="simpleDestinationResolver" connection-factory="jmsConnectionFactory"
        channel="queueReplyChannel" destination-expression="headers.jms_replyTo" />

共有1个答案

党权
2023-03-14

我刚刚更新了jms示例应用程序,使服务器端使用独立的适配器,而不是入站网关,它工作得很好。。。

<!--    <jms:inbound-gateway id="jmsin" -->
<!--                         request-destination="requestQueue" -->
<!--                         request-channel="demoChannel"/> -->

<channel id="demoChannel"/>

<jms:message-driven-channel-adapter destination="requestQueue" channel="demoChannel" />

<service-activator input-channel="demoChannel" ref="demoBean" output-channel="reply" />

<channel id="reply" />

<jms:outbound-channel-adapter channel="reply" destination-expression="headers['jms_replyTo']" />

打开调试日志-我们发布了很多有用的东西。

编辑

我只是通过…使其异步。。。

<channel id="reply">
    <queue/>
</channel>

<jms:outbound-channel-adapter channel="reply" destination-expression="headers['jms_replyTo']">
    <poller fixed-delay="3000"/>
</jms:outbound-channel-adapter>

编辑2

根据您在客户端上使用的内容,许多客户端要求将入站消息id用作相关id。(默认情况下,对于具有命名回复队列的出站网关,这是正确的,除非您提供相关密钥)。

因此,要设置correlationId,您可以使用标头充实器;我刚刚测试过这个。。。

<chain input-channel="reply">
    <header-enricher>
        <header name="jms_correlationId" expression="headers['jms_messageId']" />
    </header-enricher>
    <jms:outbound-channel-adapter destination-expression="headers['jms_replyTo']"/>
    <poller fixed-delay="1000" />
</chain>

如果客户端本身正在设置相关id标头,则这不是问题。

 类似资料:
  • 问题内容: (对不起,还有很长的问题!)我最近一直在尝试将Go(而不是C ++)用于我作为辅助项目正在开发的游戏服务器模拟器,并质疑我是否以明智的Go术语来实现它。如您所料,服务器通过发送符合特定协议规范的原始数据包(TCP)与一个或多个游戏客户端进行通信。相关部分如下所示: 接收标头->解密->接收字节,直到达到标头长度->解密其余数据包->分派给处理程序->解码数据包->根据需要处理->发送响

  • 我希望以代理无关的方式从Java SE应用程序创建JMS连接。 我用数据库连接的URL方案与JDBC进行比较。这将创建与实际实现无关的独立性。 对于JMS,我还没有找到类似的东西。我知道在Java EE中,JNDI将履行这个角色,但这是Java SE。 我不想将我的代码绑定到任何特定的队列代理,因为我的需求非常简单,即JMS 1.1文本消息的发送/接收。 我也看过Spring Boot,因为它通常

  • 我的Android项目中的raw文件夹中有各种音频文件。我的代码不起作用。当我单击共享按钮应用程序时,它崩溃了。 这是我的代码: 和Android清单添加:

  • 我想创建一个从Api读取数据的图表。要做到这一点,我有这把小提琴http://jsfiddle.net/68oe1oLf/69/ 注意:https://jsfiddle.net/68oe1oLf/69/将导致混合内容错误,并且无法从api加载数据 这是javascript代码 我从这个文档示例中借用了这个想法http://jsfiddle.net/gh/get/library/pure/highc

  • 结果将是: 我对这个结果感到困惑,因为根据标准规则,不是静态初始化,是静态初始化,因为这些: 变量或临时对象o的常量初始值设定项是其完全表达式为常量表达式的初始值设定项,但如果o是对象,则这样的初始值设定项也可以为o及其子对象调用constexpr构造函数,即使这些对象是非文字类类型。 如果实体的常量初始值设定项初始化具有静态或线程存储持续时间的变量或临时对象,则执行常量初始化。如果不执行常量初始

  • 我已经看到了一两个关于堆栈溢出的问题,但是我仍然无法解决它,所以我想提出我自己的问题。 一和二 要为JMS应用程序编译和运行WebSphere MQ类,请为您的平台使用CLASSPATH设置,如表1所示。 classpath=mq_installation_path\java\lib\com.ibm.mqjms.jar;mq_installation_path\tools\jms; 我试过了,但它