背景: 我们当前的系统涉及两个服务(一个用Java编写,另一个用PHP编写),它们使用HTTP回调相互通信.我们希望使用ActiveMQ(或其他,如果需要)从HTTP回调迁移到基于消息的体系结构.我们可能会使用STOMP在它们之间进行通信.最终,PHP服务将用Java重写,但这不是该项目的一部分.
问题: ActiveMQ系统如何通知PHP已将新消息发布到PHP系统订阅的队列?在当前系统中,回调固有地调用PHP并触发它.这消失了基于消息的架构.
可能的解决方案:
我正在做一个常见的设计模式吗?如果是这样,那叫什么名字?
我有一个复杂的对象,其中包含字符串和字符串列表等"简单"字段以及其他复杂对象.我想将此对象的实例添加到JMS消息队列,这意味着它们必须是Serializable.我不想制作整个对象图Serializable,所以我选择制作"Descriptor"对象,其中包含构建复杂对象的必要信息和可以创建对象的"Builder"对象.现在,我序列化"Descriptor"对象并将其添加到队列中.当对象出列时,它使用"Builder"构建到一个完整的对象中.
需要注意的重要一点是,对象是在其他系统上运行的作业.消息队列是一种方式,序列化仅发生在作业生命周期的开始.
这可能是有争议的,但我刚刚意识到我很少使用等待并直接通知.相反,我使用包中的一些更高级别的构造java.util.concurrent.是否存在等待和通知是唯一解决方案的用例,还是应该仅在构建更高级别的构造时使用它们?
问题
我有一个单一的应用程序,UICollectionView第一次滚动它时会出现口吃.我已经将源缩小到新单元(2)被创建(使用initWithFrame:)的事实,因为没有单元可以重复使用.在初始滚动之后,重用队列不为空,并且可以重复使用单元格,并且没有卡顿.
哈克
所以我已经能够借助iOS运行时头中的私有方法解决问题:
- (void)_reuseCell:(id)arg1;
Run Code Online (Sandbox Code Playgroud)
我的假设是,这是将单元格添加回重用队列的位置.使用这个未记录的方法的黑客看起来像这样:
int prefillCellCount = 10;
NSMutableArray *cells = [[NSMutableArray alloc] initWithCapacity:prefillCellCount];
for (int i=0; i<10prefillCellCount i++) {
UICollectionViewCell *cell = [self.gridView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:[NSIndexPath indexPathForRow:i inSection:0]];
[cells addObject:cell];
}
for (UICollectionViewCell *cell in cells) {
[self.gridView _reuseCell:cell];
}
Run Code Online (Sandbox Code Playgroud)
黑客工作!滚动时没有口吃.
问题
我不认为我能够通过这个黑客攻击App Store评论员.有没有办法在不使用未记录的方法的情况下做到这一点?如果没有,我唯一的办法就是混淆黑客攻击?
这是我所拥有的类的简化:
trait RequiredThings {
val requiredThings: Seq[String]
}
class SimpleCalculator with RequiredThings {
val requiredThings = List("a", "b")
}
class ComplicatedCalculator extends SimpleCalculator with RequiredThings {
self: SimpleCalculator =>
override val requiredThings:List[String] = List("c") ::: self.requiredThings
}
Run Code Online (Sandbox Code Playgroud)
在这个版本中,我使用的是自我类型的注释,但我不是完全肯定的,这是要走的路.我想我可以通过转换requiredThings为一个方法来让它工作,但我想尝试它作为一个领域.
最终解决方案
trait RequiredThings {
def requiredThings: Seq[String]
}
class SimpleCalculator with RequiredThings {
def requiredThings = List("a", "b")
}
class ComplicatedCalculator extends SimpleCalculator with RequiredThings {
override def requiredThings:List[String] = List("c") ::: super.requiredThings
}
Run Code Online (Sandbox Code Playgroud) 我将Java中的MapMessages发送到ActiveMQ并使用PHP中的Stomp检索它们.我的消息创建代码如下所示:
MapMessage message = session.createMapMessage();
message.setInt("id", 42);
message.setInt("status", 42);
message.setString("result", "aString");
Run Code Online (Sandbox Code Playgroud)
当我在PHP中检索它们时,创建的数组如下所示:
Array (
[map] => Array (
[0] => Array (
[entry] => Array (
[0] => Array (
[string] => id
[int] => 42
)
[1] => Array (
[string] => status
[int] => 42
)
[2] => Array (
[string] => Array (
[0] => result
[1] => aString
)
)
)
)
)
)
Run Code Online (Sandbox Code Playgroud)
我该怎么办呢?有没有办法说服Stomp以合理的方式反序化它,还是有一些PHP咒语让访问这个数组不那么痛苦?特别是,我不能只是迭代条目并构建一个关联数组,因为如果有一个字符串&int而不是两个字符串,那么数组看起来完全不同.
我想测试当发生“对等方重置连接”错误时我们的应用程序(嵌入式 ftp 服务器)中发生的日志记录。这篇文章很好地解释了错误的根源,但没有真正解释如何导致错误。有谁知道如何触发 TCP 连接的此错误?
我正在使用acts_as_taggable_on插件为我的Framework模型提供标记.我已经获得了Rails生成的功能测试,以及它使用的灯具,我想扩展它们以添加一些标签,以便我可以通过标签等来测试搜索.
我是否必须为taggings和tag表创建灯具并在功能测试的顶部加载它们?如果是这样,我该怎么做?我没有理解这里描述的关系的语法.Framework在测试搜索行为之前,另一种方法是获取实例并将标记添加到其中吗?或者,如果我这样做,Rails的神会让我失望吗?
在使用gradle构建时,是否可以使用仅用于测试的Application子类?我在Gradle构建系统之前已经做过类似的事情了,但我现在找不到办法.问题似乎是不可能自定义AndroidManifest.xml用于仪器测试APK.
我用Mortar + Flow构建我的应用程序.我正在试图找出显示弹出窗口的正确方法,该弹出窗口请求用户提供一些文本.我创建了这个弹出类:
public class SavedPageTitleInputPopup implements Popup<SavedPageTitleInput, Optional<String>> {
private final Context context;
private AlertDialog dialog;
public SavedPageTitleInputPopup(Context context) {
this.context = context;
}
@Override public Context getContext() {
return context;
}
@Override
public void show(final SavedPageTitleInput info, boolean withFlourish,
final PopupPresenter<SavedPageTitleInput, Optional<String>> presenter) {
if (dialog != null) throw new IllegalStateException("Already showing, can't show " + info);
final EditText input = new EditText(context);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT);
input.setLayoutParams(lp);
input.setText(info.savedPage.getName());
dialog = new AlertDialog.Builder(context).setTitle(info.title)
.setView(input) …Run Code Online (Sandbox Code Playgroud) java ×5
android ×2
php ×2
stomp ×2
testing ×2
concurrency ×1
fixtures ×1
ftp ×1
ios ×1
json ×1
mortar ×1
objective-c ×1
performance ×1
scala ×1
square-flow ×1
tcp ×1