1
2
3
4
5
6
7
8
9
10
11 package org.mule.construct;
12
13 import org.mule.DefaultMuleEvent;
14 import org.mule.RequestContext;
15 import org.mule.api.MuleContext;
16 import org.mule.api.MuleEvent;
17 import org.mule.api.MuleException;
18 import org.mule.api.MuleSession;
19 import org.mule.api.config.ThreadingProfile;
20 import org.mule.api.context.WorkManager;
21 import org.mule.api.endpoint.InboundEndpoint;
22 import org.mule.api.processor.MessageProcessor;
23 import org.mule.api.processor.MessageProcessorBuilder;
24 import org.mule.api.processor.MessageProcessorChainBuilder;
25 import org.mule.construct.processor.FlowConstructStatisticsMessageProcessor;
26 import org.mule.interceptor.LoggingInterceptor;
27 import org.mule.interceptor.ProcessingTimeInterceptor;
28 import org.mule.lifecycle.processor.ProcessIfStartedMessageProcessor;
29 import org.mule.processor.OptionalAsyncInterceptingMessageProcessor;
30 import org.mule.processor.chain.DefaultMessageProcessorChainBuilder;
31 import org.mule.session.DefaultMuleSession;
32 import org.mule.util.concurrent.ThreadNameHelper;
33
34 import java.util.Collections;
35 import java.util.List;
36
37
38
39
40
41
42
43
44
45
46 public class SimpleFlowConstruct extends AbstractFlowConstruct implements MessageProcessor
47 {
48 protected List<MessageProcessor> messageProcessors = Collections.emptyList();
49
50 protected WorkManager workManager;
51
52 public SimpleFlowConstruct(String name, MuleContext muleContext)
53 {
54 super(name, muleContext);
55 }
56
57 @Override
58 protected void configureMessageProcessors(MessageProcessorChainBuilder builder)
59 {
60 if (threadingProfile == null)
61 {
62 threadingProfile = muleContext.getDefaultServiceThreadingProfile();
63 }
64
65 final String threadPrefix = ThreadNameHelper.flow(muleContext, getName());
66
67 builder.chain(new ProcessIfStartedMessageProcessor(this, getLifecycleState()));
68 builder.chain(new ProcessingTimeInterceptor());
69 builder.chain(new LoggingInterceptor());
70 builder.chain(new FlowConstructStatisticsMessageProcessor());
71 if (messageSource != null)
72 {
73 builder.chain(new OptionalAsyncInterceptingMessageProcessor(threadingProfile, threadPrefix,
74 muleContext.getConfiguration().getShutdownTimeout()));
75 }
76 for (Object processor : messageProcessors)
77 {
78 if (processor instanceof MessageProcessor)
79 {
80 builder.chain((MessageProcessor) processor);
81 }
82 else if (processor instanceof MessageProcessorBuilder)
83 {
84 builder.chain((MessageProcessorBuilder) processor);
85 }
86 else
87 {
88 throw new IllegalArgumentException(
89 "MessageProcessorBuilder should only have MessageProcessor's or MessageProcessorBuilder's configured");
90 }
91 }
92 }
93
94 public void setThreadingProfile(ThreadingProfile threadingProfile)
95 {
96 this.threadingProfile = threadingProfile;
97 }
98
99 public void setMessageProcessors(List<MessageProcessor> messageProcessors)
100 {
101 this.messageProcessors = messageProcessors;
102 }
103
104 public List<MessageProcessor> getMessageProcessors()
105 {
106 return messageProcessors;
107 }
108
109 @Deprecated
110 public void setEndpoint(InboundEndpoint endpoint)
111 {
112 this.messageSource = endpoint;
113 }
114
115 @Override
116 public String getConstructType()
117 {
118 return "Flow";
119 }
120
121 public MuleEvent process(MuleEvent event) throws MuleException
122 {
123 MuleSession calledSession = new DefaultMuleSession(event.getSession(), this);
124 MuleEvent newEvent = new DefaultMuleEvent(event.getMessage(), event.getEndpoint(), event, calledSession);
125 RequestContext.setEvent(newEvent);
126 try
127 {
128 return messageProcessorChain.process(newEvent);
129 }
130 finally
131 {
132 RequestContext.setEvent(event);
133 }
134 }
135
136 }