0

Glassfish 3 の JMS キューからのすべてのメッセージを同期的に処理したいので、Glassfish ウィンドウの JMS Physical Destination でプロパティの Maximum Active Consumers を -1 から 1 に変更しようとしました。これを設定すると、OnMessage() を同時に実行する Consumer は 1 つだけになると思います。私が到達した問題は、そのプロパティを変更すると、次のエラーが発生したことです。

[I500]: Caught JVM Exception: org.xml.sax.SAXParseException: Content is not allowed in prolog.

[I500]: Caught JVM Exception: com.sun.messaging.jms.JMSException: Content is not allowed in prolog.

sendMessage Error [C4038]: com.sun.messaging.jms.JMSException: Content is not allowed in prolog.

メソッド onmessage() を同期させる別の方法を誰かが知っていれば、感謝します。これは私の消費者クラスです:

@MessageDriven(mappedName = "QueueListener", activationConfig = {
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
})
public class MessageBean implements MessageListener {



@Override
public void onMessage(Message message) {
    long t1 = System.currentTimeMillis();
    write("MessageBean has received " + message);
    try{

        TextMessage result=(TextMessage)message;
        String text=result.getText();
        write("OTAMessageBean message ID has resolved to " + text);
        int messageID=Integer.valueOf(text);

        AirProcessing aP=new AirProcessing();
        aP.pickup(messageID);


    }
    catch(Exception e){
        raiseError("OTAMessageBean error " + e.getMessage());
    }
   long t2 = System.currentTimeMillis();
   write("MessageBean has finished in " + (t2-t1)); 

}



}
4

2 に答える 2

2

Schedule私は同じ問題を抱えていました.私が見つけた唯一の解決策は、10秒ごとにキューからメッセージをポーリングするを設定することでした:

@Stateless
public class MyReceiver {
   @Resource(mappedName = "jms/MyQueueFactory")
   private QueueConnectionFactory connectionFactory;
   @Resource(mappedName = "jms/MyQueue")
   private Queue myQueue;
   private QueueConnection qc;
   private QueueSession session;
   private MessageConsumer consumer;


   @PostConstruct
   void init() {
       try {
         qc = connectionFactory.createQueueConnection();
         session = qc.createQueueSession(false, Session.CLIENT_ACKNOWLEDGE);
         consumer = session.createConsumer(myQueue);
         qc.start();
       } catch (JMSException e) {
         throw new RuntimeException(e);
       }
   }

   @PreDestroy
   void cleanup() throws JMSException {
     qc.close();
   }

   @Schedule(hour = "*", minute = "*", second = "*/10", persistent = false)
   public void onMessage() throws JMSException {
     Message message;
     while ((message = consumer.receiveNoWait()) != null) {
       ObjectMessage objMsg = (ObjectMessage) message;
       Serializable content;
       try {
         content = objMsg.getObject();

         //Do sth. with "content" here

         message.acknowledge();
       } catch (JMSException ex) {
         ex.printStackTrace();
       }
    }
  }
}
于 2012-09-21T12:57:20.717 に答える
1

JMS は本質的に非同期です。同期的に動作するように io に指示するための特定の構成はありません。メッセージの配信と消費の確認をあらゆる場所に追加することでシミュレートできますが、それは実際には JMS の意図した動作ではありません。RMI を試して、ここにリンクの説明を入力するか、HTTP (または SOAP や REST Web サービスのようなもの) を入力してください。

于 2012-09-21T10:43:17.300 に答える