I tried to use the StatefulFilter but I am not able to achieve what I just wanted. I have the below configuration for the server. For particular ISO fields (field 7) I want to I want to reply back with the same value as was sent by the client. If an inbuilt filter like org.jpos.iso.filter.StatefulFilter can do this I would not choose to add the logic through the code.

<server name="eSewa-server-65000" class="org.jpos.q2.iso.QServer" logger="Q2">
    <attr name="port" type="java.lang.Integer">65000</attr>
    <attr name="minSessions" type="java.lang.Integer">1</attr>
    <attr name="maxSessions" type="java.lang.Integer">5</attr>
    <property name="debug" value="true"/>


    <channel class="org.jpos.iso.channel.TelnetXMLChannel"
             packager="org.jpos.iso.packager.XMLPackager"
             type="server"
             logger="Q2"
             realm="server-channel-65000">
                <filter class="org.jpos.iso.filter.StatefulFilter" logger="Q2" realm="server-StatefulFilter-65000">
                    <property name="direction" value="outgoing"/>
                    <property name="saved-fields" value="7"/>
                </filter>
   
        <property name="timeout" value="30000"/>       
        <filter class="org.jpos.iso.filter.DebugFilter" direction="incoming"/>   

    </channel>

    <request-listener class="org.jpos.iso.IncomingListener" logger="Q2"
                      realm="incoming-request-listener">
        <property name="space" value="tspace:default"/>
        <property name="queue" value="TXNMGR"/>
        <property name="ctx.DESTINATION" value="jPOS-AUTORESPONDER"/>
        <property name="timeout" value="30000"/>
    </request-listener>
</server>
2

There are 2 best solutions below

0
Andrés Alcarraz On BEST ANSWER

You need to change the direction property to incoming, from the StatefulFilter javadoc on matchDirection:

What messages should I match?

INCOMING: outgoing messages will be matched against the previous incoming messages

OUTGOING: incoming messages will be matched against the previous outgoing messages

And it seems you want to match the previously incoming request, when you send a response to include the original DE 7.

You'd need to change the StatefulFilter definition to:

<filter class="org.jpos.iso.filter.StatefulFilter" logger="Q2" realm="server-StatefulFilter-65000">
    <property name="direction" value="incoming"/> 
    <property name="saved-fields" value="7"/>
</filter>

Actually, incoming is the default if not defined, because it's the most common use case, unless you want to match it in the channel that talks to the other end of your gateway. But (I believe) the most common use case if for retrieving something that precisely is lost in the internal use, but the client expects to receive the same value in the request.

Well it's not a much used filter and its implementation has some issues. For instance, it does not check the MTI matches, and you cannot add field 0 to the key, because the MTI of the response will not match the one of the request. It should do what QMUX does, but its implementation is too basic.

0
apr On

You don't need the StatefulFilter for your use case. When you reply to a message you usually use code like this:

ISOMsg r = (ISOMSg) m.clone(); // provided `m` is your request
r.setResponseMTI();
r.set(39, "XX"); // your error code

Then r becomes your response, that you set it in the Context so that the SendResponse can take it from there.

The clone() operation will preserve your original field 7.

The StatefulFilter can be used when you don't have access to the original request when it comes to build a response. It temporarily stores (default 1 minute) the original request in a local jPOS' Space, and pick it from there at response time.