Glassfish - JMS请求/响应 - 消息不在队列中

时间:2012-07-28 18:33:14

标签: web-services glassfish jms openmq

我正在尝试使用包含的OpenMQ JMS队列在Glassfish 3.1.2中实现Web服务,该队列使用临时排队实现响应的同步JMS请求 - 响应。它发送一条消息,该消息由远程客户端作业从主队列中拾取(在容器外部运行),并在临时队列上接收响应。

在基本的Java POC中,这是有效的。但是,一旦我将服务器端代码放入容器中,它就无法工作。

我关闭了这个工作,这样消息才会进入队列而不被接收,我跟着QBrowser队列。

如果我只是从制作人那里发送消息,就会进入队列并且可以被作业读取。

但是一旦我添加了代码来接收()响应,消息在队列中是不可读的。 QBrowser说队列中有1条消息,但它被标记为UnAck并且队列显示为空(例如,消息不可读)。

connectionFactory和requestQueue从glassfish注入@Resource。主队列在glassfish中定义。

Web Service内部:

connection = connectionFactory .createConnection();
connection.start();

session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

MessageProducer producer = session.createProducer(requestQueue);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

MyObject myObj=new MyObject();
Message message=session.createObjectMessage(myObj);

TemporaryQueue responseQueue = session.createTemporaryQueue();
MessageConsumer consumer = session.createConsumer(responseQueue);

message.setJMSReplyTo(responseQueue);

producer.send(message);

//if I comment out the next line, the message appears on the queue. If I leave it in, it will behave as described above.
Message response=consumer.receive();

我尝试了各种方法,包括单独的连接和会话以及异步使用者,并为生产者尝试了一个Transacted会话,但在尝试提交时只获得了堆栈跟踪。

我错过了什么才能让它正确进入队列?

提前致谢!

编辑:ConnectionFactory和Queue的Domain.xml引用:

<connector-connection-pool description="Connection factory for job processing" name="jms/MyJobs" 
    resource-adapter-name="jmsra" connection-definition-name="javax.jms.ConnectionFactory" 
    transaction-support=""></connector-connection-pool>
<connector-resource pool-name="jms/MyJobs" jndi-name="jms/MyJobs"></connector-resource>
<admin-object-resource res-adapter="jmsra" res-type="javax.jms.Queue"
   description="Queue to request a job process" jndi-name="jms/MyJobRequest">
   <property name="Name" value="MyJobRequest"></property>
</admin-object-resource>

[...]

  <resource-ref ref="jms/MyJobs"></resource-ref>
  <resource-ref ref="jms/MyJobRequest"></resource-ref>

1 个答案:

答案 0 :(得分:0)

原来是一个交易问题。

通过添加新方法来解决它:

@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) 
private void sendMessage(MessageProducer producer, Message message) throws Exception{   
         producer.send(message); 
}