2012-02-05 2 views
1

메시지 기반 EJB에 문제가 있습니다. MessageDrivenBean을 포함하고있는 웹 서비스와 EJB 애플리케이션이 너무 있습니다. 여기 을 내 코드는 다음과 같습니다 : JMS 및 MessageDriven EJB Bean

은 ObjectMessage에 사용하고 JMS I에 메시지를 보내려면
 Connection connection = connectionFactory.createConnection(); 
     Session session = connection.createSession(false, 1); 
     MessageProducer messageProducer = session.createProducer(queue); 
     ObjectMessage outMessage = session.createObjectMessage(); 
     outMessage.setObject(((Serializable) operation)); 
     LOGGER.debug("Sending message..."); 
     messageProducer.send(outMessage); 
     LOGGER.debug("Sending message: done."); 
     messageProducer.close(); 
     session.close(); 
     connection.close(); 

나는뿐만 아니라이 메서드를 호출하고 내 웹 서비스 호출

. 이 메시지는 MDB에서 시작하여 처리를 시작합니다. MDB 코드는 다음과 같습니다.

@MessageDriven(mappedName = "jms/cbsDestination", activationConfig = { 
     @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"), 
     @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue") 
}) 
    public class OperationsBackgroundService implements MessageListener { 
      //Some code.... 
     public void onMessage(Message message) { 
    LOGGER.debug("Got message: " + message.toString()); 
    if (message instanceof ObjectMessage) { 

     ObjectMessage objectMessage = (ObjectMessage) message; 
     Operation operation = null; 
    } 

모두 괜찮습니다. 메시지가 표시되면 처리가 시작되고 예상대로 종료됩니다.

그러나 문제는 다음과 같습니다. MDB에 첫 번째 메시지를 보내면 처리가 시작되고 (확인), 첫 번째 메시지가 처리 될 때 두 번째 메시지를 내 MDB로 보내고 프로세스도 시작합니다. 엉덩이 나는 하나의 메시지를 보내고 하나가 처리중인 경우 다른 메시지는 첫 번째 메시지가 처리 될 때까지 대기한다는 것을 JMS가 특징으로한다는 것을 알고 있습니다. 아니면 여기에 뭔가 빠졌나요? 도와주세요. 어쩌면 내가 설정하는 것을 잊었던 속성이 있을까요?

감사 ID는 전진했습니다.

답변

0

응용 프로그램 서버가 두 개 이상의 인스턴스 인 OperationsBackgroundService을 생성하고 각 인스턴스를 소비자로 등록했습니다. 각 소비자는 한 번에 하나의 메시지 만 처리 할 수 ​​있지만 두 명의 소비자가있는 경우 2 개의 메시지를 동시에 처리 할 수 ​​있습니다. 이것은 기능이 아니라 버그입니다.

단일 스레드 처리를 수행하려는 경우 응용 프로그램 서버에 MDB 당 하나의 소비자 만 만들도록 지시하십시오. 이것이 어떻게 구성되는지 보려면 응용 프로그램 서버 설명서를 참조하십시오.

+0

글래스 피쉬 2.1.1을 사용하고 있지만 MDB 당 하나의 소비자를 만드는 방법에 대한 정보는 찾을 수 없습니다. 누군가 날 보여줄 수 있을까요? 감사합니다. –

+0

@PauliusMatulionis : [Message-Driven Bean 조정] (http://docs.oracle.com/cd/E18930_01/html/821-2431/abebw.html#abedi) - Glassfish 3, 그러나 그것은 당신에게 올바른 방향을 지적해야합니다. 힌트 : * 풀 크기 * –

+0

정확히 한 번에 하나의 메시지 만 처리하려는 경우 MDB 풀을 단일 인스턴스 (이상한 사용 사례 일 수도 있지만 가능)로 제한해야합니다. – Kris

관련 문제