【问题标题】:Firing events in seam components接缝组件中的触发事件
【发布时间】:2012-07-20 05:33:31
【问题描述】:

我有一个使用请求的 Web 服务(jboss seam),它进一步将其工作委托给不同的接缝组件。其中一个接缝组件具有事件生成功能,即 Events.instance().raiseTransactionSuccessEvent,不会调用正在侦听此事件的方法。

我是否缺少任何配置?

请推荐

【问题讨论】:

    标签: events jboss seam


    【解决方案1】:
    1. 确保在从 Web 服务调用 Seam 组件时启动事务。如果没有,请手动启动它。
    2. 确保事务实际提交。

    【讨论】:

    • 感谢您的回复。我通过添加 在 components.xml 文件中配置了容器管理的事务。根据文档,在调用 EJB 时会透明地启动事务(在我的情况下,它将通过 Web 服务调用来调用)。我不确定调用 EJB 时开始的事务范围是什么。在我的例子中,EJB 使用 Web 服务调用,然后将工作委托给其他非 EJB 接缝组件。感谢您的帮助。
    【解决方案2】:

    @Tair

    我有一个 ejb 组件,它使用如下 Web 服务请求

    @Name("plugin")
    @Stateless
    @WebService(name = "PluginService", serviceName = "PluginService")
    public class PluginService implements IPlugin {
        @WebMethod
        public boolean createUser(String username, String password) {
            System.out.println("in login ");
            WebAuthenticator authenticator = (WebAuthenticator) Component
                    .getInstance("webauthenticator");
    
            usreCreated = authenticator.create(username, password);
            System.out.println("valid user "+validUser);
                    return userCreated;
    }
    }
    

    WebAuthenticator是一个seam组件如下

    @Name("webauthenticator")
    @Scope(ScopeType.CONVERSATION)
    
    public class WebAuthenticator {
    
        @In
        EntityManager entityManager;
    
            @Observer("test")
            public void test()
            {
            System.out.println("A transaction success event was fired");
            }
    
        private static Log log = (Log) Logging.getLog(WebAuthenticator.class);
        private static byte[] accountPassword = null;
        private static Account currentAccount = null;
    
        public boolean createUser(String username, String password) {
    
            System.out.println("In web authenticator");
                    User user = new User();
                    user.username = username;
                    user.password = password;
                    entityManager.persist(user);
                    entityManager.flush();
                    Events.instance().raisTransactionSuccessEvent("test");
    }
    }
    

    在 components.xml 文件中,我有 <transaction:ejb-transaction />,因此 seam 可以获取有关容器事务事件的更新,并且我有 seam 管理的持久性上下文

        <persistence:managed-persistence-context
       auto-create="true" name="entityManager" persistence-unit-jndi-   name="java:/pilotEntityManagerFactory" />
    

    【讨论】:

      【解决方案3】:

      我想通了。 结论是永远不要将 ejb 事务与 seam 事务混合。 我明确禁用了 ejb 中的 ejb 事务管理。 成功了!!。

      【讨论】:

        猜你喜欢
        • 2021-08-19
        • 1970-01-01
        • 2016-08-09
        • 2010-12-14
        • 1970-01-01
        • 1970-01-01
        • 2020-04-16
        • 1970-01-01
        • 2022-06-30
        相关资源
        最近更新 更多