当前位置: 首页 > 知识库问答 >
问题:

为什么是会话。CLIENT _ ACKNOWLEDGED未兑现?

宋伟泽
2023-03-14

我尝试使用< code>Session启动一个无事务的JMS会话。CLIENT_ACKNOWLEDGE作为确认模式。

不幸的是,当我开始会话时,确认模式总是< code >会话。AUTO_ACKNOWLEDGE为什么?

我正在从远程玻璃鱼客户端连接到玻璃鱼服务器(使用标准的嵌入式OpenMQ代理)。会话初始化代码为

    boolean transacted = false;
    int acknowledgeMode = Session.CLIENT_ACKNOWLEDGE;
    session = getConnection().createSession(transacted, acknowledgeMode);
    if(transacted!=session.getTransacted())
        throw new UnsupportedOperationException("seems like the broker doesn't want us to use untransacted connection");
    if(acknowledgeMode!=session.getAcknowledgeMode())
        throw new UnsupportedOperationException("seems like the broker doesn't want us to use Session.CLIENT_ACKNOWLEDGE");

[编辑1]

会话是从连接/连接工厂对中获取的,其中使用JNDI查找连接工厂:

connectionFactory = (ConnectionFactory) getContext().lookup(JMSConstants.CONNECTION_FACTORY_NAME);

因此,我确实可以使用远程连接工厂的默认设置,正如@raffian所建议的

共有1个答案

顾乐心
2023-03-14

因此,为了研究这一点,我创建了一个单元测试,其中我创建了会话,然后检查getTransactive()getAcknowledgeMode()的值。

这个测试显然证实了我在上面问的问题,也就是说,将Session.CLIENT_ACKNOWLEDGE结果键入到配置了Session.AUTO_ACKNOWLEDGE的JMS会话...什么?

是的,我也完全惊呆了。

所以我做了你们玩玻璃鱼时应该做的事。我安装了最新版本的Jadclipse,并重新启动了测试,尽可能地调试。

创建连接工厂似乎没问题

创建连接似乎也可以

但是创建会话是从那个代码开始的(从我在com.sun.messaging.jms.ra.ConnectionAdapter中的Jadclipse会话中复制出来的-看看ConnectionAdapter#create会话)。

 if (ResourceAdapter._isFixCR6760301())
 {
   localXASessionImpl = (XASessionImpl)this.xac.createSession(overrideTransacted(paramBoolean), overrideAcknowledgeMode(paramInt), (this.inACC) ? null : this.mc);
 }
 else {
   localXASessionImpl = (XASessionImpl)this.xac.createSession((this.mc.xaTransactionStarted()) ? true : paramBoolean, paramInt, (this.inACC) ? null : this.mc);
 }

显然,我的确认模式被对< code > connection adapter # overridacknowledgemode 的调用改写了。希望grepCode中的代码有这个非常有用的注释,这让我的一天非常愉快

        // EJB spec section 13.3.5 "Use of JMS APIs in Transactions" says
        // "The Bean Provider should not use the JMS acknowledge method either within a transaction 
        // or within an unspecified transaction context. Message acknowledgment in an unspecified 
        // transaction context is handled by the container." 
        // 
        // The same restriction applies in web container: JavaEE Spec: "EE.6.7 Java Message Service (JMS) 1.1 Requirements" says
        // "In general, the behavior of a JMS provider should be the same in both the EJB container and the web container.
        // The EJB specification describes restrictions on the use of JMS in an EJB container, 
        // as well as the interaction of JMS with transactions in an EJB container. 
        // Applications running in the web container should follow the same restrictions.

但是,不幸的是,我以一种有点奇怪的模式运行我的Glassfish客户端(不完全是在ACC中,但与它非常相似)。

那么,我能做什么呢?

哦,当然,我可以看看上面提到的臭名昭着的错误:CR6760301 .。嗯,似乎事实上,不,我不能(旁边,注意哪个高质量是甲骨文提供的常见问题解答......

所以剩下的唯一解决办法是……是的,为了疼痛,在创建会话之前插入一点静态

static {
    /*
     * Want to know why ? http://stackoverflow.com/q/19277018/15619 this is why
     */
    System.setProperty("imq.jmsra.fixCR6760301", Boolean.FALSE.toString());
}
 类似资料:
  • 本文向大家介绍Zookeeper 会话(Session)是什么?相关面试题,主要包含被问及Zookeeper 会话(Session)是什么?时的应答技巧和注意事项,需要的朋友参考一下 Session 可以看作是 ZooKeeper 服务器与客户端的之间的一个 TCP 长连接,通过这个连接,客户端能够通过心跳检测与服务器保持有效的会话,也能够向 ZooKeeper 服务器发送请求并接受响应,同时还能

  • 问题内容: 到目前为止,我了解Java中的Httpsession概念。 将根据请求创建一个会话对象。 将“字符串”和值与Session对象绑定。 将返回与指定字符串相关联的对象。 我无法理解的是:我正在创建一个会话对象 ,并通过调用为其设置名称。在这里,此代码位于服务器内部。对于每个人,当他尝试登录时,将在服务器中执行相同的代码。在此方法中,字符串值是一个常量。因此,创建的每个会话对象都将由我提供

  • 问题内容: 我了解对数据库事务处理概念的一般理解。我们访问事务内的数据库以确保ACID属性。 在Hibernate中,有一个称为会话的概念。会话的用途是什么?什么时候应该在两个会话中而不是在同一会话中进行数据库访问? 为了进一步说明,我已经看到了hibernate代码, 从会话工厂获取会话 打开会议 开始交易 提交交易 关闭会议 我需要知道的是在这里召开会议的重要性是什么?为什么没有像交易工厂这样

  • 我理解数据库事务概念的一般理解。我们在事务中访问数据库以确保ACID属性。 在Hibernate中有一个称为会话的概念。会话的用途是什么?何时应该在两个会话中而不是在同一会话中访问数据库? 为了解释更多,我看到了hibernate代码 从会话工厂获取会话 打开会话 开始事务 提交事务 关闭会话 我需要知道的是会话在这里的重要性是什么?为什么没有像事务工厂这样的东西,开始事务并提交事务?

  • 问题内容: JMS会话的目的是什么?为什么仅连接不足以在发送方和接收方之间交换JMS消息? 问题答案: 参见java.sun.com 会话对象是用于生成和使用消息的单线程上下文。尽管它可以在Java虚拟机(JVM)之外分配提供程序资源,但是它被认为是轻量级的JMS对象。 会话有几个目的: 它是为其消息生产者和消费者提供服务的工厂。 它提供了提供程序优化的消息工厂。 它支持单一系列的交易,将其生产者

  • 问题内容: 我对加密一无所知。我想知道会话秘密是什么。 我看到这样的代码: 什么是秘密,我应该更改吗? 问题答案: 是的,您应该更改它。连接中的会话秘密仅用于 计算哈希 。没有字符串,对会话的访问实质上将被“拒绝”。看一下connect docs ,应该会有所帮助。