【发布时间】:2014-08-10 02:03:17
【问题描述】:
简介
我在我的 Java 项目中使用Apache Storm(本地模式,而不是远程模式),在创建拓扑时我需要将一个对象传递给其中一个螺栓
TopologyBuilder builder = new TopologyBuilder();
.....
builder.setBolt("last-bolt", new MyBolt(Classifier.SECONDS)).someGrouping(...);
.....
LocalCluster cluster = new LocalCluster();
cluster.submitTopology("test", conf, builder.createTopology());
对象本身有一些不可序列化的字段。我没有对这些字段所属的类进行子类化并使它们可序列化,而是采用了另一种方法。由于实际对象不会发生太大变化并且可以枚举,因此我决定将其设为枚举并将其传递给 Bolt 的任务。 enum 的好处是它可以不惜一切代价进行序列化。这种方法在本地模式下有效,因为(如果我正确理解 Storm)我的计算机上只有一个 JVM 运行,实际上事情不会变得复杂。
问题
如果枚举由一个静态的最终不可序列化字段组成,那么当该枚举被不同机器上的另一个进程或运行多个 JVM 的集群上的另一个进程反序列化时,该字段是否会正确构造?
实际枚举(静态final字段在末尾em>)
public enum Classifier {
SECONDS {
public String classify(String timestamp) {
DateTime dateTime = formatter.parseDateTime(timestamp);
int second = dateTime.getSecondOfMinute();
if (second <= 30) {
return "00 - 30";
} else {
return "30 - 60";
}
}
public int getNumberOfCategories() {
return 2;
}
},
WEEK {
public String classify(String timestamp) {
DateTime dateTime = formatter.parseDateTime(timestamp);
int dayOfWeek = dateTime.getDayOfWeek();
String typeOfDay = (dayOfWeek >= 1 && dayOfWeek <= 5) ? "workday" : "weekend";
int hour = dateTime.getHourOfDay();
String hourInterval = hour + " - " + (hour == 23 ? 0 : hour + 1);
return typeOfDay + " " + hourInterval;
}
public int getNumberOfCategories() {
return 48;
}
};
private static final DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
public abstract String classify(String timestamp);
public abstract int getNumberOfCategories();
}
更多详情
DateTimeFormatter 和 DateTime 来自org.joda.time 包。
【问题讨论】:
标签: java serialization static enums apache-storm