在python中将对象转换为字符串时,我看到了两种不同的习语:
A: mystring = str(obj)
B: mystring = "%s" % obj
这两者有区别吗?(阅读Python文档,我怀疑没有,因为后一种情况会隐式调用str(obj)转换obj为字符串.
如果是,我什么时候应该使用哪个?
如果不是,在"好"的python代码中我应该选择哪一个?(从蟒蛇哲学"显式过度隐含",A会被认为是更好的吗?)
我偶然发现了代码中的一个现象,可以归结为:
我有一个OSGi声明服务,提供了两个配置如下的服务接口:
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="dispose" enabled="true" name="redacted.redactedstore">
<implementation class="redacted.RedactedStore"/>
<service>
<provide interface="redacted.IRedactedStore"/>
<provide interface="redacted.IRedactedStoreControl"/>
</service>
</scr:component>
Run Code Online (Sandbox Code Playgroud)
在我的代码中,我有两个不同的线程,它们都打开a ServiceTracker来获取服务实例,但是通过不同的接口:
tracker = new ServiceTracker<>(getBundle().getBundleContext(), <serviceClass>.class, null);
tracker.open();
tracker.waitForService(1000l);
Run Code Online (Sandbox Code Playgroud)
因此,一个线程IRedactedStore用作服务类,另一个线程IRedactedStoreControl用作服务接口。
因此,似乎发生的事情是,当两个线程在正确的时间并行运行时,Equinox SCR不会实例化一个(如我期望的那样),而是实例化组件实现类的两个实例。
这种行为正确吗?还是这是OSGi的Equinox实现中的错误?
如果行为正确,那么我可以在代码中做一些事情来通过另一种方式配置服务来防止这种情况吗?(当然,我可以重组服务,以便它仅提供一个接口,或者可以同步服务跟踪器...)
我有一个架构问题,关于如何在Java/Java EE中处理事务性和可伸缩性的大任务.
一般的挑战
我有一个Web应用程序(Tomcat现在,但不应该限制解决方案空间,所以只需要用它来说明我想要实现的目标).这个Web应用程序分布在几个(虚拟和物理)节点上,连接到中央DBMS(在这种情况下是MySQL,但同样,这不应该限制解决方案......)并且能够处理大约1000个用户,服务页面,正如你对平均基于网络的信息系统所期望的那样.
现在,有一些任务影响了大部分数据,系统应该进行优化,以便合理地快速执行这些任务.(比顺序处理所有内容更快,即).所以我将任务并行并将其分布在几个(或所有)节点上:

(注意:处理的数据部分是独立的,因此这里没有数据库或锁定冲突).
问题是,我希望(整个)任务是事务性的.因此,如果其中一个并行子任务失败,我希望将所有其他任务作为结果回滚.否则,从域的角度来看,系统将处于可能不一致的状态.
目前的实施
正如我所说,当前的实现使用Tomcat和MySQL.节点使用JMS进行通信(因此有一个JMS服务器,调度程序为每个子任务发送消息;执行程序从消息队列中获取任务,执行它们,并将结果发布到调度程序收集的结果队列中.调度程序阻塞并等待所有结果进入,如果一切正常,它将以OK状态终止.
这里的问题是所有执行程序都有自己的本地事务上下文,因此图片看起来像这样:

如果由于某种原因,其中一个子任务失败,则回滚本地事务并且调度程序获得错误结果.(这里有一些故障保护机制,它试图重复失败的事务,但我们假设由于某种原因,一个任务无法完成).问题是系统现在处于一个状态,其中除了一个之外的所有事务都已提交并完成.而且因为我不能让最后一笔交易成功完成,所以我无法摆脱这种状态.
可能的解决方案
这些是我到目前为止所遵循的想法:
我自己可以以某种方式实现特定于域的回滚机制.因为分发器知道已经执行了哪些任务,所以它可以显式地恢复效果(例如,在某处存储旧值并将已提交的值恢复回先前的值).当然,在这种情况下,我必须保证其他进程之间不会发生任何变化,所以只要大型操作正在运行,我还必须将系统设置为只读状态.或多或少,我需要模拟业务逻辑中的事务...
我可以选择不在一个大事务中并行化并在单个节点上执行所有操作(但正如开头所述,我需要加快处理速度,因此这不是一个选项......)
我试图了解一般的XATransactions或分布式事务,但这似乎是一个高级的Java EE功能,它没有在所有Java EE服务器中实现,并且不能真正解决这个基本问题,因为似乎没有是一种在异步调用中将事务上下文传递到远程节点的方法.(例如,EJB规范3.1的 4.5.3部分:"客户端事务上下文不会通过异步方法调用进行传播.从Bean Developer的视图来看,永远不会有来自客户端的事务上下文.")
问题
我忽略了什么吗?是不是可以在多个节点上异步分发任务,同时具有可以作为整体回滚的(共享)事务状态?
感谢任何指示,提示,命题......
java parallel-processing transactions distributed-transactions java-ee
问题:
给定两个Collection<?>s,检查两者是否包含相同的元素.
解决方案1:
boolean equals = c1.containsAll(c2) && c2.containsAll(c1);
Run Code Online (Sandbox Code Playgroud)
解决方案2:
boolean equals = new HashSet<?>(c1).equals(new HashSet<?>(c2));
Run Code Online (Sandbox Code Playgroud)
我认为解决方案2比解决方案1(O(n ^ 2))更有效(O(n )).
我纠正还是错过了什么?
我想对 NatTable 内容进行简单的 UI 测试(即不使用 SWTBot 或其他 UI 测试框架)。
我的方法是创建一个 shell,添加我的自定义NatTable,然后访问单元格并检查其内容(数据值、配置标签等):
// Note: this is Xtend code
@Before
def void setup()
{
shell = new Shell(Display.getCurrent)
shell.layout = new FillLayout
parent = new Composite(shell, SWT.NONE)
parent.layout = new GridLayout
fixture = new MyNatTableViewer(parent) // this is my custom nattable impl under test
shell.pack
shell.visible = true
}
@Test
def void testLabel()
{
assertCellLabel(2, 2, "test-label");
}
def assertCellLabel(int row, int col, String expected)
{
val labels = parameterTable.getCellByPosition(col, …Run Code Online (Sandbox Code Playgroud) 我需要项目文件夹的绝对位置,所以我试过了
project.getRawLocation()
Run Code Online (Sandbox Code Playgroud)
但这会返回null(至少在我的情况下,我使用导入手动导入项目...现有项目进入工作区,我已经选中了将项目复制到工作区复选框).
事情就是这样
project.getParent().getRawLocation()
Run Code Online (Sandbox Code Playgroud)
返回/work/Projekte/runtime-MyProduct.product哪个是正确的
和
project.members()[0].getRawLocation()
Run Code Online (Sandbox Code Playgroud)
返回/work/Projekte/runtime-MyProduct.product/Test/.cproject也是正确的.
因此,我希望如此
project.getRawLocation()
Run Code Online (Sandbox Code Playgroud)
会回来/work/Projekte/runtime-MyProduct.product/Test,但它会回来null.
谁能解释和/或告诉我哪里错了?
我尝试开始对中型Xtext项目进行单元测试。
生成器当前依赖于一些我想在测试中模拟的外部资源。因此,我将所需的对象通过@Inject注入Generator类。
例如在伪代码中:
class MyGenerator implements IGenerator{
@Inject
ExternalResourceInterface resourceInterface;
...
}
Run Code Online (Sandbox Code Playgroud)
我在语言RuntimeModule中创建了实际的绑定:
class MyRuntimeModule{
...
@Override
public void configure(Binder binder) {
super.configure(binder);
binder.bind(ExternalResourceInterface .class).to(ExternalResourceProductionAcess.class);
}
...
}
Run Code Online (Sandbox Code Playgroud)
这对于生产环境而言效果很好。
但是,在生成器测试用例中,我想用我CompilationTestHelper的模拟版本替换绑定,以便对的以下调用使用模拟:
compiler.assertCompilesTo(dsl, expectedJava);
Run Code Online (Sandbox Code Playgroud)
题:
我在哪里告诉guice / Xtext将注入绑定到模拟对象?
在Eclipse(3.x)中,您可以使用Plug-in Spy和Menu Selection Spy来查找有关可通过鼠标访问的UI元素的信息.
我现在面临的问题是我想了解一下由某个键绑定触发的命令(我需要命令id),因为我想在我的自定义UI(视图/编辑器)中为该命令创建一个菜单项)).
在我的具体情况下,我正在寻找由Numpad + Plus在一个通用导航器中触发的Expand All children命令.但是,我对找到关键绑定的一般方法感兴趣.
我知道我可以通过首选项对话框或键绑定QuickView(Windows中的CTRL + SHIFT + L)访问键绑定; 但在那里,我只能找到命令名称,而不是ID或命令的贡献插件.
java ×4
eclipse ×3
eclipse-rcp ×3
junit ×2
collections ×1
dsl ×1
equinox ×1
guice ×1
java-ee ×1
nattable ×1
osgi ×1
performance ×1
python ×1
python-2.7 ×1
swt ×1
transactions ×1
xtext ×1