这篇帖子是因为有次两个用户同时跑flashpaper的时候发现任务冲突导致一个用户转换失败,重试又可以了
1.首先回顾一下flashpaper的工作原理
flashpaper使用的是打印到文件的虚拟打印方式,所以要求当前用户(或用户组)具有使用打印服务的权限(不仅仅是打印机),不少人就卡在权限设置这里。因无法对networkservice直接设置权限,所以这里建议使用对用户授权的方式来解决这个问题(其实User组就可以打印)
2.并发问题
既然flashpaper使用的是打印到文件的方式,就必然要手工处理并发的问题,最简单的莫过于排队,或者不管,这样的话可以导致因无法获取资源而导致打印失败(这个地方是try不到的,也就是说只会有一个无法产生swf文件的结果,但是无法捕获这个异常)
3.其他问题
正常的话是出两个进程(flashprinter),权限有问题的话出一个,脚本等其他问题不对就一个都没有,所以不要总说权限怎么设置也不对,可能脚本本来就有问题
----------------------------------
分割线
----------------------------------
使用flashpaper有两个问题
1.权限
2.并发控制
这里提出一个目前来说比较合理的解决方案:
在application_start里启动一个单线程,并使用一个队列。
当需要转换swf时,将原始文件的加入到这个队列中,由守护线程每隔一定的时间检测此队列,将队列中的文件提取出来,模拟管理员权限进行转换。
首先这么做就解决了并发问题,其次也可以解决因权限造成的转换失败
先开坑
晚点再上代码
---参考代码--
public static void initFileProcessThread()
{
Thread thread = new Thread(new ThreadStart(transferFileFromTempThread));
thread.Start();
}
private static void transferFileFromTempThread()
{
while (true)
{
doFlashpapaerTransfer();
//休息一会
Thread.Sleep(1000 * 60 * 0.5);
}
}
private static void doFlashpapaerTransfer()
{
if( transferQueue.Count>0)
{
//deQueue,transfer from source to danse
}
}
//对外公开方法:加入到拷贝队列
public static void addToTransferQueue(string filepath)
{
//从temp向正式的拷贝,用到了一个自定义bean
addToTransferQueueQueue(new CopyBean {
SourceFile = uploadRootPath + filepath,
DenseFile = normalPath + filepath
});
}
private static void addToTransferQueue(CopyBean copyBean)
{
lock (transferQueue) {//必须使用线程同步
transferQueue.Enqueue(copyBean);
}
}
本文介绍 FlashPaper 在转换 PDF 至 SWF 文件过程中遇到的权限设置及并发问题,并提供一种通过单线程队列来处理这些问题的解决方案。

320

被折叠的 条评论
为什么被折叠?



