3

我在当前项目中使用 Camel 2.9.x 进行集成。其中一个路由包含两个端点——文件轮询端点和 smtp 邮件端点。第一个端点生成的文件必须通过 smtp 端点作为附件发送。

对于 Camel 配置,我们使用 Spring DSL(这实际上是一个要求)。春季版本是 3.1.1。不幸的是,我只找到了在骆驼路线中将文件附加到电子邮件的 java dsl 示例和文档。

<endpoint uri="file:///path/to" id="file-source"/>
<endpoint uri="smtp://mail.example.com:25/?username=someuser@example.com&amp;password=secret&amp;to=recv@example.com" id="mail-dest"/>
<route id="simplified-for-readability">
  <from ref="file-source"/>
  <to ref="mail-dest"/>
</route>

此配置将文件作为纯文本/文本正文发送,而不是作为附件(甚至是二进制文件)。有没有办法在不使用 Java dsl 的情况下将文件作为附件发送?

4

4 回答 4

12

这可以通过 Spring 配置完成,但您可能必须编写一个简单的 java bean 左右,尽管这与 spring 或 java DSL 无关。

首先创建一个类似于这个的类(你可能需要在这里修复一些东西):

// Note: Content Type - might need treatment!
public class AttachmentAttacher{
   public void process(Exchange exchange){
      Message in = exchange.getIn();
      byte[] file = in.getBody(byte[].class);
      String fileId = in.getHeader("CamelFileName",String.class);
      in.addAttachment(fileId, new DataHandler(file,"plain/text"));
    }
}

然后只需连接一个弹簧豆并在您的路线中使用它。应该做的伎俩。

<bean id="attacher" class="foo.bar.AttachmentAttacher"/>

<route>
  <from ref="file-source"/>
  <bean ref="attacher"/>
  <to ref="mail-dest"/>
</route>
于 2012-06-14T22:36:24.303 回答
5

这对我有用,与上面的内容略有不同。

import javax.activation.DataHandler;
import javax.mail.util.ByteArrayDataSource;

import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.apache.camel.Processor;

public class AttachmentAttacher implements Processor {

  private final String mimetype;

  public AttachmentAttacher(String mimetype) {
    this.mimetype = mimetype;
  }

  @Override
  public void process(Exchange exchange){
    Message in = exchange.getIn();
    byte[] file = in.getBody(byte[].class);
    String fileId = in.getHeader("CamelFileName",String.class);
    in.addAttachment(fileId, new DataHandler(new     ByteArrayDataSource(file, mimetype)));
  }
}
于 2015-03-27T04:44:43.820 回答
0

对我来说,以下代码片段无需设置 MIME 类型即可工作:

(当然,您可以根据需要对其进行调整)

public class MyProcesor implements org.apache.camel.Processor {
    @Override
    public void process(Exchange exchange) throws Exception {
        String tempDir = System.getProperty("java.io.tmpdir");
        File file = new File(tempDir + "/filename.ext" ); //or wherever you file is located
        exchange.getIn().addAttachment("id", new DataHandler(new FileDataSource(file))); //no explicit MIME-type needed
    }    
}

但是,我没有这个 Spring DSL 的代码......

于 2019-12-06T07:48:37.613 回答
-1

您可能可以使用诸如simple之类的表达式来执行此操作。简单很好,因为它带有骆驼,但我认为它的功能不足以做你想做的事。我还没有尝试过,但我确信一个时髦的表达可以做到这一点。可以在 Spring 中指定一个 groovy 表达式。

于 2012-10-25T13:34:25.877 回答