0

我是 Java 消息服务的新手,并不能完全确定它是如何工作的。我在 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 将 M2 发送到线程 A )(其中 producer 是 MessageProducer 对象)。线程 A 只会挂在 consumer.receive() 上(其中 consumer 是 MessageConsumer 对象)。我仔细检查了是否将 M2 发送到正确的队列资源。

4

1 回答 1

0

我终于弄明白了。事实证明,每次线程 B 发送消息时,我都需要 session.commit()。此外,我的代码中存在错误并导致程序过早结束,这意味着仍有未收到的消息,这些消息将延续到下一次运行时。我最终解决这个问题的方法只是在 consumer.receive(100) 周围循环,直到它在启动我的线程之前返回一个空值。

于 2013-04-15T23:38:36.390 回答