我正在尝试使用包含的 OpenMQ JMS 队列在 Glassfish 3.1.2 中实现 Web 服务,该队列使用临时排队响应来实现同步 JMS 请求响应。它发送一条消息,该消息由远程客户端作业(在容器外运行)从主队列中提取,并在临时队列上接收响应。
在基本的 Java POC 中,这是可行的。但是一旦我将服务器端代码放入容器中,它就不起作用了。
我关闭了工作,以便消息只会进入队列而不被拾取,然后我使用 QBrowser 跟随队列。
如果我只是从生产者那里发送消息,它就会进入队列并且可以被作业读取。
但是,一旦我添加了代码来接收()响应,队列上的消息就无法读取。QBrowser 说队列中有 1 条消息,但它被标记为 UnAck 并且队列显示为空(例如消息不可读)。
connectionFactory 和 requestQueue 作为 glassfish 的 @Resource 注入。主队列在 glassfish 中定义。
Web服务内部:
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 和队列的 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>