我尝试使用< 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所建议的
因此,为了研究这一点,我创建了一个单元测试,其中我创建了会话,然后检查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 ,应该会有所帮助。