从客户端到服务器的多个通道创建

时间:2016-02-24 09:45:19

标签: java sockets session jpos

我使用jpos创建和解析ISO8583消息。我也在我的应用程序中使用线程池来同时创建n个ISO8583请求。我正在使用NACChannel将请求从客户端发送到服务器。服务器配置为处理30个不同的会话,每个会话的队列大小为20。 因此,从我的客户端应用程序,我同时发送许多ISO8583请求,但在服务器端,在单个会话上以顺序方式处理相同的请求。所以我的问题是

1)我如何发送请求以便使用jpos利用所有30个会话?

2)是否有其他方法可以在不同的会话中将此请求发送到服务器,以便服务器不会在单个通道中按顺序处理它?<​​/ p>

我正在使用以下内容创建频道:

NACChannel channel = new NACChannel(host,portnumber,packager,"xxxxyyyyzzzz".getBytes());

我也有同样的q2实现。在q2实现中,我能够异步处理请求响应,但是也使用单个会话。让我知道是否需要共享更多相同的代码。

2 个答案:

答案 0 :(得分:1)

使用MUX(如QMUX)。

MUX将允许您通过同一频道发送多条消息,并且可以正确匹配响应。

以jPOS-EE项目(http://jpos.org/doc/jPOS-EE.pdf)中的客户端模拟器为例。

请务必阅读http://jpos.org/doc/proguide-draft.pdf

答案 1 :(得分:0)

因此,如果我是客户端,我会配置与您想要服务器的连接数一样多的通道部署文件。 每个通道都有一个与之关联的多路复用器。在jpos muxpool deploy中包装所有这些多路复用器。这将作为一个巨大的多路复用器,可以循环选择多路复用器,从而选择通道。使用多路复用器发送请求(与使用多路复用器完全相同)。这样就可以利用所有连接,如果没有连接任何连接,则池足够智能,可以使用下一个连接的可用多路复用器。

e.g。 假设服务器正在侦听端口9000并允许2个连接。

我会按如下方式创建2个通道适配器,它们都指向主机和端口9000.确实看每个都有一个输入/输出元素。

<?xml version="1.0" ?>
<channel-adaptor name='HostConnection-1' 
    class="org.jpos.q2.iso.ChannelAdaptor" logger="Q2">
 <channel class=" org.jpos.iso.channel.NACChannel" logger="Q2" realm="channel-1"
       packager="org.jpos.iso.packager.GenericPackager">       
  <property name="packager-config" value="cfg/host-packager.xml" />
  <property name="host" value='127.0.0.1' />
  <property name="port" value="9000" />
  <property name="timeout" value="1000000" />
  <property name="keep-alive" value="true" />  
</channel>
 <in>host1-send</in>
 <out>host-receive</out>
 <reconnect-delay>10000</reconnect-delay>

<channel-adaptor name='HostConnection-2' 
    class="org.jpos.q2.iso.ChannelAdaptor" logger="Q2">
 <channel class=" org.jpos.iso.channel.NACChannel" logger="Q2" realm="channel-2"
       packager="org.jpos.iso.packager.GenericPackager">       
  <property name="packager-config" value="cfg/host-packager.xml" />
  <property name="host" value='127.0.0.1' />
  <property name="port" value="9000" />
  <property name="timeout" value="1000000" />
  <property name="keep-alive" value="true" />  
</channel>
 <in>host2-send</in>
 <out>host2-receive</out>
 <reconnect-delay>10000</reconnect-delay>
</channel-adaptor>

现在创建2个多路复用器。多路复用器将通道输入/输出到其输入/输出

<mux class="org.jpos.q2.iso.QMUX" logger="Q2" name="host-mux-1">
 <in>host1-receive</in>
 <out>host11-send</out>
 <ready>HostConnection-1.ready</ready> <!-- needs to be adaptor name + .ready-->
 <unhandled>host-unhandled</unhandled>

<mux class="org.jpos.q2.iso.QMUX" logger="Q2" name="host-mux-2">
 <in>host2-receive</in>
 <out>host12-send</out>
 <ready>HostConnection-2.ready</ready> <!-- needs to be adaptor name + .ready-->
 <unhandled>host-unhandled</unhandled>
</mux>

现在创建一个muxpool部署文件。

<mux class="org.jpos.q2.iso.MUXPool" logger="Q2" name="host-mux">
 <muxes>host-mux-1 host-mux-1</muxes>
 <strategy>round-robin</strategy>
</mux>

从jpos的nameregistrar实例获取名称的muxpool并触发请求。它使用池中配置的多路复用器以循环方式触发请求。

当它的连接数量很少时,这种方法很有效,随着数量的增加,您可能需要以编程方式考虑创建这些通道和多路复用器。