【问题标题】:How can I send XMPP messages after a successful transaction?交易成功后如何发送 XMPP 消息?
【发布时间】:2011-11-11 02:45:42
【问题描述】:

在我的项目中,我将所有服务设计为无状态会话 bean。在工作流程中,会创建新数据并将其报告给客户。我只想在事务成功提交时发送此消息。

我注册了一个 ServletContextListener 来调度我的 xmpp 数据包(smack 库)。当我收到一个数据包时,我会找到我的分派有状态会话 bean 并开始处理请求。

public void processPacket(Packet packet) {
    try{
        if(packet instanceof RawRequest){
            DispatchIQService service = Core.lookup(DispatchIQService.class);
            service.process(connection, (RawRequest)packet);
            // sending of the messages should happen here, because transaction completed successful.
        }else{
            log.debug("Packet ignored: " + packet.toXML());
        } 
    }catch(Exception e){
        log.error(e, e);
    }
}
  1. 如何在工作流中跨多个 bean 收集这些生成的消息?我会从调度 bean 返回这个列表,然后发送消息。我的简单解决方案是通过一个列表来添加我的消息,但有没有更优雅的方法?

  2. 我有一个 XMPP 资源(名册http://www.igniterealtime.org/builds/smack/docs/latest/javadoc/org/jivesoftware/smack/Roster.html),我必须从所有 bean 访问它。我怎样才能做到这一点?将其存储到静态变量中并同步对它的访问听起来不太好。

【问题讨论】:

    标签: java design-patterns ejb-3.0 stateless


    【解决方案1】:

    Markus,我不是 J2EE 专家,但出于您的目的,我建议您查看 JMS。这将帮助您实现基于消息的方法。 至于我,我曾经使用 RabbitMQ 系统。这是一次很棒的体验,但运行系统需要额外的软件。

    【讨论】:

    • “问题”是如果发生错误和回滚,我不想发送此生成的消息,必须将其从队列中删除。我可以用jms完成吗?我没有这方面的经验。
    • 对不起,我可能会误会您的意思...您的意思是您不希望在发生错误或回滚时传递消息?
    • 正确。 :) 仅当事务提交成功时才应发送消息。在 service.process() 方法之后就足够了。所以我直接的解决方案是通过工作流传递一个列表并向其中添加消息。然后调度服务返回它,我发送消息。
    • 在 service.process() 成功的情况下,是什么阻止了您严格发送 JMS 消息?
    • 当队列专门用于我的线程时,我认为它可以正常工作。这可能吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    • 2015-06-02
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    相关资源
    最近更新 更多