【问题标题】:Glassfish - JMS Request/Response - message doesn't go on queueGlassfish - JMS 请求/响应 - 消息不在队列中
【发布时间】:2012-08-08 22:53:15
【问题描述】:

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

在基本的 Java POC 中,这是可行的。但是一旦我将服务器端代码放入容器中,它就不起作用了。

我关闭了作业,以便消息只会进入队列而不被拾取,然后我使用 QBrowser 跟随队列。

如果我只是从生产者那里发送消息,它会进入队列并可以被作业读取。

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

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

网络服务内部:

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>

【问题讨论】:

  • 我从未尝试过使用队列。我可以提供一个使用 Topic 的示例,但它与您的非常相似!也许问题出在 GlassFish 中 JMS 资源的定义中。可以发一下吗?
  • 编辑了 domain.xml 的定义。谢谢!
  • 原来是事务性问题。通过添加一个新方法来解决它:@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) private void sendMessage(MessageProducer producer, Message message) throws Exception{ producer.send(message); }
  • 太棒了。您可以回答自己的问题,以供其他人使用

标签: web-services glassfish jms openmq


【解决方案1】:

原来是交易问题。

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

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

【讨论】:

    猜你喜欢
    • 2012-01-03
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    • 2012-05-06
    • 2014-11-08
    • 2014-06-29
    • 2019-07-15
    • 2012-01-19
    相关资源
    最近更新 更多