我昨天和我的一个朋友一起去了酒吧,我们开始讨论他在他工作的公司使用的架构.这个对话基本上围绕着共享数据库架构与分布式独立应用程序架构的优缺点 - 我们无法达成共识,在这种情况下,我想听听人们对这两种方法的优缺点的看法.
基本上,他所工作的公司拥有一个拥有许多不同应用程序的大型架构.某些应用程序具有单个数据库,它们在它们之间共享.例如,有一个应用程序为用户提供UI以更改参考数据.该参考数据由另一个也访问相同数据的应用程序使用.我相信代码实际上是作为共享库编写的(即两个应用程序都将使用为每个代码集重新部署的公共代码集(一个将其作为依赖项)).
还有其他应用程序与数据库,其他应用程序也使用直接JDBC连接与数据访问代码(两个应用程序之间不常见 - 重复!!呃!).
我的问题是围绕这个架构的优缺点而不是一个架构,其中每个应用程序都包含它在筒仓中的"主"数据.如果应用程序x需要来自应用程序的数据,则他们使用Web服务或某些消息传递技术来接收该数据.
消息传递方法将引入一个问题,即当前现在必须从另一个源获取在其他应用程序的数据库中使用的参考数据"代码"(或外键).在当前的体系结构中,这些体系的"解码"可以随时更改并立即反映在外部应用程序中,而不必具有复制数据的主/从关系 - 或者应用程序x必须查询应用程序的替代方案y只是为了显示解码值.
我曾阅读过企业集成模式,虽然它确实提供了一些消息传递优势的例子 - 但我并不那么信服.
谢谢伊恩
我想在我的iPhone上构建一个连接到我的覆盆子Pi的应用程序.因为它们将非常接近(彼此相邻),所以我想使用有线连接(USB端口的闪电端口)进行通信.这是可能的还是我必须使用无线技术?我的假设是有线会更好,因为它确保连接并且会更快,但是,我愿意纠正.
这与我想在iphone上访问覆盆子pi传感器的业余爱好者项目有关.传感器(和Pi)将位于iphone旁边.我正在构建一个定制奇怪的案例来组合它们.
任何想法都非常感激.
谢谢伊恩
我一直试图了解是否有可能创建一个方法,根据返回类推断泛型类型,并调用该泛型类型的静态方法.
即在下面我创建了两个类,它们都实现了getInstances和getAllInstances方法.然后我尝试创建使用通用包装器中的方法.似乎无论返回类型如何,始终都会运行超类方法.
例如,
public class ParentClass {
public ParentClass(){}
public static <T extends ParentClass> T getInstance(){
return (T) new ParentClass();
}
public static <T extends ParentClass> List<T> getAllInstances(){
ArrayList<ParentClass> parents = new ArrayList<ParentClass>();
for(int i=0;i<5;i++){
parents.add(new ParentClass());
}
return (List<T>) parents;
}
}
Run Code Online (Sandbox Code Playgroud)
SubclassA
public class SubclassA extends ParentClass{
public SubclassA(){}
@SuppressWarnings("unchecked")
public static SubclassA getInstance(){
return new SubclassA();
}
@SuppressWarnings("unchecked")
public static List<SubclassA> getAllInstances(){
ArrayList<SubclassA> parents = new ArrayList<SubclassA>();
for(int i=0;i<5;i++){
parents.add(new SubclassA());
}
return parents;
}
}
Run Code Online (Sandbox Code Playgroud)
包装 …
我试图在我的bash脚本中模式匹配,但由于某种原因BASH_REMATCH var没有设置我的组.
代码如下:
if [[ "SYSENV01" =~ ^(SYS)(ENV)(01)$ ]]; then
echo ${BASH_REMATCH[0]}
echo ${BASH_REMATCH[1]}
echo ${BASH_REMATCH[2]}
fi
Run Code Online (Sandbox Code Playgroud)
奇怪的是,这会打印出SYSENV01然后将2条空行打印到命令行 - 所以它必须匹配; 但是,小组没有出现.
有任何想法吗?这让我圈了很多年.
我试图使用Mule中的DataMapper变换将第三方调用的响应映射到不同的结构.
从第三方开始,我们收到一系列项目(以及其他内容),我想将数组中的单个项目映射到对象(JSON).我收到请求中项目的标识符,该标识符可用作输入参数.
我的问题是,如何根据标识符映射项目的字段?
示例XML响应
<account>
<accountNumber>1234567</accountNumber>
<books>
<book>
<id>1</id>
<title>Sample title1</title>
<availableFrom>21-03-16</availableFrom>
</book>
<book>
<id>2</id>
<title>Sample title2</title>
<availableFrom>21-03-16</availableFrom>
</book>
<book>
<id>3</id>
<title>Sample title3</title>
<availableFrom>21-03-16</availableFrom>
</book>
</books>
</account>
Run Code Online (Sandbox Code Playgroud)
需要成为:
{
"person": {
"accountNumber": 1234567,
"selectedBook": {
"id": 1,
"title": "Sample title1"
},
"otherBooks": [
{
"id": 2,
"title": "Sample title2"
},
{
"id": 3,
"title": "Sample title3"
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
所选书籍的ID保存在inputArgument.bookId.
我可以使用xpath规则为每个字段完成映射,但是,我必须在xpath中对bookId进行硬编码.相反,我需要能够将实际的id替换为所提供的id(并且在inputArgument中可用).
标题的xpath
/account/books/book[child::id=1]/title
Run Code Online (Sandbox Code Playgroud)
我已经尝试添加MEL来替换id和各种其他修复,但似乎没有任何工作.有没有办法替换bookId字段.
注意:由于客户端的限制,我无法使用DataWeave.
我试图限制使用 Jackson JSONViews 反序列化 JSON 对象的哪些属性。目的是使用它来防止我的 API 的使用者提交他们不应该提交的数据。
问题是,我要么误解了 JSONViews,要么我做错了什么。见下文。
我开始尝试在 Spring 中执行此操作,但发现即使下面的简单测试也不起作用。
账户类别
public class Account {
@Id
private String id;
private String name;
private List<String> items;
private List<User> users;
@JsonView(AccountViews.Private.class)
public void setId(String id) {
this.id = id;
}
@JsonView(AccountViews.Public.class)
public void setName(String name) {
this.name = name;
}
@JsonView(AccountViews.Public.class)
public void setItems(List<String> items) {
this.items = items;
}
@JsonView(AccountViews.Private.class)
public void setUsers(List<User> users) {
this.users = users;
}
}
Run Code Online (Sandbox Code Playgroud)
意见
public class AccountViews {
public interface Public …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个库,该库将由在 Web 服务器等效项上运行的应用程序重用。
该库将使用 Selenium (v3.9.1),它依赖于 Guava (v23.6-jre),但是,WebServer 的类路径上也有 Guava,因此我遇到了依赖冲突。当我将我的库包含在应用程序中并运行它时,出现以下错误:
com.google.common.base.Preconditions.checkState(ZLjava/lang/String;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V (java.lang.NoSuchMethodError). (org.mule.api.MessagingException)
org.openqa.selenium.remote.service.DriverService.findExecutable(DriverService.java:124)
org.openqa.selenium.chrome.ChromeDriverService.access$000(ChromeDriverService.java:32)
org.openqa.selenium.chrome.ChromeDriverService$Builder.findDefaultExecutable(ChromeDriverService.java:137)
org.openqa.selenium.remote.service.DriverService$Builder.build(DriverService.java:339)
org.openqa.selenium.chrome.ChromeDriverService.createDefaultService(ChromeDriverService.java:88)
org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:157)
Run Code Online (Sandbox Code Playgroud)
由于我无法更改服务器本身的依赖关系,我想到使用 Maven Shading Plugin 创建一个 uber jar 并重新定位 guava 类 - 插件配置如下:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<configuration>
<artifactSet>
<includes>
<include>com.google.guava</include>
<include>org.seleniumhq.selenium</include>
</includes>
</artifactSet>
<relocations>
<relocation>
<pattern>com.google.common</pattern>
<shadedPattern>shaded.com.google.common</shadedPattern>
</relocation>
</relocations>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Run Code Online (Sandbox Code Playgroud)
所以,我相信这句话是在说:
com.google.common到shaded.com.google.common。这会生成 JAR,如果我解压它,我可以看到 google 库是阴影的。但是,当我运行该应用程序时,出现以下错误:
org.openqa.selenium.remote.service.DriverService$Builder.createArgs()Lshaded/com/google/common/collect/ImmutableList; (java.lang.AbstractMethodError).
这表明 Selenium …
我编写了一个bash脚本,它在文件上调用sed命令(以及其他内容)来完成2个不同字符串的查找/替换.
问题是,在运行脚本之后,我检查文件并且没有更新任何内容.但是,如果我运行正在生成的命令(无论如何我将它们作为输出回显),那么它们就可以工作了.
例如,我在脚本中有:
echo "/usr/local/bin/sed -i -e 's/${String1}/${String1R}/g;s/\/${String2}\//\/${String2R}\//g' ${ROOT_DIR}/data/file.sql"
/usr/local/bin/sed -i -e 's/${String1}/${String1R}/g;s/\/${String2}\//\/${TString2R}\//g' ${ROOT_DIR}/data/file.sql
Run Code Online (Sandbox Code Playgroud)
运行脚本不会更改file.sql; 但是,如果我运行打印到控制台的命令,例如/ usr/local/bin/sed -i -e's/file_name1/file_name2/g; s // path_substring1 /// path_substring2 // g'/ path/to /file/file.sql它完美无缺!