我正在尝试使用包含的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>
答案 0 :(得分:0)
原来是一个交易问题。
通过添加新方法来解决它:
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
private void sendMessage(MessageProducer producer, Message message) throws Exception{
producer.send(message);
}