我是Java Messaging Service的新手,并不完全确定它是如何工作的。我在NetBeans中使用JMS和Java EE项目。我使用的服务器类型是glassfish 3。以下是我的情况:
我有一个程序,它创建了两个线程a和b。这两个线程通过我创建的两个队列服务器资源在彼此之间来回发送消息。下面是假定在a和b之间来回传递的一系列消息。
应该发生什么:
1. A is started
2. B is started
3. A sends B a message, M1 ( producer.send(m1) )
4. B receives M1 and does some stuff ( consumer.receive() )
5. B sends A a message, M2
6. A receives M2 and does some stuff
7. A sends B a message, M3
8. B receives M3 and does some stuff
实际情况:
1. A is started
2. B is started
3. B receives M3 and does some stuff ( consumer.receive() )
自从我在所有正在发送的消息之间的某个地方执行了session.commit()之后,这个场景就开始弹出。这几乎就像我把队列的状态提交给了某个文件或服务器,现在每次我运行程序时,它都会根据保存的状态初始化队列。
我首先添加提交的原因是因为我的一个消息M2没有被线程A接收。线程B到达了它通过producer.send(M2)(其中producer是一个MessageProducer对象)将M2发送给线程A的代码部分。线程A只挂在consumer.receive()上(其中consumer是一个MessageConsumer对象)。我仔细检查了一下,看看我是否将M2发送到正确的队列资源。
我终于想通了。事实证明,每次线程B发送消息时,我都需要session.commit()。此外,我的代码中有一个错误,导致程序过早结束,这意味着仍然有未接收到的消息,这些消息将延续到下一个运行时。我最终做的是修复这个问题,只是在consumer.receive(100)周围循环,直到它在开始我的线程之前返回一个空值。