Java JMS客户端会话使用

Java JMS客户端会话使用,java,.net,jms,websocket,kaazing,Java,.net,Jms,Websocket,Kaazing,我正试图利用.NET Kaazing客户端通过web套接字与JMS后端交互。我正在努力理解会话的正确用法。最初,我在所有线程中共享一个会话,但我注意到这是: 会话对象是用于生成和使用消息的单线程上下文。尽管它可以在Java虚拟机(JVM)之外分配提供者资源,但它被认为是一个轻量级JMS对象 我只参加一次会议的原因是因为我认为这样会产生更好的表现。由于文档声称会话是轻量级的,所以我毫不犹豫地将代码切换到每个“操作”使用一个会话。“操作”是指发送单个消息,或订阅队列/主题。在前一种情况下,会话是短暂

我正试图利用.NET Kaazing客户端通过web套接字与JMS后端交互。我正在努力理解会话的正确用法。最初,我在所有线程中共享一个会话,但我注意到这是:

会话对象是用于生成和使用消息的单线程上下文。尽管它可以在Java虚拟机(JVM)之外分配提供者资源,但它被认为是一个轻量级JMS对象

我只参加一次会议的原因是因为我认为这样会产生更好的表现。由于文档声称会话是轻量级的,所以我毫不犹豫地将代码切换到每个“操作”使用一个会话。“操作”是指发送单个消息,或订阅队列/主题。在前一种情况下,会话是短暂的,在消息发送后立即关闭。在后一种情况下,只要订阅处于活动状态,会话就需要持续

当我尝试创建多个会话时,出现了一个错误:

System.NotSupportedException: Only one non-transacted session can be active at a time
谷歌搜索这个错误是徒劳的,所以我尝试切换到事务会话。但在尝试创建消费者时,我会遇到另一个错误:

System.NotSupportedException: This operation is not supported in transacted sessions
看来我被困在岩石和坚硬的地方之间了。我看到的唯一可能的选择是跨线程共享我的会话,或者使用一个非事务性会话来创建使用者,以及为其他一切创建多个事务性会话。对我来说,这两种方法似乎都有点格格不入


谁能告诉我在客户端处理会话的正确方法吗?

有几种方法可以向应用程序添加并发性。您可以使用多个连接,但由于网络开销的增加,这可能是不可取的。更好的方法是通过调度任务或通过ConcurrentQueues传递消息,实现一种简单的机制来处理消息侦听器中的并发性。以下是实施策略的一些选择:

  • 基于任务的方法将使用TaskScheduler。在MessageListener中,将安排一个任务来处理工作并立即返回。例如,您可以为每条消息安排一个新任务。此时,MessageListener将返回,下一条消息将立即可用。这种方法适用于低吞吐量的应用程序(例如每秒几条消息),但您可能需要并发性,因为某些消息可能需要很长时间才能处理

  • 另一种方法是为挂起的工作()使用消息的数据结构。调用MessageListener时,每条消息都将添加到ConcurrentQueue中并立即返回。然后,一组单独的线程/任务可以使用适合您的应用程序的策略从该ConcurrectQueue中提取消息。这将适用于更高性能的应用程序

  • 这种方法的一种变体是为处理入站消息的每个线程提供一个ConcurrentQueue。在这里,MessageListener不会管理自己的ConcurrentQueue,而是将消息传递到与每个线程关联的ConcurrentQueue。例如,如果您有表示股票提要和新闻提要的入站消息,则一个线程(或一组线程)可以处理股票提要消息,另一个线程可以单独处理入站新闻项

  • 请注意,如果您使用的是JMS队列,则当MessageListener返回时,每个消息都将被隐式确认。这可能是您希望应用程序的行为,也可能不是


    对于更高性能的应用程序,您应该考虑方法2和3。

    < P>有几种方法可以向应用程序添加并发。您可以使用多个连接,但由于网络开销的增加,这可能是不可取的。更好的方法是通过调度任务或通过ConcurrentQueues传递消息,实现一种简单的机制来处理消息侦听器中的并发性。以下是实施策略的一些选择:

  • 基于任务的方法将使用TaskScheduler。在MessageListener中,将安排一个任务来处理工作并立即返回。例如,您可以为每条消息安排一个新任务。此时,MessageListener将返回,下一条消息将立即可用。这种方法适用于低吞吐量的应用程序(例如每秒几条消息),但您可能需要并发性,因为某些消息可能需要很长时间才能处理

  • 另一种方法是为挂起的工作()使用消息的数据结构。调用MessageListener时,每条消息都将添加到ConcurrentQueue中并立即返回。然后,一组单独的线程/任务可以使用适合您的应用程序的策略从该ConcurrectQueue中提取消息。这将适用于更高性能的应用程序

  • 这种方法的一种变体是为处理入站消息的每个线程提供一个ConcurrentQueue。在这里,MessageListener不会管理自己的ConcurrentQueue,而是将消息传递到与每个线程关联的ConcurrentQueue。例如,如果您有表示股票提要和新闻提要的入站消息,则一个线程(或一组线程)可以处理股票提要消息,另一个线程可以单独处理入站新闻项

  • 请注意,如果您使用的是JMS队列,则当MessageListener返回时,每个消息都将被隐式确认。这可能是您希望应用程序的行为,也可能不是


    对于更高性能的应用程序,您应该考虑方法2和3。

    谢谢您的回答,但您没有真正解决我的问题。我不了解何时以及如何创建会话-并发处理