2017-09-07 16 views
0

activemq를 사용하여 ejb mdb에서 작업하고 있습니다. iam이 대기열에서 메시지를 읽고 데이터를 데이터베이스에 저장하면 데이터를 저장할 수 있습니다. 데이터베이스로 보내지 만 mdb가 큐에서 메시지를 가져 오면 한 메시지가 부분적으로 데이터베이스에 저장되고 다른 메시지가 처리됩니다. 하나씩 데이터베이스에 메시지를 저장하고 싶습니다. 아무도 도와 줄 수 없습니다.MDB 및 Java에서 activemq를 사용하여 직렬 프로세스를 만드는 방법

답변

1

EJB가 분산 처리를 돕습니다. MDB는 바인딩 된 큐 또는 주제에 도착하는 여러 메시지를 처리하여 시스템을 확장하는 데 도움을줍니다.

풀에 몇 개의 빈을 넣고 메시지를 소비하는지 구성하는 구성이 있습니다. 이 값을 1로 설정하면 예상대로 작동합니다 (하나의 앱 서버가 있다고 가정).

그러나 실제로 메시지를 하나씩 처리하려면 MDB를 사용하는 것이 의미가 없습니다. MessageListener를 구현하는 일반 Java 클래스를 작성할 수 있습니다. 하지만 이렇게하면 전체 프로세스가 느려지고 메시지가 대기열에 계속 누적 될 가능성이 있습니다.

0

@Amit에 대한 설명은 정확합니다. maxSession을 1로 구성하면 예상되는 동작이됩니다. 이것은 단일 영사를 달성하는 가장 깨끗한 방법입니다.

시간당 MDB를 1 회만 실행하지 않아도되지만 특정 시간에 하나의 스레드 만 코드 (예 : db 업데이트)를 실행하는 경우에만 EJB3.1에있는 Singleton을 사용할 수 있습니다 . 귀하의 코드처럼 보일 것입니다 : EJB 특정에서이, 하지만 낙담을 실현하려

@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