【问题标题】:Java Messaging Service issue with Java EE and glassfish serverJava EE 和 glassfish 服务器的 Java 消息服务问题
【发布时间】:2013-04-16 07:38:36
【问题描述】:

我是 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 到达了它的代码部分,它通过生产者将 M2 发送到线程 A。 send(M2)(其中 producer 是 MessageProducer 对象)。线程 A 只会挂在 consumer.receive() 上(其中 consumer 是 MessageConsumer 对象)。我仔细检查了我是否将 M2 发送到正确的队列资源。

【问题讨论】:

    标签: netbeans jms java-ee-6 glassfish-3


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2012-11-12
      • 2012-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-16
      • 2015-05-08
      • 1970-01-01
      相关资源
      最近更新 更多