我想以同步方式处理来自Glassfish 3中JMS队列的所有消息,因此我尝试在Glassfish窗口的JMS物理目标中将属性Maximum Active Consumers从-1更改为1。我想设置这个我将只有一个Consumer同时执行OnMessage()。我遇到的问题是,当我更改该属性时,我收到了这个错误:
[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));
}
}
答案 0 :(得分: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();
}
}
}
}
答案 1 :(得分:1)
JMS本质上是异步的,你没有特定的配置来告诉io同步行为。您可以通过在任何地方添加消息传递和使用确认来模拟它,但这并不是JMS的工作方式。尝试RMI enter link description here或者HTTP(或者像SOAP或REST Web服务一样)