我正在研究多线程JMS接收器和发布者代码。 从队列接收XML消息,调用存储过程(执行需要70秒),并在90秒内将响应发送到Topic。 经纪人关闭时我需要处理一个条件。 即,从队列接收消息并在java中处理消息的条件,同时Queue和Topic都将关闭。那么如何处理那些不在队列中而不是发送到主题但是在java内存中的消息呢? 提供不同的选择:
1.使用CLIENT_ACKNOWLEDGE 2.将发布者代码与接收者代码分开。 3.有错误实用程序,它将从日志中获取消息并处理它们并发送到Topic(最不喜欢)
请建议我选择正确的选项
答案 0 :(得分:3)
使用交易会话。使用消息并在单个工作单元下发送响应,并在发送响应后显式调用COMMIT。然后,如果代理在事务未完成时死亡,则将回滚输入消息。如果在两阶段协调事务中包含数据库更新,那么它也可以回退到代理程序中。这要求使用者和响应者在同一个线程中,因为JMS为每个线程调整会话范围,但是您可以让多个线程并行运行会话。
请注意,将许多事务保持打开90秒可能需要在代理端进行一些调整。
答案 1 :(得分:1)
一种解决方案是将db用于中间存储过程。所以步骤将是:
1. Consume Message from Queue and store into db and use Client_Acknowledge.
2. Run stored procedures on the consumed message.
3. Once the procedure is over, send message from db to the topic.
4. Delete message once acknowledgement is recieved.
如果队列和主题介于两者之间,则只需在未收到主题确认时再次发送消息。
我不确定这是否是最好的选择,并希望了解社区如何回应这个问题。