从Mule中的VM队列读取以在EmailingService中发送电子邮件

时间:2012-12-19 14:39:12

标签: java web-services java-ee queue mule

我正在开发一个安静的网络服务,其中网络服务的目的是根据请求发送电子邮件。

我们决定使用Mule来实现这一目标。我们在mule中定义了一个流,它接受请求(POST)然后将其写入队列。然后会有另一个流从这个队列中读取,然后使用sendmail或任何其他java邮件api发送消息。

我负责创建一个从队列中读取然后发送电子邮件的流程。下面是将消息写入队列的mule_config.xml流:

   <!-- This is the persistent VM connector -->
   <vm:connector name="mailQueueConnector" queueTimeout="1000">
         <vm:queue-profile>
        <file-queue-store />
         </vm:queue-profile>
   </vm:connector>


    <flow name="MailService">
        <https:inbound-endpoint address="https://localhost:71234/message/email"
            method="POST"
            exchange-pattern="request-response"
            contentType="application/xml"/>

        <vm:outbound-endpoint path="mailQueue" connector-ref="mailQueueConnector">
            <message-property-filter pattern="http.status=200" />
            <logger message="INTO mailQueue" level="INFO"/>
        </vm:outbound-endpoint>
        <response>
            <message-property-filter pattern="http.status=200" />
            <script:transformer>
                <script:script engine="groovy">
                    <script:text>
                        import groovy.xml.*
                        def writer = new StringWriter()
                        def xml = new MarkupBuilder(writer)
                        xml.ApiMessage {
                            returnCode("200")
                            reason("Queued Succesfully!!!")
                        }
                        return writer.toString()
                    </script:text>
                </script:script>
            </script:transformer>
        </response>
    </flow>

从上面我可以看到,点击入站端点“https:// localhost:71234 / message / email”的POST电子邮件请求被写入队列“mailQueue”。但是对于我的任务,我如何阅读队列中的电子邮件并将其序列化为电子邮件对象,以便我可以在java中编码以发送该电子邮件?我假设我必须为此写一个新的流程。我对吗?请允许任何人在这里指出我正确的方向。

1 个答案:

答案 0 :(得分:2)

使用以下命令创建新流程:

  • 消耗vm:inbound-endpoint路径的mailQueue
  • 可选择使用变压器来准备邮件正文。
  • 发送电子邮件的smtp:outbound-endpoint,使用MEL表达式表示其不同的属性(to,subject ...)。

编辑 - OP现在希望通过HTTP和内部可以从外部访问流。添加了一个复合源来执行此操作:

<flow name="emailer">
    <composite-source>
        <https:inbound-endpoint address="localhost:71234/message/sendEmail"
            method="POST" exchange-pattern="request-response"
            contentType="application/xml" />
        <vm:inbound-endpoint path="mailQueue"
            connector-ref="mailQueueConnector">
    </composite-source>
    <!-- Add transformers here if needed -->
    <smtp:outbound-endpoint ... />
</flow>