我正在编写一个服务,它为无状态传入请求提供服务。这些请求都是数学计算,执行时间不长(最大2ms)。
我使用Tibco在客户机/服务器之间进行通信。提供客户端库,其封装客户端逻辑(例如,将数据转换为EMS消息等)并将请求发送到请求队列。服务器端处理请求并将响应发送到单独的队列中。这个很好用。
服务器端是多线程的.当接收到新的传入请求时,将创建一个新线程。因此,请求是同时处理的。
服务器端使用一个到EMS服务器的单独EMS连接。但是,由于EMS会话不是线程安全的,如果我希望能够在每个线程中写入对EMS队列的响应,则必须使用connectionFactory为每个线程创建一个会话。这降低了性能。
在交通上花费的时间约为3-4毫秒,即在发出请求和收到答复之间的时间约为5-6毫秒(运输3至4ms,法警/解法警3毫秒,计算2毫秒)。
是否有任何解决方案允许我在不创建两个JMS对象的情况下并发地发送到EMS队列?
为了进一步优化服务,我还需要遵循其他重要的规则吗?已经遵循了一些基本的优化准则:
非常感谢。
发布于 2015-01-30 12:59:26
您正在经历的行为并不是EMS特有的行为。行为是由JMS规范本身决定的。以下是JMS规范2.8节的摘录:
限制并发访问会话有两个原因。首先,会话是支持事务的JMS实体。很难实现多线程的事务。第二,会话支持异步消息消耗。重要的是JMS不要求用于异步消息消费的客户端代码能够处理多个并发消息。此外,如果一个会话是与多个异步使用者一起设置的,那么重要的是客户端不要被迫处理这些单独的使用者并发执行的情况。这些限制使JMS更容易用于典型客户端。更复杂的客户端可以通过使用多个会话获得他们想要的并发性。
如果您想避免创建(和销毁)那么多对象,您可能需要预先创建一个线程池,并预先为每个线程分配一个会话。
https://stackoverflow.com/questions/28223921
复制相似问题