我一直在研究各种通信技术/体系结构/模式/实现(阅读:流行语),包括Web服务(WCF,Axis2),ESB,SOA,并希望了解有关消息传递的JMS.
从概念上讲,JMS听起来很简单.我的看法是它是一个中间代理,管理来自发布者的消息并将它们路由到适当的订阅者.这是通过在发布消息时对消息进行排队,并在收到消息时将它们出列来完成的.
问题1:我对JMS的基本理解是否正确?
在阅读有关技术时,让我烦恼的一件事就是当某个特征(有意或无意)挥手时.
根据我的基本理解,必须运行JMS提供程序才能发送或接收消息.我对发布的假设是JMS提供程序只是等待消息发布,然后将其存储在队列中(内存或数据库支持,具体取决于实现).但是,我不太确定接收是如何工作的.
问题2:如果没有消息可以接收(通常)阻止?
问题2b:如果是这样,阻塞是如何实现的?客户端是否不断轮询消息?在发布消息之前,服务器是否只是不响应(如何在没有超时的情况下工作?)提供者是否会向接收者发起呼叫?
问题2c:如果没有,如何确保及时收到消息,而不影响性能?
基本描述似乎倾向于单个JMS提供程序,以确保集中管理消息而不会丢失.我可以看到缩放是一个问题.
问题3:JMS如何扩展?
在扩展时,我可以看到存在复杂性以确保将单个消息传递给所有适当的订户,而不管哪个物理服务器接收到该消息.
问题3b:JMS实施如何确保在规模化环境中可靠交付?
请注意,虽然这些问题与JMS有关,但它们可能适用于任何消息传递基础结构.我欢迎特定于JMS的答案以及那些更通用或甚至特定于其他技术的答案.
关于如何在Oracle和SQL Server中实现类似队列的表(锁定特定行,选择一定数量的行,以及跳过当前锁定的行),有几个 问题.
N假设至少有N行符合条件,我怎样才能保证检索到某些number()行?
从我所看到的,Oracle WHERE在确定要跳过哪些行之前应用谓词.这意味着如果我想从表中拉出一行,并且两个线程同时执行相同的SQL,则一个将接收该行,另一个将接收一个空结果集(即使有更多符合条件的行).
这违背了SQL Server如何显示处理UPDLOCK,ROWLOCK并READPAST锁定提示.在SQL Server中,TOP神奇地似乎限制了成功获得锁定后的记录数.
ORACLE
CREATE TABLE QueueTest (
ID NUMBER(10) NOT NULL,
Locked NUMBER(1) NULL,
Priority NUMBER(10) NOT NULL
);
ALTER TABLE QueueTest ADD CONSTRAINT PK_QueueTest PRIMARY KEY (ID);
CREATE INDEX IX_QueuePriority ON QueueTest(Priority);
INSERT INTO QueueTest (ID, Locked, Priority) VALUES (1, NULL, 4);
INSERT INTO QueueTest (ID, Locked, Priority) VALUES (2, NULL, …Run Code Online (Sandbox Code Playgroud) 关于如何允许自托管WCF应用程序使用Basic.SttpBinding与HTTP.SYS而不需要管理权限,有几个 问题.它归结为需要向URL授予权限(从管理上下文),然后用户可以在指定的URL上托管任何内容.
netsh http add urlacl url = http:// +:80/MyService
我希望能够查询和添加注册的URL,而无需解析"netsh"或"httpconfig"命令行工具的命令行输出.
是否有可以调用此功能的公共Win32或.NET API?
我正在两个分支之间进行合并,TFS/Visual Studio 2013正在识别需要合并的1800个文件.然而,在两个分支之间进行差异表明只有~100个实际上是不同的.
挂起的更改窗口主要证实了这一点,因为所有文件都以[merge]状态列出,但实际更改的除外; 那些有[合并,编辑]状态.
有没有办法过滤挂起的更改列表,只显示真正更改的文件,以便我可以直观地检查差异?它非常容易出错,必须滚动并手动执行此操作,跳过仅显示[merge]的项目.
我目前的替代方案是在分支上执行差异,并特别在待定更改窗口中查找被识别为不同的文件,但这对于应该简单的事情来说相当麻烦.
编辑:以下是待定更改窗口的屏幕截图.我只关心[合并,编辑]的项目,因为它意味着有一个变化,我想看到差异.冲突将显示在"解决冲突"窗口中.我不关心[merge]项目,因为它们是相同的.有1000个文件没有变化,但我想挑出已经改变的文件并检查差异.

我们最近开始使用Team Foundation Server 2012,并使用代码审查功能让其他开发人员审核代码更改.它看起来很棒; 但是,作为项目负责人,我希望能够看到给定的变更集已被其他人审核.
例如,假设开发人员Bob进行更改并请求对这些更改进行审核.这将为更改生成搁置集,并为请求的审阅创建代码审查工作项.开发人员Alice审核更改,发表一些评论并完成审核.Bob在变更集中加入了Alice的建议和检查.
作为项目负责人,我搜索变更集并查看Bob检查变更集123.如果我查看此变更集,则有一个与Bob正在处理的任务相关联的工作项,但没有迹象表明变更集已由其他任何人审核.
如果我查看代码审查工作项,我可以找到已经审核过的内容并查看评论.这很麻烦,因为我必须筛选工作项并找到恰好相关的工作项.
如何从给定的变更集中判断它已被审核,以及查看评论评论?
我正在构建一个phonegap插件,需要在PhoneGap提供的WebView上呈现本机UI视图.在iOS中,这非常简单,只需创建视图并将其添加到PhoneGap的webView的scrollView中.这将在webView上呈现控件并允许它与HTML内容一起滚动(请注意,此示例使用UIButton,但我将其应用于自定义UI控件):
-(void)createNativeControl:(CDVInvokedUrlCommand *)command
{
NSDictionary* options = [command.arguments objectAtIndex:0];
NSNumber* x = [options objectForKey:@"x"];
NSNumber* y = [options objectForKey:@"y"];
NSNumber* width = [options objectForKey:@"width"];
NSNumber* height = [options objectForKey:@"height"];
CGRect rect = CGRectMake([x floatValue], [y floatValue], [width floatValue], [height floatValue]);
self._nativeControl = [UIButton buttonWithType:UIButtonTypeSystem];
self._nativeControl.frame = rect;
[self._nativeControl addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
[self._nativeControl setTitle:@"Click me" forState:UIControlStateNormal];
[self.webView.scrollView addSubview:self._nativeControl];
CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
[self.commandDelegate sendPluginResult:result callbackId:command.callbackID];
}
Run Code Online (Sandbox Code Playgroud)
我尝试过在Android中大致相同的东西,但没有成功.这是我最近的尝试:
@Override
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
System.out.println(String.format("%s …Run Code Online (Sandbox Code Playgroud) 我正在编写一个需要托管多个WCF服务的应用程序.WCF的优势之一是能够通过在app.config文件中指定设置来配置服务而无需重新编译.
在自托管时,似乎没有一种开箱即用的方式来自动托管app.config文件中的服务.我发现这个问题提到了一个可能的解决方案,即在运行时动态枚举app.config中列出的服务,并为每个服务创建一个ServiceHost.
但是,我的服务,合同和托管应用程序都在不同的程序集中.这导致Type.GetType(string name)无法找到我的服务类型(返回null),因为它是在不同的程序集中定义的.
如何可靠地托管app.config文件中列出的所有服务(即,new ServiceHost(typeof(MyService))在我的自托管应用程序中没有硬编码?
注意:我的app.config是使用Visual Studio 2010中的"WCF配置编辑器"生成的.
另请注意:我的主要目标是由app.config文件驱动,因此只有一个配置点.我不想在一个单独的位置配置它.
编辑:我能够读取app.config文件(请参阅此处),但需要能够解析不同程序集中的类型.
编辑:下面的答案之一促使我尝试在app.config中指定AssemblyQualifiedName而不仅仅是基本类型名称.这能够解决Type.GetType()问题,但无论我如何获得类型,ServiceHost.Open()现在都失败了InvalidOperationException:
// Fails
string typeName = typeof(MyService).AssemblyQualifiedName;
Type myType = Type.GetType(typeName);
ServiceHost host = new ServiceHost(myType);
host.Open(); // throws InvalidOperationException
// Also fails
Type myType2 = typeof(MyService);
ServiceHost host2 = new ServiceHost(myType2);
host2.Open(); // throws InvalidOperationException
Run Code Online (Sandbox Code Playgroud)
例外细节:
Service 'SO.Example.MyService' has zero application (non-infrastructure) endpoints. This might be because no configuration file …
我发现很少有关于如何正确使用Dispatcher类的信息.
目前我使用它类似于这个问题,但有一个固有的竞争条件,我没有看到任何地方提到.
假设您使用以下代码启动调度程序线程:
Thread thread = new Thread(Dispatcher.Run);
thread.Start();
Run Code Online (Sandbox Code Playgroud)
并尝试以后使用它:
Dispatcher.FromThread(thread).Invoke(MyMethodDelegate);
Run Code Online (Sandbox Code Playgroud)
这通常会抛出NullReferenceException,因为Dispatcher.FromThread调用可能会返回null,因为无法保证已调用Dispatcher.Run.
我为实现这一点而做的是使用一个信号来确保调度程序在继续在主线程上使用之前运行.
WCF和配置上有许多可用的资源(程序化和通过app.config).但是,我没有看到关于此配置的实际管理的良好资源,特别是在生产环境中.
WCF功能强大,因为框架允许通过app.config文件进行配置,因此您可以调整各种设置,而无需重新编译代码.
安装WCF客户端时,如何轻松配置客户端以指向正确的服务器? 这可能是我在安装后可以考虑配置的最常见的事情.对于某些上下文,假设我发运的产品包含服务器组件和客户端组件.客户可以在任何地方安装.虽然xml文件对于开发后配置非常强大,但它根本不是用户友好的.鉴于配置文件中可能有几十个端点,管理员或最终用户是否必须手动更改所有端点?我知道我可以通过编程方式完成所有工作,但后来我基本上正在重新实现所有开箱即用的管道.
上面的问题,更通用的是:如何通过一些基本UI简化WCF配置,而无需重新实现框架提供的内容?
除了源注释之外,我找不到card.io的文档.
CardIOCreditCardInfo.h文件具有CardIOCreditCardType的枚举.
typedef NS_ENUM(NSInteger, CardIOCreditCardType) {
/// Deprecated.
/// @see CardIOCreditCardTypeUnrecognized, CardIOCreditCardTypeAmbiguous
CardIOCreditCardTypeUnknown __attribute__((deprecated("Use CardIOCreditCardTypeUnrecognized or CardIOCreditCardTypeAmbiguous instead."))) = 0,
/// The card number does not correspond to any recognizable card type.
CardIOCreditCardTypeUnrecognized = 0,
/// The card number corresponds to multiple card types (e.g., when only a few digits have been entered).
CardIOCreditCardTypeAmbiguous = 1,
/// American Express
CardIOCreditCardTypeAmex = '3',
/// Japan Credit Bureau
CardIOCreditCardTypeJCB = 'J',
/// VISA
CardIOCreditCardTypeVisa = '4',
/// MasterCard
CardIOCreditCardTypeMastercard = '5',
/// …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用WebHttpBinding托管基本Web内容(HTML,javascript,json)的服务,并且管理员参与最少.
到目前为止,我已经成功,唯一需要的管理员权限是在安装时(注册服务帐户的http预留并自行创建服务).但是,现在我遇到了SSL的问题.理想情况下,我想支持Windows证书库外的证书.我发现这篇文章 - http://www.codeproject.com/KB/WCF/wcfcertificates.aspx - 这似乎表明您可以在服务主机上指定证书,但是在运行时将浏览器导航到https:// localhost/Dev/MyService产生404.
[ServiceContract]
public interface IWhoAmIService
{
[OperationContract]
[WebInvoke(
Method = "GET",
UriTemplate = "/")]
Stream WhoAmI();
}
public class WhoAmIService : IWhoAmIService
{
public Stream WhoAmI()
{
string html = "<html><head><title>Hello, world!</title></head><body><p>Hello from {0}</p></body></html>";
html = string.Format(html, WindowsIdentity.GetCurrent().Name);
WebOperationContext.Current.OutgoingResponse.ContentType = "text/html";
return new MemoryStream(Encoding.UTF8.GetBytes(html));
}
}
static void Main(string[] args)
{
ServiceHost host = new ServiceHost(typeof(WhoAmIService), new Uri("https://localhost:443/Dev/WhoAmI"));
host.Credentials.ServiceCertificate.Certificate = new X509Certificate2(@"D:\dev\Server.pfx", "private");
WebHttpBehavior behvior = new WebHttpBehavior();
behvior.DefaultBodyStyle = WebMessageBodyStyle.Bare;
behvior.DefaultOutgoingResponseFormat …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用jax-ws来生成Web服务代理类,使用wsimport ant任务,类似于这个问题,使用以下后续问题:
据我了解,更新版本的JDK 1.6包括jax-ws,而WsImport ant任务在JDK的tools.jar文件中定义.
为什么蚂蚁不会自动找到这个?
为什么eclipse也不会自动找到这个?
我发现使用JAX-WS与JDK 6几的引用,但这些似乎是基于复制单独下载JAX-WS库,并将其拖放到JDK ext文件夹(我假设不再需要因为它实际上是现在与JDK捆绑在一起).
将wsimport任务与已包含jax-ws的JDK 1.6版本一起使用的正确方法是什么?
我的构建XML:
<?xml version="1.0" encoding="UTF-8"?>
<project name="wsproxy">
<taskdef name="wsimport" classname="com.sun.tools.ws.ant.WsImport" />
<target name="wsgentest">
<wsimport
wsdl="http://localhost/Service?wsdl"
destdir="bin-gen"
sourcedestdir="src-gen"
keep="true"
verbose="true"
package="com.ws">
</wsimport>
</target>
</project>
Run Code Online (Sandbox Code Playgroud) 我有一段相当简单的代码,可以从DB中检索对象.这似乎适用于SQL Server 2008,但随着SQL Server Compact的爆发.SQL Server CE支持TOP() - 这只是NHibernate 3中的一个错误吗?
码:
public override Profile GetProfileByName(string name)
{
using (var tc = TC)
{
var query = from profiles in tc.Session.Query<Profile>()
where profiles.Name == name
select profiles;
Profile profile = query.FirstOrDefault();
tc.Commit();
return profile;
}
}
Run Code Online (Sandbox Code Playgroud)
NHibernate配置:
<property name="dialect">NHibernate.Dialect.MsSqlCeDialect</property>
<property name="connection.driver_class">NHibernate.Driver.SqlServerCeDriver</property>
Run Code Online (Sandbox Code Playgroud)
例外:
System.NotSupportedException occurred
Message=Dialect does not support limits.
Source=NHibernate
StackTrace:
at NHibernate.Dialect.Dialect.GetLimitString(SqlString queryString, Nullable`1 offset, Nullable`1 limit, Parameter offsetParameter, Parameter limitParameter)
InnerException:
Run Code Online (Sandbox Code Playgroud) wcf ×4
c# ×2
java ×2
tfs ×2
.net ×1
android ×1
ant ×1
app-config ×1
card.io ×1
cordova ×1
credit-card ×1
dispatcher ×1
httpcfg.exe ×1
https ×1
jax-ws ×1
jms ×1
linq ×1
merge ×1
messaging ×1
netsh ×1
nhibernate ×1
oracle ×1
queue ×1
self-hosting ×1
sql ×1
sql-server ×1
ssl ×1
tfs2012 ×1
wcf-hosting ×1
web-services ×1
wsimport ×1