m.SessionContext) error { opts := &options.TransactionOptions{ReadPreference: readpref.Primary( )} //关键代码,如果事务中全是写入操作,此处不必指定 err := sessionContext.StartTransaction(opts) // 后续的db操作要用事务就用 sessionContext // 不用事务就用ctx,正常情况下,开启事务后,里面的db操作都应该使用事务的sessionContext //err = mongo.MongoDBCurd = nil { _ = sessionContext.AbortTransaction(sessionContext) return err } _ = sessionContext.CommitTransaction(sessionContext) return nil }) 参考文献 https://www.mongodb.com
artemis/core/protocol/core/impl/ActiveMQSessionContext.java public class ActiveMQSessionContext extends SessionContext inClose && mayAttemptToFailover) { sessionContext.recreateSession(username, password consumerInternal.isClosed()) { sessionContext.recreateConsumerOnServer(consumerInternal = null) { sessionContext.xaFailed(currentXID); rollbackOnly (),而handleFailover方法在recreateConsumerOnServer之后的finally里头会执行sessionContext.releaseCommunications() 小结
artemis/core/protocol/core/impl/ActiveMQSessionContext.java public class ActiveMQSessionContext extends SessionContext inClose && mayAttemptToFailover) { sessionContext.recreateSession(username, password consumerInternal.isClosed()) { sessionContext.recreateConsumerOnServer(consumerInternal = null) { sessionContext.xaFailed(currentXID); rollbackOnly (),而handleFailover方法在recreateConsumerOnServer之后的finally里头会执行sessionContext.releaseCommunications() 小结
sessionContext); void reset(); void close(); void incrementRefCount(); int decrementRefCount arriving; private int refCount; protected boolean serverRespondedWithFail; protected SessionContext public SimpleString getAddress() { return address; } @Override public void init(SessionContext sessionContext) { // We initial request twice as many credits as we request in subsequent requests = sessionContext; this.sessionContext.linkFlowControl(address, this); } @Override
// We can only log these exceptions // maybe we should cache it on SessionContext 的handleReceiveProducerCredits方法 SessionContext activemq-artemis-2.11.0/artemis-core-client/src/main/java /org/apache/activemq/artemis/spi/core/remoting/SessionContext.java public abstract class SessionContext 做不同的处理,当type为SESS_PRODUCER_CREDITS时执行handleReceiveProducerCredits方法;handleReceiveProducerCredits调用的是父类SessionContext 的handleReceiveProducerCredits方法;SessionContext的handleReceiveProducerCredits方法执行的是ClientSessionInternal
// server's on which case we can't' convert the message into large at the servers if (sessionContext.supportsLargeMessage (msgI); theCredits.acquireCredits(creditSize); sessionContext.sendFullMessage(msgI, sendBlocking } //...... } doSend方法最后执行的是largeMessageSend或者sendRegularMessage方法,而sendRegularMessage方法最后执行的是sessionContext.sendFullMessage artemis/core/protocol/core/impl/ActiveMQSessionContext.java public class ActiveMQSessionContext extends SessionContext artemis/core/protocol/core/impl/ActiveMQSessionContext.java public class ActiveMQSessionContext extends SessionContext
preAcknowledge) { return; } checkClosed(); startCall(); try { sessionContext.sendACK finally { endCall(); } } //...... } ClientSessionImpl的individualAcknowledge方法通过sessionContext.sendACK 来发送ack sessionContext.sendACK activemq-artemis-2.11.0/artemis-core-client/src/main/java/org/apache/activemq artemis/core/protocol/core/impl/ActiveMQSessionContext.java public class ActiveMQSessionContext extends SessionContext lastAckedMessage不为null的先执行flushAcks,最后执行session.individualAcknowledge;ClientSessionImpl的individualAcknowledge方法通过sessionContext.sendACK
templateParam 假如模板中存在变量需要替换则为必填项 * @param string $extendCode 可选项,7位上行短信扩展码 * @param string $sessionContext 携带上下文信息,server 会原样返回 */ public function send($phoneNumbers, $templateParam, $extendCode = '', $sessionContext ]; if ($extendCode) { $data['ExtendCode'] = $extendCode; } if ($sessionContext ) { $data['SessionContext'] = $sessionContext; } return $this->post('ap-guangzhou
preAcknowledge) { return; } checkClosed(); startCall(); try { sessionContext.sendACK finally { endCall(); } } //...... } ClientSessionImpl的individualAcknowledge方法通过sessionContext.sendACK 来发送ack sessionContext.sendACK activemq-artemis-2.11.0/artemis-core-client/src/main/java/org/apache/activemq artemis/core/protocol/core/impl/ActiveMQSessionContext.java public class ActiveMQSessionContext extends SessionContext lastAckedMessage不为null的先执行flushAcks,最后执行session.individualAcknowledge;ClientSessionImpl的individualAcknowledge方法通过sessionContext.sendACK
lombok.extern.slf4j.Slf4j; import org.apache.shiro.session.Session; import org.apache.shiro.session.mgt.SessionContext @author zhuyongsheng * @date 2019/8/15 */ @Override public Session createSession(SessionContext
ActiveMQClientLogger.LOGGER.failoverOrReconnect(connectionID, me); for (ClientSessionInternal session : sessions) { SessionContext session.getSessionContext(); if (context instanceof ActiveMQSessionContext) { ActiveMQSessionContext sessionContext = (ActiveMQSessionContext) context; if (sessionContext.isKilled()) { setReconnectAttempts } } } //...... } handleConnectionFailure方法会调用failoverOrReconnect方法,该方法会先遍历sessions,对于sessionContext.isKilled 来控制重试的间隔 小结 ClientSessionFactoryImpl的handleConnectionFailure方法会调用failoverOrReconnect方法,该方法会先遍历sessions,对于sessionContext.isKilled
对每个属性生成 getName(SessionContext ctx)、setName(String value) 及无 SessionContext 的便捷重载,内部调用 getProperty(ctx #83 // Method de/hybris/platform/jalo/JaloSession.getSessionContext:()Lde/hybris/platform/jalo/SessionContext ; 6: invokevirtual #90 // Method getProperty:(Lde/hybris/platform/jalo/SessionContext;Ljava/lang Getter 链路涉及一次 SessionContext 查找和一次 HashMap 查询,Service Layer 则可借助 ModelCache 减少锁竞争 (SAP Community, expertshybris.com
ActiveMQClientLogger.LOGGER.failoverOrReconnect(connectionID, me); for (ClientSessionInternal session : sessions) { SessionContext session.getSessionContext(); if (context instanceof ActiveMQSessionContext) { ActiveMQSessionContext sessionContext = (ActiveMQSessionContext) context; if (sessionContext.isKilled()) { setReconnectAttempts } } } //...... } handleConnectionFailure方法会调用failoverOrReconnect方法,该方法会先遍历sessions,对于sessionContext.isKilled 来控制重试的间隔 小结 ClientSessionFactoryImpl的handleConnectionFailure方法会调用failoverOrReconnect方法,该方法会先遍历sessions,对于sessionContext.isKilled
这两个方法主要是操作HashMap即ConcurrentHashMap<SwitchSessionKeyOF, SessionContext> sessionLot。 3.Hashmap中键值value是SessionContext,这个上下文包含了一个ModelDrivenSwitchImpl,实则是ODL对交换机的抽象。 抽象出来的ModelDrivenSwitchImpl进行再次包装,插入到SessionContext的notifaction队列当中。以便能够处理后续的notification消息。 4.在ModelDrivenSwitchImpl中有一个属性OFRpcTaskContext,这个属性是关联SessionContext以及Notification服务等。
callback := func(sessCtx mongo.SessionContext) (interface{}, error) { // Important: You must pass runTransactionWithRetry := func(sctx mongo.SessionContext , txnFn func(mongo.SessionContext) error) error { for { err := txnFn(sctx) // Performs transaction continue } return err } } commitWithRetry := func(sctx mongo.SessionContext) error { updateEmployeeInfo := func(sctx mongo.SessionContext) error { employees := client.Database("hr").Collection
com.github.dreamhead.moco.handler.AbstractResponseHandler import com.github.dreamhead.moco.internal.SessionContext DelayHandler(handler, time); } /** * * @param context */ @Override void writeToResponse(SessionContext
Servlet2.1之后不支持SessionContext里面getSession(String id)方法。 但是,我们可以通过HttpSessionListener监听器和全局静态map自己实现一个SessionContext。
// server's on which case we can't' convert the message into large at the servers if (sessionContext.supportsLargeMessage (msgI); theCredits.acquireCredits(creditSize); sessionContext.sendFullMessage(msgI, sendBlocking } //...... } doSend方法最后执行的是largeMessageSend或者sendRegularMessage方法,而sendRegularMessage方法最后执行的是sessionContext.sendFullMessage artemis/core/protocol/core/impl/ActiveMQSessionContext.java public class ActiveMQSessionContext extends SessionContext artemis/core/protocol/core/impl/ActiveMQSessionContext.java public class ActiveMQSessionContext extends SessionContext
ClientProducerCreditManager { ClientProducerCredits getCredits(SimpleString address, boolean anon, SessionContext final boolean anon, SessionContext public boolean isBlocked() { return false; } @Override public void init(SessionContext
DisabledSessionException(msg); } log.trace("Starting session for host {}", getHost()); SessionContext sessionContext = createSessionContext(); Session session = this.securityManager.start(sessionContext