我想知道是否有办法配置BizTalk以使业务流程不会不断地轮询文件的文件夹,而是“按需”检查文件。
通过“按需”,我的意思是我需要BizTalk“等待”Web服务调用(通过WCF端口),然后获取FTP文件夹中的文件并启动编排。
这是可行的吗?我读过“动态端口”可以用于此,是真的吗?
谢谢, 亚历克斯
答案 0 :(得分:3)
您可以在由WCF接收端口激活的业务流程中动态创建FILE(或FTP)接收位置。
Brian Loesgen blogged一个简单的代码示例,您的业务流程可以调用它来创建接收位置。如果服务器和文件夹名称没有从一个调用更改为下一个调用,那么每次都可以使用相同的接收位置,并在运行时激活/停用它。
这是另一个Stack Overflow问题,专门解决了在代码中激活接收位置的问题:Is there a way to automate turning a BizTalk Receive Location on or off through code? 在Visual Studio中创建一个新的类项目,添加一个对Microsoft.BizTalk.ExplorerOM的引用,编写几行代码,然后你就得到了你的帮助器组件了!
以下是创建和配置HTTP接收位置的示例from MSDN:
private void CreateAndConfigureReceiveLocation()
{
BtsCatalogExplorer root = new BtsCatalogExplorer();
try
{
root.ConnectionString = "Server=.;Initial Catalog=BizTalkMgmtDb;Integrated Security=SSPI;";
//First, create a new one way receive port.
ReceivePort myreceivePort = root.AddNewReceivePort(false);
//Note that if you dont set the name property for the receieve port,
//it will create a new receive location and add it to the receive //port.
myreceivePort.Name = "My Receive Port";
//Create a new receive location and add it to the receive port
ReceiveLocation myreceiveLocation = myreceivePort.AddNewReceiveLocation();
foreach(ReceiveHandler handler in root.ReceiveHandlers)
{
if(handler.TransportType.Name == "HTTP")
{
myreceiveLocation.ReceiveHandler = handler;
break;
}
}
//Associate a transport protocol and URI with the receive location.
foreach (ProtocolType protocol in root.ProtocolTypes)
{
if(protocol.Name == "HTTP")
{
myreceiveLocation.TransportType = protocol;
break;
}
}
myreceiveLocation.Address = "/home";
//Assign the first receive pipeline found to process the message.
foreach(Pipeline pipeline in root.Pipelines)
{
if(pipeline.Type == PipelineType.Receive)
{
myreceiveLocation.ReceivePipeline = pipeline;
break;
}
}
//Enable the receive location.
myreceiveLocation.Enable = true;
myreceiveLocation.FragmentMessages = Fragmentation.Yes;//optional property
myreceiveLocation.ServiceWindowEnabled = false; //optional property
//Try to commit the changes made so far. If the commit fails,
//roll-back all changes.
root.SaveChanges();
}
catch(Exception e)
{
root.DiscardChanges();
throw e;
}
}
答案 1 :(得分:1)
不幸的是,BizTalk为此提供的唯一功能是称为服务窗口,它允许您安排接收位置打开和关闭。
但是它非常严格,每24小时只有一个窗口。你也必须事先知道时间。
动态端口仅适用于发送消息,而不适用于接收消息。
答案 2 :(得分:0)
如果您以任何方式控制Web服务,那么您始终可以使用队列或数据库表松散地耦合这两个系统,即更改Web服务,以便在进行调用时,将BizTalk的消息放入队列/表。然后将业务流程挂钩到同一队列/表,以便“按需”获取文件。在您的情况下,这种情况可能并不完全合适,但这可能是您可以获得的最接近的......