Skip to content

QFJ Dynamic Acceptor Session

Baoying Wang edited this page Nov 23, 2017 · 1 revision

Introduction

QuickFixJ support dynamic acceptor session, as mentioned: http://www.quickfixj.org/quickfixj/usermanual/1.5.3/usage/acceptor_dynamic.html That means, you can avoid hardcode the session information in the configuration file. Then, you would accept all session logon, and check the Logon based on business requirement.

Have a quick check on this article, and plan the DefaultDynamicSessionQFJServer.java + DefaultDynamicSessionQFJServer.qfj.config.txt directly of my QFJTutorial project.

How

  • setup AcceptorTemplate=Y in your qfj configuration file AcceptorTemplate=Y
    note:you can skip the sender/target comp id e.g.
[session]
AcceptorTemplate=Y
ConnectionType=acceptor
  • setup sessionProvider as DynamicAcceptorSeesionProvider on your SocketAcceptor. note: this step is NOT required for non-dynamic acceptor. note: pls set the provider, before connect(). Otherwise, the default provider would be used.

e.g.

log.info("dynamic acceptor is configured");
AcceptorSessionProvider provider = new DynamicAcceptorSessionProvider(_settings, sessionID,
		_application, _storeFactory, _logFactory, new DefaultMessageFactory());
// SocketAcceptAddress
// SocketAcceptPort
SocketAddress address = new InetSocketAddress(_settings.getString(sessionID, "SocketAcceptAddress"),
		(int) (_settings.getLong(sessionID, "SocketAcceptPort")));
((ThreadedSocketAcceptor ) _connectorAsAcc).setSessionProvider(address, provider);

Extension

You could also define your own dynamic session provider, by referring how DynamicAcceptorSeesionProvider, and how it is used.

Please also refer below stack, while implementing your own session provider. Stack Trace of get session

Thread [NioProcessor-2] (Suspended (breakpoint at line 131 in DynamicAcceptorSessionProvider))	
	owns: DynamicAcceptorSessionProvider  (id=59)	
	DynamicAcceptorSessionProvider.getSession(SessionID, SessionConnector) line: 131	
	AcceptorIoHandler.findQFSession(IoSession, SessionID) line: 120	
	AcceptorIoHandler(AbstractIoHandler).messageReceived(IoSession, Object) line: 114	
	DefaultIoFilterChain$TailFilter.messageReceived(IoFilter$NextFilter, IoSession, Object) line: 854	
	DefaultIoFilterChain.callNextMessageReceived(IoFilterChain$Entry, IoSession, Object) line: 542	
	DefaultIoFilterChain.access$1300(DefaultIoFilterChain, IoFilterChain$Entry, IoSession, Object) line: 48	
	DefaultIoFilterChain$EntryImpl$1.messageReceived(IoSession, Object) line: 943	
	ProtocolCodecFilter$ProtocolDecoderOutputImpl.flush(IoFilter$NextFilter, IoSession) line: 405	
	ProtocolCodecFilter.messageReceived(IoFilter$NextFilter, IoSession, Object) line: 235	
	DefaultIoFilterChain.callNextMessageReceived(IoFilterChain$Entry, IoSession, Object) line: 542	
	DefaultIoFilterChain.access$1300(DefaultIoFilterChain, IoFilterChain$Entry, IoSession, Object) line: 48	
	DefaultIoFilterChain$EntryImpl$1.messageReceived(IoSession, Object) line: 943	
	DefaultIoFilterChain$HeadFilter(IoFilterAdapter).messageReceived(IoFilter$NextFilter, IoSession, Object) line: 109	
	DefaultIoFilterChain.callNextMessageReceived(IoFilterChain$Entry, IoSession, Object) line: 542	
	DefaultIoFilterChain.fireMessageReceived(Object) line: 535	
	NioProcessor(AbstractPollingIoProcessor<S>).read(S) line: 714	
	NioProcessor(AbstractPollingIoProcessor<S>).process(S) line: 668	
	NioProcessor(AbstractPollingIoProcessor<S>).process() line: 657	
	AbstractPollingIoProcessor<S>.access$600(AbstractPollingIoProcessor) line: 67	
	AbstractPollingIoProcessor$Processor.run() line: 1121	
	NamePreservingRunnable.run() line: 64	
	ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker) line: 1142	
	ThreadPoolExecutor$Worker.run() line: 617	
	Thread.run() line: 745	

Clone this wiki locally