我仅将Artemis 2.6.2
用于STOMP和以下星座:
经纪人:
服务器:
TaskResponse
TaskRequest
客户端123:
TaskRequest
TaskResponse
当我看着Artemis Console
时,会发生以下情况:
没有服务器,没有客户端连接:没有地址或队列
服务器连接:Artemis
创建一个多播地址TaskResponse
并为此过滤器为空的多播队列
客户端123连接:Artemis
创建一个多播地址TaskRequest
,并使用过滤器clientId = 123为该地址创建一个多播队列
消息交换:消息从服务器传输到客户端,然后按预期传输回服务器。
客户端123断开连接:Artemis
删除多播地址TaskRequest
和过滤器clientId = 123的核心响应多播队列
服务器将消息发送到客户端123的TaskRequest:根据服务器上的STOMP
客户端,消息发送成功。在代理上,消息消失。
行为相同,反之亦然:客户端123已连接,服务器未连接:根据客户端123上的STOMP
客户端,消息发送成功。在代理上,消息消失。
我的猜测是该消息被丢弃,因为没有到订户的路由。如果我在broker.xml的地址设置部分中启用了“不路由发送到dla”选项,则消息将直接进入死信队列。
您知道一种在订阅者重新连接之前保留消息的方法吗?
我将Stomp.Net Library与SelectorsCore Example一起使用,但仅减少到选择器s1。工作流程与我上面写的略有不同。
不幸的是,我没有找到一个示例来启用将STOMP消息记录到Artemis中的文件中。因此,我用WireShark记录了数据包,将其导出为文本并上传到Gist StompMessages.txt中。您可以在此处看到不同的STOMP消息,例如搜索CONNECT,SEND等。
解决方案是在anycastPrefix=/queue/
的{{1}}元素中使用选项acceptor
强制队列键入broker.xml
:
ANYCAST
答案 0 :(得分:0)
您正在观察的是预期的行为。如果将消息发送到没有队列的地址(或以STOMP术语-没有订阅者的目的地),则消息将无处可去,将被丢弃。这是正常的pub / sub语义。
如果即使没有订阅者也要保留消息,则可以: