2017-09-07 25 views
0

activemqを使用してejb mdbで作業しています。 iamがキューからメッセージを読み取り、データをデータベースに保存することができます。 mdbはキューからメッセージを取り出し、一方のメッセージは部分的にデータベースに保存し、別のメッセージが処理されます。 私はデータベースにメッセージを1つずつ保存したいのですが、助けてくださいJavaでMDBとactivemqを使用してシリアルプロセスを作成する方法

答えて

1

EJBは分散処理を支援します。 MDBは、バインドされているキューまたはトピックに到着した複数のメッセージを処理することにより、システムの規模を拡張するのに役立ちます。

プール内にいくつのBeanを置いてメッセージを消費するかという設定があります。 1に設定すると、期待どおりに動作します(1つのアプリケーションサーバーがあると仮定します)。

しかし、実際にメッセージを1つずつ処理したい場合は、MDBを使用することは意味がありません。 MessageListenerを実装するプレーンなJavaクラスを書くことができます。しかし、これによりプロセス全体が遅くなり、メッセージがキューに蓄積される可能性があります。

0

@Amitの説明は正しいです。maxSessionを1に設定すると、動作は期待通りになります。 これは単一の領事領事を受理する最もクリーンな方法です。

あなたの必要性は、時間あたりわずか1 MDBを実行することはありませんが、EJB3.1でシングルトンの存在を使用することができるよりも唯一、一定時間内に1つのスレッドのみのコード(たとえば、DB更新)を実行することを確認する場合。 あなたのコードは次のようになります:EJB特定からこの、しかし落胆をachiveする

@MessageDriven(...) 
public class MessageReceiver implements MessageListener { 

    @EJB(name = "DBSingleton") 
    private DBSingleton dbSingleton; 

    public void onMessage(Message jmsMessage) { 

     //here a lot of, time consuming operations 

     User u; //get it from jmsMessage 
     dbSingleton.updateUser(u); 
    } 
} 


@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER) 
@Singleton 
public class DBSingleton { 

    @EJB(name = "UserService") 
    private UserService userService; 

    @Lock(LockType.READ) 
    public User getUsers() { 
     return userService.getUser(); 
    } 

    @Lock(LockType.WRITE) 
    public void updateUser(User user) { 
     userService.updateUser(user); 
    } 
} 

UserService uses EntityManager to persist in DB (directly or indirectly through a DAO class) 


最後の道を、同期ブロックを使用することです。


参照してください: Concurrency in Message Driven Bean - Thread safe Java EE5 vs. EE6

関連する問題