Package io.mats3.spring
Annotation Type MatsClassMapping
-
@Documented @Retention(RUNTIME) @Target({TYPE,ANNOTATION_TYPE}) @Repeatable(MatsClassMappings.class) @Service public @interface MatsClassMappingA class annotated with this repeatable annotation will become a Mats Endpoint, where an instance of the class itself is the State (STO) object for the Endpoint, and each @Stage-annotated method on the class is a stage of the Endpoint. This annotation is meta-annotated with @Service, and is thus also a Spring bean. This singleton Spring bean acts as a "template" for the State, and any wired (injected/autowired) fields will be available for the stage-methods, but will not be regarded as part of the State when serialized and sent on the wire. You should use the Java-modifiertransienton such Spring-injected fields, so that the serializer understands that it is not a part of state. In addition, if a field is of typeProcessContext, it will be injected by the Mats JavaConfig machinery before a stage-method is invoked. All methods that are annotated with @Stageis regarded as a stage of the Mats Endpoint. To know the order of the stages, and ordinal must be assigned to the Stage - read its JavaDoc. The initial stage is the method annotated with@Stage(0)(The constantStage.INITIALis conveniently available), and the subsequent stages are the ordered list of these stage-methods. The last stage will typically have a return type - which defines the return type of the endpoint - while no other stage can have a return type. It is, however, still possible to return early if needed, by usingcontext.reply(..). If the last stage does not have a return type (i.e. it isvoid), it will be a Terminator. Any methods that are not annotated with@Stageis ignored, thus you may structure and divide your code into sub methods as you see fit. Note: If you only need a single stage, i.e. a single-stage Endpoint, or Terminator, you should instead considerMatsMapping. Note: You should mark the injected/autowired fields with the java keywordtransientto ensure that the serializer understands that it is not part of the state. (The values arenull'ed out before state serialization takes place, so an injected DataSource will never be attempted serialized as state. However, some type of serializers, e.g. Gson, will prepare to serialize all fields, even though they will always be null, and thus possibly fail on newer versions of Java. Such preparation does not take place if a field is marked transient.) Each stage-method can take zero, one, two or many arguments. The machinery looks for a ProcessContext and an incoming DTO argument. Neither ProcessContext nor an incoming DTO is required. The rationale for taking more than the required arguments is that you could potentially want to invoke it differently in a testing scenario (depending on how you feel towards testing).- 0: No ProcessContext nor incoming DTO.
- 1: Either it is a ProcessContext, otherwise it must be the incoming DTO.
- 2: If one is a ProcessContext, the other must be the incoming DTO.
- 2+: One may be the ProcessContext, and the others are searched for the @
Dtoannotation, and if one is found, this is the incoming DTO.
List<Car> cars = new ArrayList<>(). A field of type ProcessContext is not a state field. It is worth noting that the singleton Spring-constructed bean instance is never actually employed outside of being inspected at start up: Its class is inspected to set up the MatsEndpoint and its stages, and the singleton instance is used as a template for which fields of the Endpoint's State object are injected, and which fields are state. In a multi-MatsFactory setup, you may qualify which MatsFactory this Endpoint should be constructed on - read JavaDoc on @MatsMappingfor how this works.- See Also:
MatsMapping,MatsEndpointSetup
-
-
Optional Element Summary
Optional Elements Modifier and Type Optional Element Description java.lang.StringconcurrencyA string representing theconcurrencyof the Endpoint.java.lang.StringendpointIdThe Mats Endpoint Id that this endpoint should listen to.java.lang.StringmatsFactoryBeanNameSpecified theMatsFactoryto use by means of specifying the bean name of theMatsFactory.java.lang.Class<? extends java.lang.annotation.Annotation>matsFactoryCustomQualifierTypeSpecifies theMatsFactoryto use by means of a specific qualifier annotation type (which thus must be meta-annotated withQualifier).java.lang.StringmatsFactoryQualifierValueSpecified theMatsFactoryto use by means of specifying the@Qualifiervalue.java.lang.StringvalueAlias for "endpointId", so that if you only need to set the endpointId, you can do so directly:@MatsClassMapping("endpointId")
-
-
-
-
concurrency
java.lang.String concurrency
A string representing theconcurrencyof the Endpoint. Currently only digits are allowed, and the value is passed directly toInteger.parseInt(String). (In a future version it might be possible to specify a Spring SpEL expression, which would be evaluated against a context of the parent MatsFactory so that you could say "parentFactory * 2", and include the Spring Environment, so that you could say "env['mats.concurrency'] * 2" or similar constructs.)- Default:
- ""
-
-
-
matsFactoryCustomQualifierType
java.lang.Class<? extends java.lang.annotation.Annotation> matsFactoryCustomQualifierType
Specifies theMatsFactoryto use by means of a specific qualifier annotation type (which thus must be meta-annotated withQualifier). Notice that this will search for the custom qualifier annotation type, as opposed to if you add the annotation to the @MatsEndpointSetup-annotated method directly, in which case it "equals" the annotation instance (as Spring also does when performing injection with such qualifiers). The difference comes into play if the annotation has values, where e.g. a@SpecialMatsFactory(location="central")is not equal to@SpecialMatsFactory(location="region_west")- but they are equal when comparing types, as the qualification here does. Thus, if using this qualifier-approach, you should probably not use values on your custom qualifier annotations (instead make separate custom qualifier annotations, e.g.@MatsFactoryCentraland@MatsFactoryRegionWestfor the example).- Returns:
- the custom qualifier type which the wanted
MatsFactoryis qualified with.
- Default:
- java.lang.annotation.Annotation.class
-
-
-
matsFactoryQualifierValue
java.lang.String matsFactoryQualifierValue
Specified theMatsFactoryto use by means of specifying the@Qualifiervalue. Spring performs such lookup by first looking for actual qualifiers with the specified value, e.g.@Qualifier(value="the_value"). If this does not produce a result, it will try to find a bean with this value as the bean name.- Returns:
- the qualifier value which the wanted
MatsFactoryis qualified with.
- Default:
- ""
-
-