我很好奇是否有人对提供MSMQ访问的Java库有任何建议?我已经下载了J-Integra Java-COM库的试用版,并构建并运行了他们的MSMQ示例应用程序,但我很好奇是否有任何好的(免费:))替代品.我遇到了一些JNI实现,比如jMSMQ和其他几个,但是如果可能的话我宁愿避免使用JNI.
我们还调查了一些.NET < - > JMS互操作解决方案,如JNBridge(使用ActiveMQ).我认为我们公司决定将我们的排队集中在MSMQ中,这将是我们理想的解决方案.
我们希望在.NET端使用WCF(netMsmq或msmqIntegration).我有点担心java方面将如何处理WCF消息(二进制编码),但应该有那些选项(带有文本编码和MSMQ传输的customBinding?),所以我不太担心.主要担心在Java中访问MSMQ.
我们的另一个选择是在每个队列的输入端放置一个瘦Web服务层,并以这种方式实现互操作.然而,性能有点令人担忧.
有什么建议?非常感谢任何人的时间.
我正在编写一个Windows服务来使用MSMQ消息.该服务将具有高活动时段(80k消息很快进入)和长时间不活动(可能是几天没有新消息).
处理消息是非常网络限制的,所以我从并行性中获得了很大的好处.但是在不活动期间,我不希望绑定一堆线程来等待很快就会收到的消息.
MSMQ界面似乎非常关注同步工作流 - 获取一条消息,处理它,获取另一条消息等等.我应该如何构建我的代码,以便在高活动期间我可以利用并行性但不会占用一堆没有活动期间的线程?使用TPL的奖励积分.伪代码将不胜感激.
如何使用SignalR在.NET 4.0系统中实现通知,该系统由ASP.NET MVC 3应用程序(使用表单身份验证),SQL Server 2008数据库和MSMQ WCF服务(托管在WAS中)来处理数据?运行时环境包含在Windows Server 2008 R2 Standard Edition上运行的IIS 7.5.
我只玩了样本,没有广泛的SignalR知识.
这是一些背景知识
Web应用程序接受来自用户的数据并将其添加到表中.然后,它调用WCF服务的单向操作(使用数据库密钥)来处理数据(任务).Web应用程序返回到一个页面,告诉用户数据已提交,并在处理完成时通知他们.用户可以查看"索引"页面,查看哪些任务已完成,失败或正在进行中.他们可以继续提交更多任务(这与以前的数据无关).他们可以关闭浏览器并稍后返回.
基于MSMQ的WCF服务从数据库中读取记录并处理数据.这可能需要几毫秒到几分钟的时间.处理完数据后,记录会以相应的状态(错误或失败)和结果进行更新.
大多数情况下,WCF服务不执行任何处理,但是当它执行时,用户通常希望尽快知道何时完成.即使用户没有要由WCF服务处理的数据,用户仍将使用Web应用程序的其他部分.
这就是我所做的
在主导航栏中,我有一个指示器(类似于Facebook或Google+),供用户在任务状态发生变化时通知他们.当他们点击它时,他们会得到已完成的内容的摘要,然后可以根据需要查看结果.
使用jQuery,我轮询服务器的更改.控制器操作检查是否存在任何已修改(已完成或失败)的进程并返回它们,否则等待几秒钟并再次检查而不返回客户端.为了避免客户端超时,如果没有更改,它将在30秒后返回.jQuery脚本等待一段时间再试一次.
问题
每个查看页面的用户的性能都会下降.他们没有必要特别做任何事情.我们注意到Firefox 7+和Safari的内存使用量会随着时间的推移而增加.
使用SignalR
我希望切换到SignalR可以减少轮询,从而减少资源需求,尤其是在数据库中没有任何改变任务的情况下.我很难通过WCF服务来通知客户端它已完成处理任务,因为它使用基于表单的身份验证.
通过提出这个问题,我希望有人能够更好地了解他们如何使用SignalR重新设计我的通知方案,如果有的话.
我必须使用在IIS 7中托管的net.msmq协议的WCF服务.我的问题是,当队列中出现新消息时,服务不会激活,您必须先启动服务,然后才能启动拿起任何消息.
有没有办法自动激活这些服务?
在此先感谢您的帮助
亲切的问候,Brian
我在本地计算机上创建了一个私有MSMQ.我使用以下C#代码将消息发送到队列.当我将队列更改为事务时,消息未到达MSMQ.但是,Send方法中没有抛出异常.我需要做些什么改变才能让它发挥作用?
using System;
using System.Messaging;
using System.Data;
public partial class _Default : System.Web.UI.Page
{
//Sharing violation resulted from queue being open already for exclusive receive.
MessageQueue helpRequestQueue = new MessageQueue(@".\Private$\MyPrivateQueue", false);
protected void Page_Load(object sender, EventArgs e)
{
bool isTransactionalQueue = false;
if (!System.Messaging.MessageQueue.Exists(@".\Private$\MyPrivateQueue"))
{
System.Messaging.MessageQueue.Create(@".\Private$\MyPrivateQueue", isTransactionalQueue);
}
SendMessage();
GetAllMessages();
}
private void SendMessage()
{
System.Messaging.Message theMessage = new System.Messaging.Message("TimeNow is "+DateTime.Now.ToString());
theMessage.Label = "Lijo " + DateTime.Now.ToString();
theMessage.Priority = System.Messaging.MessagePriority.Normal;
helpRequestQueue.Send(theMessage);
}
private void GetAllMessages()
{
DataTable messageTable = …Run Code Online (Sandbox Code Playgroud) 我试图找出如何使内可用集群性能监控和我找不到似乎发现了什么,而搜索不是如何访问性能计数器等为集群.
情况是这样的:到目前为止,我们已经在单个服务器上设置了MSMQ,并且我们已经访问了队列计数(用于健康检查),如下所示:
ManagementScope scope = new ManagementScope(@"\\MachineName\root\CIMv2");
scope.Connect();
ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_PerfFormattedData_msmq_MSMQQueue WHERE Name = 'MachineName\private$\QueueName'");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
ulong? count = (from ManagementObject queue in searcher.Get()
select (ulong?)queue.GetPropertyValue("MessagesInQueue")).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试通过MSMQ集群的客户端访问点名称(代替MachineName)执行相同操作时,我得到了System.Management.ManagementException: Invalid Class,据我所知,这表明性能计数器不可用.这是有道理的,因为我们没有做任何特别的事情来使它们在集群上可用,因为我们不知道如何.
所以,任何方向都将非常感激.几周以来,我一直在为此而奋斗.
编辑:好的,我们已经多了一点,如果我们直接进入集群,表/类存在,但表中没有任何行.
找到NetNameForPerfCounters注册表项,但它看起来不适合我们的情况,因为我们只在主动节点上运行一个MSMQ实例,并且所涉及的所有服务器都是Windows Server 2008(我认为是R2).
我愿意让他们放入NetNameForPerfCounters reg键,但我找不到资源来告诉我它的去向.它是否进入客户端访问点的注册表(因为您可以将regedit连接到客户端访问点)?它是否会进入集群?在个别机器上?在客户端机器上?(猜猜我们可以把它放在任何地方只是为了测试它.)
EDIT2:我们尝试了NetNameForPerfCounters,它没有用.我们实际上有一个团队在微软复制我们的问题,所以我们已经开了一个重要的支持案例,它应该作为一个bug去产品团队.当我收到回复时会发布结果.
使用msmq我想发送一条消息(接近1 GB).我想发送字节数组.但我只能发送4 MB.我怎样才能解决这个限制?
我们正在使用Queue来完成少数WCF服务.我们对使用私有MSMQ的WCF服务使用NetMSMQ绑定.系统在我们的QA环境中正常运行.我不确定私有或公共队列之间是否存在任何真正的区别.客户端应用程序在单独的机器上仍然能够访问其他盒子上的WCF服务的专用队列.我不确定这是否是正确的做法.私人和公共MSMQ之间是否存在安全相关的差异?有人可以说明何时使用私人或公共MSMQ.
我正在运行NServiceBus 3.0.0 rc2但是当我启动应用程序(作为本地管理员)而没有预先创建MSMQ时,它出错了:
队列不存在或您没有足够的权限来执行操作.
使用NServiceBus 2.6没有发生这种情况.
以下是我的配置:
var bus = Configure.With()
.Log4Net()
.NinjectBuilder()
.XmlSerializer()
.DefiningCommandsAs(t => typeof(ICommand).IsAssignableFrom(t))
.DefiningEventsAs(t => typeof(IEvent).IsAssignableFrom(t))
.DefiningMessagesAs(t => typeof(IMessage).IsAssignableFrom(t))
.MsmqTransport()
.DefineEndpointName("subscriber.input")
.IsTransactional(true)
.PurgeOnStartup(false)
.UnicastBus()
.LoadMessageHandlers()
.ImpersonateSender(false)
.CreateBus()
.Start();
Run Code Online (Sandbox Code Playgroud)
和
<configuration>
<configSections>
<section name="MsmqTransportConfig" type="NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core" />
<section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core" />
</configSections>
<MsmqTransportConfig ErrorQueue="error" NumberOfWorkerThreads="1" MaxRetries="5" />
<UnicastBusConfig>
<MessageEndpointMappings>
<add Messages="MyEvents" Endpoint="publisher.input" />
</MessageEndpointMappings>
</UnicastBusConfig>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
</configuration>
Run Code Online (Sandbox Code Playgroud)
我可以看到一个配置扩展方法来禁用自动创建队列但没有启用它.
如果我预先创建队列,它工作正常.
我在控制台中使用netNamedPipeBinding绑定自托管WCF服务.该服务只有一个空方法Send(DataTable bulk)
[ServiceContract]
public interface IWcfQueueService
{
[OperationContract]
void Send(DataTable bulk);
}
public class WcfQueueService : IWcfQueueService
{
public void Send(DataTable bulk)
{
// Here would be something like _bulks.Add(bulk);
// BUT, for now it is empty method and still it's slower than MSMQ
}
}
Run Code Online (Sandbox Code Playgroud)
我的客户从DB获得200K的投入,并与我们的BoundedThreadPool(只创建,让说,20个线程)处理它.每个输入都使用不同的线程处理.每个线程执行MyMethod并在MyMethod结果的末尾添加bulkManager.
public void MyMethod(string input)
{
var res = ProcessInput(input);
bulkManager.Add(res);
}
Run Code Online (Sandbox Code Playgroud)
当bulkManager累积N个项目(= bulk)时,它将批量传递给另一个线程,它所做的就是使用以下两种方法之一将该批量入队:
wcfQueueService.Send(bulk);new MessageQueue(@".\private$\q").Send(new Message {Body = bulk}); …