Table of Contents |
---|
Transport adapter
Implementation
FEJ routing server provides the ability to integrate custom 3rdparty transports and use them for routing messages. For such goal server provides few interfaces for implementations:
...
Code Block | ||
---|---|---|
| ||
<bean id="endpointRegistry" class="com.epam.fej.routing.endpoint.EndpointRegistryAdapter" c:destinationsRegister-ref="destinationsRegister"/> |
JMS Transport Adapter
There are several ways to add JMS connectivity into FEJ container. fej-jms.xml
configuration file already contains basic configuration for JMS adapter:
...
Info | |||||
---|---|---|---|---|---|
Please note that
|
Custom connection factory instead of JNDI
Custom jms connection factory could be used in few ways:
Declaring
ConnectionFactory
in Spring and inject it inSimpleJmsContextFactory
:Code Block language xml <bean id="jmsConfigRegister" class="com.epam.fej.jms.DefaultJmsConfigsRegister" p:jmsManager-ref="jmsAdaptorManager" p:jmsContextFactory-ref="jmsContextFactory" c:config-ref="jmsConfig" init-method="init"/> <bean id="jmsConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory" c:brokerURL-ref="${jms.broker.url}"/> <bean id="jmsContextFactory" class="com.epam.fej.jms.SimpleJmsContextFactory" c:connectionFactory-ref="jmsConnectionFactory"/>
Implement your own
JmsContextFactory
and pass it as a parameter forDefaultJmsConfigRegister
:Code Block language java public class ActiveMqJmsContextFactory implements JmsContextFactory { @Override public JMSContext createContext(JmsConfig config) { return new SimpleJmsContext(new ActiveMQConnectionFactory( config.getConnectionInfo().getProviderURL()), config.getConnectionInfo()); } }
Code Block language xml <bean id="activeMqContextFactory" class="com.epam.fej.jms.ActiveMqJmsContextFactory"/> <bean id="jmsConfigRegister" class="com.epam.fej.jms.DefaultJmsConfigsRegister" p:jmsManager-ref="jmsAdaptorManager" p:jmsContextFactory-ref="activeMqContextFactory" c:config-ref="jmsConfig" init-method="init"/>
Persistence API
Persistent API provides easy and fast way to storing data. It support two main storages: PersistentSequence
and PersistentQueue
.
PersistentSequence
PersistentSequence
provides functionality for storing sequential data (for example, logs). Each record should have unique index. Indexer
implementation is used to provide index for certain storing record. Also PersistentSequence
requires custom Serializer
implementation to serialize objects to byte buffer and restore it back.
...
Default PersistentSequence
implementation is optimized for writing data and reading operations may take a bit more time.
PersistentQueue
PersistentQueue
works like a queue but persist all items to disk. Thus it can restore its state after application restart. PersistentQueue
has similar to java.util.Queue methods:
...
Code Block | ||
---|---|---|
| ||
//remove all items and clean file queue.clear(); |
Routing Rules
FIX Edge Java provides an RoutingRule
unit as an abstraction for internal message routing element. FEJ supports pure Java and Groovy implementations for routing rules.
RoutingRule requires few components for its instantiation:
Code Block | ||
---|---|---|
| ||
public RoutingRule(java.lang.String description,
SourceCondition sourceFilter,
RuleCondition contectFilter,
RuleAction action) |
description - String with free test description of rule
source filter - check if this rule should be applied to messages from certain source. This filter was added as a separate with propose of optimization process. Such filter can by applied on static basis without addition affect in runtime. Source filter is
SourceCondition
implementation and can be null if you’d like to ignore it.context filter - dynamic filter, which can check in the same time appliance of this rule depends on message content and source attributes. Context filter is
RuleCondition
implementation and can be null if you’d like to ignore it.action - implementation of
RuleAction
which describes the main goal of this rule. It can be transformation, modification or just resending to required destination.
Sample of routing rule:
Code Block | ||
---|---|---|
| ||
import com.epam.fej.routing.RoutingContext
import com.epam.fej.routing.rules.RoutingRule
import com.epam.fej.routing.rules.RuleAction
import com.epam.fej.routing.rules.RuleCondition
import static com.epam.fej.routing.CustomRoutingRules.getDefaultRules
import static com.epam.fej.routing.CustomRoutingRules.getRejectionRule
RoutingContext rc = routingContext as RoutingContext;
[
new RoutingRule(
// rule description
"some Rule",
//source filter - ignore for this rule
null,
// context filter - apply this rule for New Order - Single (D) messages
{ ctx -> ctx.getMessage().getTagValueAsString(35) == "D" } as RuleCondition,
// action for rule - resend message to all session within same group
// and stop message processing
{ ctx ->
rc.getDestinationsByGroup(ctx.sourceParams.groups).each { adapter ->
adapter.send(ctx.message)
ctx.exit()
}
} as RuleAction),
// append system rejection rules for not processed messages
getRejectionRule(rc)
] |