如何确保通过JMS成功发送文本消息
How to ensure that a Text Message was sent via JMS succesfull?
我已经用C++通过JMS编写了一个文本消息发送者程序。
tibems_status status = TIBEMS_OK;
status = tibemsMsgProducer_SendToDestination(
m_tProducer,
m_tDestination,
m_tMsg );
假设status==0,这意味着只有Function工作成功。这并不意味着我的短信发送成功如何确保我的邮件发送成功?我应该从JMS队列返回ID或确认吗?
这取决于消息传递模式。
当发送PERSISTENT
消息时,tibemsMsgProducer_SendToDestination
呼叫将等待EMS服务器回复确认。
当发送NON_PERSISTENT
消息时,tibemsMsgProducer_SendToDestination
呼叫可能等待确认,也可能不等待确认,这取决于是否启用了授权和npsend_check_mode
设置。有关具体详细信息,请参阅EMS文档(链接到上面)。
最后,当发送RELIABLE_DELIVERY
消息时,tibemsMsgProducer_SendToDestination
呼叫不等待确认,并且只有在与EMS服务器的连接丢失时才会失败。
然而,即使在发送确认的情况下,这也只是确认EMS服务器已接收到消息。它不会确认消息使用者是否接收并处理了该消息。EMS监控消息可用于确定消费者是否已确认该消息。
消息监视主题的形式为$sys.monitor.<D>.<E>.<destination>
,其中<D>
匹配Q|q|T|t
,<E>
匹配s|r|a|p|*
,<destination>
是目的地的名称。例如,为了监视名为beterman
的队列的消息确认,您的程序将订阅$sys.monitor.q.a.beterman
(如果您想要已确认消息的副本,则订阅$sys.monitor.Q.a.beterman
)。
监控消息包含许多属性,包括msg_id
、source_name
和target_name
。您可以使用该信息将其与您发送的消息关联起来。
否则,更简单的选择是使用tibemsMsgRequestor
而不是tibemsMsgProducer
。CCD_ 22将发送该消息并等待来自接收方的回复。在这种情况下,最好使用RELIABLE_DELIVERY
和NO_ACKNOWLEDGE
来删除生产者和EMS服务器以及EMS服务器和消费者之间的所有确认和确认消息。
但是,如果您确实采用了tibemsMsgRequestor
路由,那么您可能还想考虑简单地使用HTTP请求,使用负载均衡器代替EMS服务器。在体系结构上,这两种选择没有太大区别(EMS使用持久TCP连接,HTTP不使用)
Producer -> EMS Server -> ConsumerA
-> ConsumerB
Client -> Load Balancer -> ServerA
-> ServerB
但是使用HTTP,每个方法都有明确的语义。GET是安全的(不改变状态),PUT和DELETE是幂等的(多个相同的请求应该与单个请求具有相同的效果),POST是非幂等的,每次执行时都会导致服务器状态的改变。如果您使用tibemsMsgRequestor
,则需要创建定制的语义和响应状态,这将需要额外的精力来创建、维护和培训团队中的其他开发人员。
此外,与EMS相比,找到具有HTTP技能的开发人员要容易得多,而且找到信息HTTP比EMS更容易,因此tibemsMsgRequestor
选项将使招聘更加困难,解决问题更加困难。
正因为如此,HTTP是一个更好的选择IMO,用于请求回复或当您希望确保发送的消息被成功处理时。
- cmake在我的项目中所需的所有静态库都不成功
- 尽管测试成功,CppUnit测试核心仍被丢弃.为什么
- 如何让LLDB在成功时退出,在失败时等待
- 有没有办法知道Tracer是否成功地完全连接到了jaegerclientcpp中的jaeger后端服务器
- CMake WxWidgets项目成功地在Linux上构建,但没有在Windows上构建
- 为什么 std::绑定错误参数可以成功?
- Clion显示错误,但可以使用Cmake成功构建代码
- 代码使用向量成功运行,但使用数组显示错误
- 如何检查cURL是否成功登录?c ++
- 为什么 WinInet 在通过 FQDN 连接时无法通过协商自动进行身份验证,但如果通过 IP 连接则成功?
- C++为什么我的编译器成功了,但我的计算机给出了调试错误?
- 未知的 GCC 链接器错误,但已成功构建
- 我的 SonarQube C++扫描成功,但结果仅标记重复项,而没有标记其他标记的位置
- 为什么 LoadLibrary 失败,而 LoadLibraryA 成功加载 DLL?
- 生成成功,但不会给出正确的输出
- 默认/样板代码在Visual Studio 2017中给我错误.E1574.虚幻.但构建成功了
- 即使不包含其标头,如何成功向前声明的类编译?
- C++成功复制动态分配的 obj 而不复制 ctor?
- VS2017 版本 15.8.3 成功编译内联方法,而不返回所需值
- 如何确保通过JMS成功发送文本消息