2012-06-29 67 views
0

我有一個使用請求的web服務(jboss seam),它將其工作進一步委託給不同的接縫組件。其中一個seam組件具有Event.instance()。raiseTransactionSuccessEvent事件生成功能,正在監聽此事件的方法不會被調用。在接縫組件中發射事件

我是否缺少任何配置?

請建議

回答

0

我想通了。 結論是永遠不要混合ejb交易與煤層交易。 我明確禁用了ejb中的ejb trasaction管理。 它的工作!

0
  1. 確保交易開始時,調用從您的Web服務Seam組件時。如果沒有,請手動啓動它。
  2. 確保事務實際提交。
+0

感謝您的回覆。我通過添加配置了components.xml文件中的容器管理事務。根據文檔,事務在調用EJB時​​透明地啓動(在我的情況下,它將由Web服務調用調用)。我不確定在調用EJB時​​開始的事務範圍是什麼。在我的情況下,EJB使用Web服務調用,然後將工作委派給其他非EJB接口組件。我會感謝你的幫助。 – user1000258

+0

任何人有任何想法????? – user1000258

+0

源代碼勝過千言萬語...... :) – Tair

0

@Tair

我有其消耗的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 EJB組件是一個接縫組分作爲在components.xml文件如下

@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"); 
} 
} 

,我有<transaction:ejb-transaction />,所以seam可以獲得關於容器事務的更新,並且我有seam管理的persist nce背景

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