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